【问题标题】:Create a PDF from Webview on Android在 Android 上从 Webview 创建 PDF
【发布时间】:2017-07-11 14:58:54
【问题描述】:

所以我正在尝试从 Webview 创建 PDF。现在我可以从 web 视图创建图像,但是在将文档拆分为多个页面时遇到了一些问题。

首先,我从 webview 创建一个位图:

public static Bitmap screenShot(View view) {
        Bitmap bitmap = Bitmap.createBitmap(view.getWidth(),
                view.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        canvas.drawColor(Color.WHITE);
        view.draw(canvas);
        return bitmap;
    }

其次,我创建并显示 PDF:

public void criaPdf(){
        Bitmap bitmap = Utils.screenShot(mContratoWebview);

        Document doc = new Document();


        File dir = new File(getFilesDir(), "app_imageDir");

        if(!dir.exists()) {
            dir.mkdirs();
        }

        File file = new File(dir, "contratoPdf.pdf");

        try {
            FileOutputStream fOut = new FileOutputStream(file);

            PdfWriter.getInstance(doc, fOut);

            //open the document
            doc.open();

            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);

            byte[] byteArray = stream.toByteArray();
            Image image = Image.getInstance(byteArray);
            image.scaleToFit(PageSize.A4.getHeight(), PageSize.A4.getWidth());

            doc.newPage();
            doc.add(image);
        } catch (DocumentException de) {
            Log.e("PDFCreator", "DocumentException:" + de);
        } catch (IOException e) {
            Log.e("PDFCreator", "ioException:" + e);
        }
        finally {
            doc.close();
        }

        mPdfView.fromFile(file)
                .pages(0, 1) // all pages are displayed by default
                .enableSwipe(true)
                .load();
        mPdfView.setVisibility(View.VISIBLE);
}

这是我目前得到的:

所以我的问题是:Webview 的内容太大而无法放入 PDF。我该如何解决?

【问题讨论】:

  • 如何在 webview 和 pdf 中显示图像!?
  • 问题解决了吗?请分享

标签: android pdf webview


【解决方案1】:

WebView 具有生成 PDF 的内置功能,该功能可通过使用 PrintManager 服务提供,专门用于打印目的。但是对于您的特定用例,我建议您将 WebView 的 PrintAdapter 的最终输出写入(存储),这是一个 PDF 文件到本地文件,然后从那里开始。

此链接将引导您了解详细信息和实施。 http://www.annalytics.co.uk/android/pdf/2017/04/06/Save-PDF-From-An-Android-WebView/

您可以通过对上述解决方案的小调整来实现 API 级别 19(KitKat) 的兼容性。

这应该可以解决您的问题,但如果您在实施过程中遇到任何问题,请告诉我。

【讨论】:

  • 我正在尝试您在链接annalytics.co.uk/android/pdf/2017/04/06/… 中提到的代码,但是当我创建 PdfPrint 类时,它会给出错误,即 PrintDocumentAdapter.WriteResultCallback 不是公共的,并且无法从外部包访问。
  • 我必须要创建 android.print 包
  • 当我创建文档时,它的大小是 0 字节
  • 嗨@AhesanaliMomin,您能否提供有关您面临的问题的更多详细信息?我建议您创建一个新问题,用您的代码详细描述您的问题,并在此处发布该问题链接。
  • 我正在使用上面博客中提到的代码,但创建的 pdf 大小为 0
【解决方案2】:

要从 webview 创建 pdf,您需要 android>kitkat -> sdk>=19

  btnSave.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {

                createWebPrintJob(webView);
            } else {



            }

        }
    });

//// 功能:

private void createWebPrintJob(WebView webView) {

    PrintManager printManager = (PrintManager) this
            .getSystemService(Context.PRINT_SERVICE);

    PrintDocumentAdapter printAdapter =
            webView.createPrintDocumentAdapter();

    String jobName = getString(R.string.app_name) + " Print Test";

    if (printManager != null) {
        printManager.print(jobName, printAdapter,
                new PrintAttributes.Builder().build());
    }
}

我在从 webview 创建图像时遇到问题 :))))

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-06
  • 2015-03-25
  • 1970-01-01
  • 2014-11-30
  • 1970-01-01
  • 1970-01-01
  • 2017-07-08
相关资源
最近更新 更多