我正在尝试构建一个应用程序,以便从webview中的多个页面创建PDF。
作为初学者,我很高兴我发现了这个: Android create pdf document from webview with multiple pages
然而,我无法做到正确。 PDF中创建的页面数量很少,但内容不是。 创建具有(在这种情况下)3个类似页面的PDF。所有在调用方法之前都显示webview。 完成创建PDF后,url数组的最后一个url会加载。
如何在网页视图中加载新网址后才能创建pdf页面?
我确实尝试使用延迟,但这似乎不是问题。 如果延迟,则首先创建pdf,然后仅在。
之后打开页面我确实尝试从onPageFinished()中调用pdf创建。 它也没有完成这项任务。
也许我确实使用了这一切。 以下是我的代码现在的样子:
//Create folder
String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath();
String dirName = "exampledirectory";
File newdir = new File(baseDir + File.separator + dirName);
newdir.mkdirs();
//Create PDF
String fileName = "example.pdf";
String fileNameWithPath = newdir + File.separator + fileName;
//Create document
PdfDocument document = new PdfDocument();
String[] urlArr = {"exampleurl1.com", "exampleurl2.com", "exampleurl3.com"};
for (int i = 0; i < urlArr.length; i++) {
mWebView.loadUrl(urlArr[i]);
PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(mWebView.getMeasuredWidth(), mWebView.getContentHeight(), i).create();
// start [i]st page
PdfDocument.Page page = document.startPage(pageInfo);
// draw on the page
View content = mWebView;
content.draw(page.getCanvas());
// finish [i]st page
document.finishPage(page);
}
FileOutputStream fos;
try {
fos = new FileOutputStream(fileNameWithPath, false);
// write the document content
document.writeTo(fos);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
document.close();
答案 0 :(得分:0)
我找到了一个适合我的解决方案。 感觉有点奇怪,但它确实有效。
正如我上面提到的onPageFinished()在第一次尝试时没有工作,导致页面在调用时尚未呈现。 现在我再次尝试从onPageFinished()调用另一个方法,然后调用PDFbuilder方法。通过这种“解决方法”,我能够从所有URL构建PDF。 这是代码:
private class printPDFFromWebcontent {
int i = 0;
public String pageURL = "exampleURL";
public PdfDocument document = new PdfDocument();
public String fileNameWithPath ="blank.pdf";
private void runPDFBuilder() {
zWebView = (WebView) findViewById(R.id.activity_main_webview);
WebSettings webSettings = zWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
zWebView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(zWebView, url);
i++;
openNextPage();
}
private void openNextPage() {
String nextPage = pageURL + "?page=" + String.valueOf(i + 1); //This works with my specific target URLs. You may want to use an URL array.
if (i == 1) {
zWebView.loadUrl(nextPage);
createPDFNow();
}
if (i == 2) {
zWebView.loadUrl(nextPage);
addPageToPDF();
}
if (i == 3) {
zWebView.loadUrl(nextPage);
addPageToPDF();
}
if (i == 4) {
mWebView.loadUrl("whateverYouWantToShowIfFinishedURL");
//Not added to the PDF
//Reason is to trigger onPageFinished() once more. You could probably i++ here and call openNextPage() from within.
addPageToPDF(); //Add the last webview content to PDF.
}
if (i == 5) {
createPDFNow();
Toast.makeText(getApplicationContext(), "Finito.", Toast.LENGTH_SHORT).show();
savePDF();
return;
}
}
public void createPDFNow(){
String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath();
String dirName = "example";
File newdir = new File(baseDir + File.separator + dirName);
newdir.mkdirs();
String fileName = "example.pdf";
fileNameWithPath = newdir + File.separator + fileName;
}
public void addPageToPDF() {
PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(zWebView.getMeasuredWidth(), zWebView.getContentHeight(), i).create();
PdfDocument.Page page = document.startPage(pageInfo);
View content = zWebView;
content.draw(page.getCanvas());
document.finishPage(page);
}
public void savePDF(){
FileOutputStream fos;
try {
fos = new FileOutputStream(fileNameWithPath, false);
document.writeTo(fos);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
document.close();
}
});
zWebView.getSettings().setUseWideViewPort(true);
zWebView.getSettings().setLoadWithOverviewMode(true);
zWebView.loadUrl("URL1");
return;
}
然而,如果有一个更聪明的解决方案:我想学习。