如何在安卓中从Webview创建PDF?

19

我正在 webview 中显示网页。现在如何从 webview 创建 PDF

例如:webview 加载的 URL 是 "www.google.co.in"。现在如何将此网页保存为图像并创建 PDF?

任何帮助都将不胜感激


寻找在线API还是本地API? - SilentKiller
@SilentKiller 无论谁都不重要。 - Hardik Joshi
尝试实现@Aamirkhan的代码,它将解决你的问题。 - Sagar Maiyad
1
@Prince,如果以下答案不行的话,可以试试这个在线API:http://pdfcrowd.com/html-to-pdf-api/。 - SilentKiller
3个回答

15

试试这样做

WebView内置了一个名为setPictureListener的方法,可以按照以下方式使用该方法

webView1.setPictureListener(new PictureListener() {

            public void onNewPicture(WebView view, Picture picture) {
                if (picture != null) {
                    try {
                        bmp = pictureDrawable2Bitmap(new PictureDrawable(
                                picture));

                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        });

我使用了pictureDrawable2Bitmap来获取位图,以下是相应的代码:

private static Bitmap pictureDrawable2Bitmap(PictureDrawable pictureDrawable) {
        Bitmap bitmap = Bitmap.createBitmap(
                pictureDrawable.getIntrinsicWidth(),
                pictureDrawable.getIntrinsicHeight(), Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        canvas.drawPicture(pictureDrawable.getPicture());
        return bitmap;
    }

现在您的位图已经准备好了,现在请按照下面的方式设置 webview 客户端。

webView1.setWebViewClient(new myWebClient());

这里是myWebClient

public class myWebClient extends WebViewClient {
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            // TODO Auto-generated method stub
            super.onPageStarted(view, url, favicon);
        }

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            // TODO Auto-generated method stub

            view.loadUrl(url);
            return true;

        }

        @Override
        public void onPageFinished(WebView view, String url) {
            // TODO Auto-generated method stub
            super.onPageFinished(view, url);
            Log.i("OnPageLoadFinished", url);
            img.setImageBitmap(bmp);
        }

在页面加载完成后,我设置了一个图像位图,它是您的Webview中当前加载网址的快照。

现在位图已准备好,可以使用IText库将其传递给Pdf。

以下是使用iText编写带有图像的PDF的示例,请使用下面的函数进行操作。

public void SimplePDFTable() throws Exception {

    File direct = new File(Environment.getExternalStorageDirectory()
            .getAbsolutePath() + "/AamirPDF");
    if (!direct.exists()) {
        if (direct.mkdir()) {
            Toast.makeText(MainActivity.this,
                    "Folder Is created in sd card", Toast.LENGTH_SHORT)
                    .show();
        }
    }
    String test = Environment.getExternalStorageDirectory()
            .getAbsolutePath() + "/AamirPDF";
    Document document = new Document();

    PdfWriter.getInstance(document, new FileOutputStream(test
            + "/mypdf.pdf"));

    document.open();
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
    byte[] byteArray = stream.toByteArray();
    Image image = Image.getInstance(byteArray);


    image.scaleToFit(PageSize.A4.getHeight(), PageSize.A4.getWidth());
    document.add(image);

    document.close();

}

祝你好运


@Prince WC,不客气 :) - Aamirkhan
这个"OnPictureListener"会在什么时候被调用?我的意思是指哪些行为? - Vikrant_Dev
@Prince,我该如何直接将Webview保存为PDF而无需先将其转换为图像?有没有捷径可以做到这一点? - CrazyLearner
@CrazyLearner也许可以将Webview的HTML转换为PDF。 - Aamirkhan
1
但是iText是付费库而不是免费的。 - Ahesanali Suthar
显示剩余2条评论

4
自API 19(KitKat)以来,Android现在允许您直接打印Webview。此外,同一PrintManager API可用于从WebView生成PDF,无需任何外部库。
正如示例代码所示,只需获取PrintManager,从相关的WebView创建PrintDocumentAdapter,然后创建一个新的PrintJob,您的用户应该会看到将其保存为PDF文件或打印到云打印机的选项。在比4.4更新的Android设备上,他们还将获得将要打印/转换为PDF的视觉预览。

任何例子或链接! - Rucha Bhatt Joshi
谁准确地要求打印的?! - Farid
打印输出到PDF屏幕上是“免费”的。只需将“保存为PDF”菜单项更改为云打印机即可。 - fattire

0
如果不想返回路径,则执行以下操作。
private fun createWebPrintJob(webView: WebView) {
    val printManager = this.getSystemService(Context.PRINT_SERVICE) as PrintManager
    val printAdapter = webView.createPrintDocumentAdapter()
    val jobName = getString(R.string.app_name) + " Print Test"
    printManager.print(
        jobName, printAdapter,
        PrintAttributes.Builder().build()
    )
}

如果想要返回PDF的路径

试试这个

库:

implementation 'com.github.pramodkr123:ConvertWebViewToPdfDemo:1.0.4'

Kotlin 代码:

    private fun sentEmailAndSavePDF() {
    val directory =
        Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM + "/MDP-PDF/")
    val min = 1000
    val max = 9999
    val random = Random().nextInt(max - min + 1) + min
    val fileName = "MDP_$random.pdf"

    PdfView.createWebPrintJob(
        this@WebViewActivity,
        binding.webview,
        directory,
        fileName,
        object : PdfView.Callback {
            override fun success(p0: String?) {

                Log.e(TAG, "success: ")
                   //p0  is your pdf PATH 
            }

            override fun failure() {

            }

        })
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接