【问题标题】:how to get whole content of Web View to generate PDF file in android?如何获取 Web View 的全部内容以在 android 中生成 PDF 文件?
【发布时间】:2020-12-08 02:40:07
【问题描述】:

我目前正在尝试为我的 Android 应用程序添加 PDF 导出功能。

这涉及填充一个 Url,将其放入 WebView,然后使用此处的改编代码将该 WebView 的内容写入 PDF:

public Bitmap viewToBitmap(View view) { 位图位图 = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888); 画布画布=新画布(位图); view.draw(画布); 返回位图; }

public void deleteRecursive(File fileOrDirectory) {
    if (fileOrDirectory.isDirectory())
        for (File child : fileOrDirectory.listFiles())
            deleteRecursive(child);
    fileOrDirectory.delete();
}

public void bmpToPdfMail(Bitmap bitmap) {
    String GVCode = String.valueOf(System.currentTimeMillis() + "_InvoiceTest");
    String root = Environment.getExternalStorageDirectory().toString();
    File myDir = new File(root + "/Invoices");
    if (myDir.exists()) {
        deleteRecursive(myDir);
    }
    myDir.mkdirs();

    String fname = GVCode + ".jpg";
    File file = new File(myDir, fname);
    if (file.exists()) {
        deleteRecursive(file);
    }
    try {
        FileOutputStream out = new FileOutputStream(file);
        bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
        out.flush();
        out.close();

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

    Document document = new Document();
    String input = Environment.getExternalStorageDirectory().toString() + "/Invoices/" + GVCode + ".jpg";
    String output = Environment.getExternalStorageDirectory().toString() + "/Invoices/" + GVCode + ".pdf";
    String stringPrintDirectory = Environment.getExternalStorageDirectory().toString() + "/Invoices/";
    File myDirPdf = new File(stringPrintDirectory);
    if (!myDirPdf.exists()) {
        myDirPdf.mkdirs();
    }
    try {
        FileOutputStream fos = new FileOutputStream(output);
        PdfWriter writer = PdfWriter.getInstance(document, fos);
        writer.open();
        document.open();
        Image img = Image.getInstance(input);
        document.setPageSize(img);
        document.newPage();
        img.setAbsolutePosition(0, 0);
        document.add(img);
        document.close();
        writer.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
} 

如何从隐藏部分的 WebView 创建 PDF?

但是,当生成 PDF 时,我只得到了 WebView,所以屏幕外的信息被截断了。

如何在 WebView 中获取整个内容(如(可见或不可见部分))以从我的 Android 应用程序导出 PDF 文件...?

【问题讨论】:

    标签: java android html android-studio android-webview


    【解决方案1】:

    页面加载成功后,试试这个获取位图。

    public Bitmap viewToBitmap(WebView v) {
        Picture picture = v.capturePicture();
        Bitmap  b = Bitmap.createBitmap( picture.getWidth(),
        picture.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas c = new Canvas( b );
    
        picture.draw( c );
        return b;
    }
    

    由于capturePicture() 在 api 级别 19 中已弃用,请使用

    public Bitmap viewToBitmap(WebView v) {
        float scale = v.getScale(); // Used to capture whole the content
        int webViewHeight = (int)(v.getContentHeight() * scale);
        Bitmap image = Bitmap.createBitmap(v.getWidth(), webViewHeight,
                Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(image);
        v.draw(canvas);
        return image;
    }
    

    使用位图生成 PDF。在此之前,请尝试查看位图以确定pdf生成代码是否存在问题。

    【讨论】:

    • 我尝试了这种方法,但没有得到正确的位图文件
    • 那么,所有的内容都包含在位图中了吗?
    • 不,我只得到一个可见部分,其他部分是空白打印
    • 改用onDraw() webview 方法,编辑我的答案。
    • 我没有正确地得到你的答案。你能给我一些见解吗?在 webview 的 onDraw() 方法中做什么?等待您的回复。
    【解决方案2】:

    我找到了一个解决方案,不是那么优雅但有效:

        wb.measure(View.MeasureSpec.makeMeasureSpec(
                        View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED),
                View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
        wb.layout(0, 0, wb.getMeasuredWidth(), wb.getMeasuredHeight());
        PdfDocument document = new PdfDocument();
        int pageNumber = 1;
        PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(wb.getMeasuredWidth(),
                wb.getMeasuredHeight(), pageNumber).create();
        PdfDocument.Page page = document.startPage(pageInfo);
        //wb.draw(page.getCanvas());
        wb.draw(page.getCanvas());
        document.finishPage(page);
    

    这将创建一个 PDF 页面,其宽度可以满足整个 WebView 的需要。 希望对您有所帮助!

    【讨论】:

      猜你喜欢
      • 2018-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-29
      • 2013-08-26
      • 1970-01-01
      • 2022-08-24
      相关资源
      最近更新 更多