在webview中打开多个页面并创建PDF

时间:2015-12-11 05:40:08

标签: android pdf webview

我正在尝试构建一个应用程序,以便从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();

1 个答案:

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

然而,如果有一个更聪明的解决方案:我想学习。