在安卓设备上从Webview保存PDF

6
我希望将我的WebView保存为PDF文件。我知道可以使用WebView.createPrintDocumentAdapter()和PrintManager.print()打印WebView。但是,我需要一种直接保存由PrintDocumentAdapter内部生成的PDF文件的方法,而无需任何用户交互,因为我需要该文件在我的应用程序内进行进一步处理。
有什么想法吗?
2个回答

5

我知道这个问题现在已经很老了。但是我刚刚意识到如何合理地完成这项工作。

基本上,您可以使用上面提到的createPrintDocumentAdapter方法,并将结果传递给您自己的“伪”PrintManager实现,该实现简单地覆盖onWrite方法以将输出保存到您自己的文件中。下面的代码片段展示了如何获取任何PrintDocumentAdapter并将其输出发送到文件。

public void print(PrintDocumentAdapter printAdapter, final File path, final String fileName) {
    printAdapter.onLayout(null, printAttributes, null, new PrintDocumentAdapter.LayoutResultCallback() {
        @Override
        public void onLayoutFinished(PrintDocumentInfo info, boolean changed) {
            printAdapter.onWrite(null, getOutputFile(path, fileName), new CancellationSignal(), new PrintDocumentAdapter.WriteResultCallback() {
                @Override
                public void onWriteFinished(PageRange[] pages) {
                    super.onWriteFinished(pages);
                }
            });
        }
    }, null);
}

如您所见,有很多空值传递到适配器方法中,但我已经检查了Chromium源代码,这些变量从未被使用,因此空值是可以的。

我在这里创建了一篇博客文章,介绍了如何实现: http://www.annalytics.co.uk/android/pdf/2017/04/06/Save-PDF-From-An-Android-WebView/


1
@Andreas 感谢您的回答,我看到了您关于此问题的博客文章,但是如何在android.print包中创建一个类呢?这是一个系统包吗? - Houssem
抱歉,我忘记发布我提到的问题的链接了。https://dev59.com/0onca4cB1Zd3GeqP8Dkp 有了这个解决方案,就不需要在android.print包中创建一个类了。 - Andreas
@hyperfkcb 很抱歉回复晚了。您需要将上述内容放在android.print包中的一个类中,因为它使用了包级别的受保护方法/类。 - Brett Cherrington
1
@Andreas提供的链接解决方案有效,但我无法创建多个页面,你能帮我解决吗?这是我的问题:https://stackoverflow.com/questions/54870164/convert-html-into-pdf-using-webview-can-not-created-multiple-pages - Rucha Bhatt Joshi
@BrettCherrington 能否以一种方式完成,使得PDF文件既保存在文件中,又显示在WebView中? - msc87
显示剩余2条评论

-1
创建一个自定义的WebViewClientreference),并将其设置在你的WebView上。
在这个WebViewClient中,你应该重写shouldOverrideUrlLoading(WebView view, String url)方法。从这里开始,当PDF被点击时,你可以手动下载它。

他们要求将WebView的内容保存为PDF,而不是下载现有的PDF文件。 - Fabian Streitel
因此,我建议覆盖WebView的行为:这样可以拦截URL加载并下载它。在实践中,您可能会显示一个本地Android弹出窗口,询问用户是否要查看PDF或下载它。 - ByteWelder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接