gpt4 book ai didi

android - 从 WebView 创建 PDF 会截断 PDF

转载 作者:行者123 更新时间:2023-12-05 07:45:44 25 4
gpt4 key购买 nike

我一直在尝试使用 PdfDocument 将 Android WebView 转换为 PDF。下面是代码:

WebView的初始化:

WebView webView = (WebView) findViewById(R.id.invoice_web_view);
WebSettings webSettings = webView.getSettings();
webSettings.setBuiltInZoomControls(true);
webSettings.setLoadWithOverviewMode(true);
webSettings.setDefaultTextEncodingName("UTF-8");

转换为 PDF:

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 的截图:

enter image description here

现在,当我更改 WebView 设置并添加 webSettings.setUseWideViewPort(true) 时,它会在下方提供包含上述代码的 PDF: enter image description here

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

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 并将其发送到打印机。它给出以下屏幕: enter image description here

我有几个问题:

  1. 如何更改 createPdf() 以便它为我提供如图 3 中所示的 PDF?

  2. 图 3 仍然是两页,而 PDF 只占一页。我需要为此修改我的 HTML 代码吗?

  3. 假设我的 HTML 很大,一张 A4 纸都放不下。我是否需要使用 PdfDocument.Page 和 startPage() 以及 finishPage() 手动创建单独的页面?我将如何根据页面大小拆分 WebView?有没有自动创建页面的方法?

最佳答案

我通过首先将 webview 转换为位图,然后缩放位图以适合单个 pdf 页面来解决这个问题。

至于打印部分,我认为简单地共享 pdf 并要求用户选择他的打印机软件会更灵活,因为它比简单地另存为 pdf 更有用。

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

以下是将 webview 转换为单个 pdf 页面然后共享的代码:

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;
}

关于android - 从 WebView 创建 PDF 会截断 PDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41385977/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com