Android生成PDF文件、webview加载本地PDF或者网络PDF

来源:互联网 发布:淘宝首页图片轮播代码 编辑:程序博客网 时间:2024/06/08 16:39

生成pdf

Andrid端生成PDF局限性太差,尚未有优雅的解决方案。但网上众说纷纭,实践者少之又少,高质量的博文也是凤毛麟角,大家都是博文搬用工,也没有谁做过详细的探索。笔者就自己的一点经验做点分享。


  • 使用iText

iText不支持中文,要支持中文需要引入额外包需要添加一个额外的jar包:itext-asian.jar。亲测较好的方案直接引入再次封装过的jar包:http://download.csdn.net/detail/xuwenneng/9669969
在Android studio中不需要在引入包,把它加入即可。
实例代码(源于网络,本人亲测):
package com.dyb.createpdf;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Bundle;import android.os.Environment;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.TextView;import android.widget.Toast;import com.itextpdf.text.Document;import com.itextpdf.text.DocumentException;import com.itextpdf.text.Font;import com.itextpdf.text.Image;import com.itextpdf.text.Paragraph;import com.itextpdf.text.pdf.BaseFont;import com.itextpdf.text.pdf.PdfWriter;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;public class MainActivity extends AppCompatActivity {    private TextView mTextview;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mTextview = (TextView) findViewById(R.id.create_pdf);        mTextview.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                Document doc = new Document();                FileOutputStream fos;                try {                    fos = new FileOutputStream(new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/createLocal.pdf"));                    PdfWriter.getInstance(doc, fos);                    doc.open();                    doc.setPageCount(1);                    doc.add(new Paragraph("testpdf~~成功哩", setChineseFont()));                    myImg.setAlignment(Image.MIDDLE);                    doc.add(myImg);                    //一定要记得关闭document对象                    doc.close();                    fos.flush();                    fos.close();                    Toast.makeText(MainActivity.this, "Environment.getExternalStorageDirectory()/createLocal.pdf ", Toast.LENGTH_LONG).show();                } catch (FileNotFoundException e) {                    e.printStackTrace();                } catch (DocumentException e) {                    e.printStackTrace();                } catch (IOException e) {                    e.printStackTrace();                }            }        });    }    // 产生PDF字体    public static Font setChineseFont() {        BaseFont bf = null;        Font fontChinese = null;        try {            bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);            fontChinese = new Font(bf, 12, Font.NORMAL);        } catch (DocumentException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        return fontChinese;    }}

注意:
1.此种方案加入图片生成PDF并未成功。

  • 使用官方API中鲜为人知的api
    此种方式简单粗暴,直接把xml布局重新绘制在画布上,保存。显然处理不当你的光标也被保存了。(通俗点就是截屏)
package hu.autsoft.androidapidemos;import android.Manifest;import android.content.pm.PackageManager;import android.graphics.Point;import android.graphics.Rect;import android.graphics.pdf.PdfDocument;import android.os.Environment;import android.support.v4.app.ActivityCompat;import android.support.v4.content.ContextCompat;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Toast;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import butterknife.BindView;import butterknife.ButterKnife;import butterknife.OnClick;public class PDFCreateActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_pdfcreate);        ButterKnife.bind(this);        requestNeededPermission();    }    public void requestNeededPermission() {        if (ContextCompat.checkSelfPermission(this,                Manifest.permission.WRITE_EXTERNAL_STORAGE)                != PackageManager.PERMISSION_GRANTED) {            if (ActivityCompat.shouldShowRequestPermissionRationale(this,                    Manifest.permission.WRITE_EXTERNAL_STORAGE)) {                Toast.makeText(PDFCreateActivity.this,                        "I need it for pdf creating", Toast.LENGTH_SHORT).show();            }            ActivityCompat.requestPermissions(this,                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},                    101);        } else {            Toast.makeText(PDFCreateActivity.this,                    "WRITE_EXTERNAL_STORAGE perm granted", Toast.LENGTH_SHORT).show();        }    }    @Override    public void onRequestPermissionsResult(int requestCode,                                           String permissions[], int[] grantResults) {        switch (requestCode) {            case 101: {                // If request is cancelled, the result arrays are empty.                if (grantResults.length > 0                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {                    Toast.makeText(PDFCreateActivity.this,                            "WRITE_EXTERNAL_STORAGE perm granted", Toast.LENGTH_SHORT).show();                } else {                    Toast.makeText(PDFCreateActivity.this,                            "WRITE_EXTERNAL_STORAGE perm NOT granted", Toast.LENGTH_SHORT).show();                }                return;            }        }    }    @OnClick(R.id.btnCreatePdf)    public void createPdfClicked(View v) {        new Thread() {            public void run() {                // Get the directory for the app's private pictures directory.                final File file = new File(                        Environment.getExternalStorageDirectory(), "demo.pdf");                if (file.exists()) {                    file.delete();                }                FileOutputStream out = null;                try {                    out = new FileOutputStream(file);                    PdfDocument document = new PdfDocument();                    Point windowSize = new Point();                    getWindowManager().getDefaultDisplay().getSize(windowSize);                    PdfDocument.PageInfo pageInfo =                            new PdfDocument.PageInfo.Builder(                                    windowSize.x, windowSize.y, 1).create();                    PdfDocument.Page page = document.startPage(pageInfo);                    View content = getWindow().getDecorView();                    content.draw(page.getCanvas());                    document.finishPage(page);                    document.writeTo(out);                    document.close();                    out.flush();                    runOnUiThread(new Runnable() {                        @Override                        public void run() {                            Toast.makeText(PDFCreateActivity.this, "File created: " + file.getAbsolutePath(), Toast.LENGTH_LONG).show();                        }                    });                } catch (Exception e) {                    Log.d("TAG_PDF", "File was not created: " + e.getMessage());                } finally {                    try {                        out.close();                    } catch (IOException e) {                        e.printStackTrace();                    }                }            }        }.start();    }}

webview读取pdf

webview读取PDF也是比较恶心的,因为原生webview是不支持PDF的。此处就要借助一些磕磕巴巴第三方,同样存在很多不完善之处。本人亲测,使用了较为好的三方。

  • 本地PDF
    com.github.barteksc.pdfviewer
package com.dyb.loadpdf;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.TextView;import com.github.barteksc.pdfviewer.PDFView;import com.github.barteksc.pdfviewer.listener.OnLoadCompleteListener;import com.github.barteksc.pdfviewer.listener.OnPageChangeListener;/** * android 加载本地pdf文件 * com.github.barteksc.pdfviewer */public class MainActivity extends AppCompatActivity implements OnLoadCompleteListener, OnPageChangeListener {    private TextView mTexview, mTexviewNet;    private PDFView pdfView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mTexview = (TextView) findViewById(R.id.pdf);        mTexviewNet = (TextView) findViewById(R.id.textView_new_pdf);        pdfView = (PDFView) findViewById(R.id.pdfView);        mTexview.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                pdfView.fromAsset("sample.pdf")                        .defaultPage(0)                        .onPageChange(MainActivity.this)                        .enableAnnotationRendering(true)                        .onLoad(MainActivity.this)                        .enableSwipe(true)                        .swipeHorizontal(false)                        .load();            }        });    }    @Override    public void loadComplete(int nbPages) {    }    @Override    public void onPageChanged(int page, int pageCount) {    }}
  • 在线PDF
    com.lidong.pdf:android_pdf:1.0.1
package com.dyb.loadpdf;import android.graphics.Canvas;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import com.lidong.pdf.PDFView;import com.lidong.pdf.listener.OnDrawListener;import com.lidong.pdf.listener.OnLoadCompleteListener;import com.lidong.pdf.listener.OnPageChangeListener;public class MainActivityNet extends AppCompatActivity implements OnPageChangeListener, OnLoadCompleteListener, OnDrawListener {    private PDFView pdfViewNet;//网络    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main_net);        pdfViewNet = (PDFView) findViewById(R.id.pdfView_net_new);        displayFromFile("http://file.chmsp.com.cn/colligate/file/00100000224821.pdf", "00100000224821.pdf");    }    private void displayFromFile(String fileUrl, String fileName) {        pdfViewNet.fileFromLocalStorage(this, this, this, fileUrl, fileName);   //设置pdf文件地址    }    @Override    public void onLayerDrawn(Canvas canvas, float pageWidth, float pageHeight, int displayedPage) {    }    @Override    public void loadComplete(int nbPages) {    }    @Override    public void onPageChanged(int page, int pageCount) {    }}
原创粉丝点击