首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从WebView创建PDF截断PDF

从WebView创建PDF截断PDF
EN

Stack Overflow用户
提问于 2016-12-29 19:24:02
回答 1查看 1.8K关注 0票数 3

我一直在尝试使用WebView将安卓PdfDocument转换成PDF格式。以下是代码:

初始化WebView:

代码语言:javascript
运行
复制
WebView webView = (WebView) findViewById(R.id.invoice_web_view);
WebSettings webSettings = webView.getSettings();
webSettings.setBuiltInZoomControls(true);
webSettings.setLoadWithOverviewMode(true);
webSettings.setDefaultTextEncodingName("UTF-8");

转换为PDF:

代码语言:javascript
运行
复制
private void createPdf(File file) {
    try {
        PdfDocument document = new PdfDocument();
        PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(595, 842, 1).create(); //A4 page
        PdfDocument.Page page = document.startPage(pageInfo);

        View content = webView;
        content.draw(page.getCanvas());
        document.finishPage(page);
        document.writeTo(new FileOutputStream(file));
        document.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

上面的代码给了我这个PDF。以下PDF截图:

现在,当我更改WebView设置并添加webSettings.setUseWideViewPort(true)时,它提供了下面的PDF和上面的代码:

我还使用下面的代码直接从Android设备打印:

代码语言:javascript
运行
复制
public void createWebPrintJob(WebView webView, Context context) {
    // Get a PrintManager instance
    PrintManager printManager = (PrintManager) context
            .getSystemService(Context.PRINT_SERVICE);

    // Get a print adapter instance
    PrintDocumentAdapter printAdapter = webView.createPrintDocumentAdapter();

    // Create a print job with name and adapter instance
    String jobName = context.getString(R.string.app_name) + " Document";
    printManager.print(jobName, printAdapter,
            new PrintAttributes.Builder().build());
}

此代码正确地呈现WebView并将其发送到打印机。它提供了下面的屏幕:

我有几个问题:

  1. 如何修改createPdf(),使其给我一个像图3中那样的PDF?
  2. 图3仍然是两页,而PDF适合于一页。为此需要修改HTML代码吗?
  3. 假设我的HTML是巨大的,它不适合在一个A4页面。是否需要使用PdfDocument.Page、startPage()和finishPage()手动创建单独的页面?如何根据页面大小来拆分WebView?有什么自动创建页面的方法吗?
EN

Stack Overflow用户

发布于 2022-08-08 19:34:20

我解决了这个问题,首先将webview转换成位图,然后缩放位图以适应一个pdf页面。

至于打印部分,我认为更灵活的做法是简单地共享pdf并让用户选择他的打印机软件,因为它比简单地保存为pdf更有用。

如果您想打印几个页面,我认为创建不同的位图并将它们分配给不同的pdf页面更容易管理。

下面是将and视图转换成一个pdf页面然后共享它的代码:

代码语言:javascript
运行
复制
public static void sharePdfFile(WebView webView, Context context)
{
    Bitmap bitmap = webviewToBitmap( webView );
    PrintedPdfDocument pdf =  bitmapToPdf( bitmap, context );
    File file = pdfToFile( pdf, context );
    shareFile( file,"application/pdf", context );
}

private static void shareFile(File file, String contentType, Context context)
{
    Uri uri = FileProvider.getUriForFile(
        context,
        context.getPackageName() + ".fileprovider",
        file);
    Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);
    shareIntent.setType(contentType);
    shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
    shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    Toast.makeText(
        context,
        "Choose your printer app",
        Toast.LENGTH_LONG
    ).show();
    context.startActivity( shareIntent );
}

private static File pdfToFile(PrintedPdfDocument printedPdfDocument, Context context)
{
    File file = new File(context.getFilesDir(), "share.pdf");
    try {
        FileOutputStream outputStream = new FileOutputStream(file);
        printedPdfDocument.writeTo(outputStream);
        outputStream.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    printedPdfDocument.close();
    return file;
}


private static PrintedPdfDocument bitmapToPdf(Bitmap bitmap, Context context)
{
    PrintAttributes printAttributes = new PrintAttributes.Builder()
        .setColorMode(PrintAttributes.COLOR_MODE_COLOR)
        .setMediaSize(PrintAttributes.MediaSize.ISO_A4)
        .setMinMargins(PrintAttributes.Margins.NO_MARGINS)
        .setResolution(new PrintAttributes.Resolution("1", "label", 300, 300))
        .build();
    PrintedPdfDocument printedPdfDocument = new PrintedPdfDocument(context, printAttributes);
    PdfDocument.Page pdfDocumentPage = printedPdfDocument.startPage(1);
    Canvas pdfCanvas = pdfDocumentPage.getCanvas();
    bitmap = scaleBitmapToHeight(bitmap, pdfCanvas.getHeight());
    pdfCanvas.drawBitmap(bitmap, 0f, 0f, null);
    printedPdfDocument.finishPage(pdfDocumentPage);
    return printedPdfDocument;
}

private static Bitmap webviewToBitmap(WebView webView) {
    webView.measure(
        View.MeasureSpec.makeMeasureSpec(
            0,
            View.MeasureSpec.UNSPECIFIED
        ),
        View.MeasureSpec.makeMeasureSpec(
            0,
            View.MeasureSpec.UNSPECIFIED
        )
    );
    int webViewWidth = webView.getMeasuredWidth();
    int webViewHeight = webView.getMeasuredHeight();
    webView.layout(0,0, webViewWidth, webViewHeight );
    Bitmap bitmap = Bitmap.createBitmap(webViewWidth, webViewHeight, Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    canvas.drawBitmap(bitmap, 0, bitmap.getHeight(), new Paint());
    webView.draw(canvas);
    return bitmap;
}

private static Bitmap scaleBitmapToHeight(Bitmap bitmap, int maxHeight) {
    int height = bitmap.getHeight();
    if(height > maxHeight) {
        int width = bitmap.getWidth();
        float scalePercentage = ((float)maxHeight) / height;
        return Bitmap.createScaledBitmap(bitmap, (int) (width * scalePercentage), maxHeight, false);
    }
    return bitmap;
}
票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41385977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档