当 HTML 变大时,HTML 到 PDF 会生成空白页
HTML to PDF produces blank page when HTML gets large
我正在尝试使用模板根据我的数据制作报告。使用 WebView 的 PDF 工作得很好,直到我的数据大于某个数字(for 循环中再增加 1 个),然后它只生成一个空白页。我在这里检查了所有可能的答案; this, this, this, and this,但没有成功。
这是我的代码片段:
Bitmap bitmap = callback.getMapImage();
WebView wv = new WebView(activity);
wv.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
//print
PrintManager printManager = (PrintManager) activity
.getSystemService(Context.PRINT_SERVICE);
String jobName = activity.getString(R.string.app_name) + " Document";
PrintDocumentAdapter printAdapter = wv.createPrintDocumentAdapter(jobName);
printManager.print(jobName, printAdapter, new PrintAttributes.Builder().build());
reference = null;
}
});
PrepareDocumentForPrintTask printTask = new PrepareDocumentForPrintTask(wv, bitmap);
printTask.execute();
并且 html 在 asyncTask 中创建并加载如下:
@Override
protected void onPostExecute(Triple<Boolean, String, File> result) {
activity.runOnUiThread(() -> {
if (result.getFirst()){
wv.loadDataWithBaseURL("", result.getSecond(), "text/html", "UTF-8", null);
reference = wv;
} else
Toast.makeText(activity, result.getSecond(), Toast.LENGTH_LONG).show();
});
}
我添加了 largeHeap= "true" 并停用了硬件加速,但仍然没有成功。
知道如何解决这个问题吗?
好的,我使用以下代码找到了解决问题的方法:
String urlDoc = saveHtmlFile("report",document);
wv.loadUrl("file://" + urlDoc);
其中函数saveHtmlFile()如下:
private @Nullable String saveHtmlFile(String fileName, String html) {
try {
File outputDir = this.activity.getCacheDir();
File outputFile = File.createTempFile(fileName, ".html", outputDir);
FileOutputStream out = new FileOutputStream(outputFile);
byte[] data = html.getBytes();
out.write(data);
out.close();
return outputFile.getPath();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
所以基本上,将 html 存储为临时文件并使用 loadUrl() 加载它解决了我的问题,这让我相信这应该是 WebView 中的一个错误!!!
我正在尝试使用模板根据我的数据制作报告。使用 WebView 的 PDF 工作得很好,直到我的数据大于某个数字(for 循环中再增加 1 个),然后它只生成一个空白页。我在这里检查了所有可能的答案; this, this, this, and this,但没有成功。
这是我的代码片段:
Bitmap bitmap = callback.getMapImage();
WebView wv = new WebView(activity);
wv.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
//print
PrintManager printManager = (PrintManager) activity
.getSystemService(Context.PRINT_SERVICE);
String jobName = activity.getString(R.string.app_name) + " Document";
PrintDocumentAdapter printAdapter = wv.createPrintDocumentAdapter(jobName);
printManager.print(jobName, printAdapter, new PrintAttributes.Builder().build());
reference = null;
}
});
PrepareDocumentForPrintTask printTask = new PrepareDocumentForPrintTask(wv, bitmap);
printTask.execute();
并且 html 在 asyncTask 中创建并加载如下:
@Override
protected void onPostExecute(Triple<Boolean, String, File> result) {
activity.runOnUiThread(() -> {
if (result.getFirst()){
wv.loadDataWithBaseURL("", result.getSecond(), "text/html", "UTF-8", null);
reference = wv;
} else
Toast.makeText(activity, result.getSecond(), Toast.LENGTH_LONG).show();
});
}
我添加了 largeHeap= "true" 并停用了硬件加速,但仍然没有成功。
知道如何解决这个问题吗?
好的,我使用以下代码找到了解决问题的方法:
String urlDoc = saveHtmlFile("report",document);
wv.loadUrl("file://" + urlDoc);
其中函数saveHtmlFile()如下:
private @Nullable String saveHtmlFile(String fileName, String html) {
try {
File outputDir = this.activity.getCacheDir();
File outputFile = File.createTempFile(fileName, ".html", outputDir);
FileOutputStream out = new FileOutputStream(outputFile);
byte[] data = html.getBytes();
out.write(data);
out.close();
return outputFile.getPath();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
所以基本上,将 html 存储为临时文件并使用 loadUrl() 加载它解决了我的问题,这让我相信这应该是 WebView 中的一个错误!!!