以前有个需求就是要把webview打印成pdf保存到本地然后上传的问题,然后百度google了一大堆,大部分还都是用第三方的库来实现,然而并不太好用,偶尔看了一篇博客用原生的API来打印,这两天再找那个博客,竟然没了,所以写个博客记录一下,万一以后用得着还能有个记录

话不多少直接上代码:

private void webViewToPdf () { //创建DexMaker缓存目录 try { File pdfFile = new File(pdfFilePath); if (pdfFile.exists()) { pdfFile.delete(); pdfFile.createNewFile(); descriptor = ParcelFileDescriptor.open(pdfFile, ParcelFileDescriptor.MODE_READ_WRITE); // 设置打印参数 PrintAttributes.MediaSize isoA4 = PrintAttributes.MediaSize.ISO_A4; PrintAttributes attributes = new PrintAttributes.Builder() .setMediaSize(isoA4) .setResolution(new PrintAttributes.Resolution("id", Context.PRINT_SERVICE, 240, 240)) .setColorMode(PrintAttributes.COLOR_MODE_COLOR) .setMinMargins(PrintAttributes.Margins.NO_MARGINS) .build(); // 计算webview打印需要的页数 int numberOfPages = (int) ((mWebView.getContentHeight() * 240 / (isoA4.getHeightMils())) ); ranges = new PageRange[]{new PageRange(0, numberOfPages)}; // 创建pdf文件缓存目录 // 获取需要打印的webview适配器 printAdapter = mWebView.createPrintDocumentAdapter(); // 开始打印 printAdapter.onStart(); printAdapter.onLayout(attributes, attributes, new CancellationSignal(), getLayoutResultCallback(new InvocationHandler() { @Override public Object invoke (Object proxy, Method method, Object[] args) throws Throwable { if (method.getName().equals("onLayoutFinished")) { // 监听到内部调用了onLayoutFinished()方法,即打印成功 onLayoutSuccess(); } else { // 监听到打印失败或者取消了打印 Toast.makeText(MainActivity.this, "导出失败,请重试", Toast.LENGTH_SHORT).show(); return null; }), new Bundle()); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); private void onLayoutSuccess () throws IOException { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { PrintDocumentAdapter.WriteResultCallback callback = getWriteResultCallback(new InvocationHandler() { @Override public Object invoke (Object o, Method method, Object[] objects) { if (method.getName().equals("onWriteFinished")) { Toast.makeText(MainActivity.this, "导出成功", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(MainActivity.this, "导出失败", Toast.LENGTH_SHORT).show(); return null; printAdapter.onWrite(ranges, descriptor, new CancellationSignal(), callback); public static PrintDocumentAdapter.LayoutResultCallback getLayoutResultCallback (InvocationHandler invocationHandler) throws IOException { return ProxyBuilder.forClass(PrintDocumentAdapter.LayoutResultCallback.class) .handler(invocationHandler) .build(); public static PrintDocumentAdapter.WriteResultCallback getWriteResultCallback (InvocationHandler invocationHandler) throws IOException { return ProxyBuilder.forClass(PrintDocumentAdapter.WriteResultCallback.class) .handler(invocationHandler) .build();

需要注意的点:

1.需要导入一个三分库 implementation 'com.linkedin.dexmaker:dexmaker-mockito:2.16.0'

2.new PrintAttributes.Resolution("id", Context.PRINT_SERVICE, 240,240)参数不太知道有什么用虽然说的是dpi但是我用500和240保存出来的pdf文件没什么不同

3.需要网络权限和写入硬盘权限

4.是否需要子线程的问题

5.页数问题最好是确定数量,算的方法有可能有问题

demo地址: WebView转PDF

以前有个需求就是要把webview打印成pdf保存到本地然后上传的问题,然后百度google了一大堆,大部分还都是用第三方的库来实现,然而并不太好用,偶尔看了一篇博客用原生的API来打印,这两天再找那个博客,竟然没了,所以写个博客记录一下,万一以后用得着还能有个记录话不多少直接上代码: private void webViewToPdf () { //创建DexM...
在各种情况下,您可能需要将 HTML 页面 换为 PDF 格式。另一方面,您可能希望从WYSIWYG HTML 编辑器的内容生成 PDF 。对于这种情况,本文介绍如何在 Android 应用程序中以编程方式将 HTML 换为 PDF 。此外,还将了解用于自定义 HTML PDF 换的其他选项。 将 HTML 换为 PDF HTML 换为受密码保护的 PDF 使用URL的 HTML PDF 换 为了将 HTML 换为 PDF ,我们将通过Aspose. PDF for Android via Java ,它提供了完整的功能集,可从您的Andr
这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Ma...
您好,关于 Android webview 调用 react ts 方法的具体 实现 方法示例,可以通过以下步骤 实现 : 1. 在 react ts 项目中,将需要被调用的方法封装为一个全局函数,并将该函数挂载到 window 对象上,例如: window.myFunction = function() { // do something 2. 在 Android webview 中,通过 addJavascriptInterface 方法将该全局函数注入到 webview 中,例如: webView .addJavascriptInterface(new Object() { @JavascriptInterface public void myFunction() { // call the global function webView .loadUrl("javascript:myFunction()"); }, " android "); 3. 在 webview 中,通过 window. android .myFunction() 调用该全局函数,例如: <button onclick="window. android .myFunction()">调用全局函数</button> 希望以上步骤能够帮助您 实现 Android webview 调用 react ts 方法的功能。