如何在Android项目中将webview转换为PDF

本篇文章给大家分享的是有关如何在Android项目中将webview转换为PDF,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

完整代码如下:

File file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM + "/PDFTest.pdf");   File dexCacheFile;   // 获取需要打印的webview适配器   PrintDocumentAdapter printAdapter;   PageRange[] ranges;   ParcelFileDescriptor descriptor;   /**    a* @param webView    */   private void printPDFFile(WebView webView) {     if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {       /**        * android 5.0之后,出于对动态注入字节码安全性德考虑,已经不允许随意指定字节码的保存路径了,需要放在应用自己的包名文件夹下。        */       //新的创建DexMaker缓存目录的方式,直接通过context获取路径       dexCacheFile = getDir("dex", 0);       if (!dexCacheFile.exists()) {         dexCacheFile.mkdir();       }       try {         //创建待写入的PDF文件,pdfFilePath为自行指定的PDF文件路径         if (file.exists()) {           file.delete();         }         file.createNewFile();         descriptor = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_WRITE);         // 设置打印参数         PrintAttributes attributes = new PrintAttributes.Builder()             .setMediaSize(PrintAttributes.MediaSize.ISO_A4)             .setResolution(new PrintAttributes.Resolution("id", Context.PRINT_SERVICE, 300, 300))             .setColorMode(PrintAttributes.COLOR_MODE_COLOR)             .setMinMargins(PrintAttributes.Margins.NO_MARGINS)             .build();         //打印所有界面         ranges = new PageRange[]{PageRange.ALL_PAGES};         printAdapter = webView.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 {               // 监听到打印失败或者取消了打印             }             return null;           }         }, dexCacheFile.getAbsoluteFile()), new Bundle());       } catch (IOException e) {         e.printStackTrace();       }     }   }   /**    * @throws IOException    */   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) throws Throwable {           if (method.getName().equals("onWriteFinished")) {             Toast.makeText(MainActivity.this,"Success",Toast.LENGTH_SHORT).show();             // PDF文件写入本地完成,导出成功             Log.e("onLayoutSuccess","onLayoutSuccess");           } else {             Toast.makeText(MainActivity.this,"导出失败",Toast.LENGTH_SHORT).show();           }           return null;         }       }, dexCacheFile.getAbsoluteFile());       //写入文件到本地       printAdapter.onWrite(ranges, descriptor, new CancellationSignal(), callback);     }else {       Toast.makeText(MainActivity.this,"不支持4.4.以下",Toast.LENGTH_SHORT).show();     }   }   @SuppressLint("NewApi")   public static PrintDocumentAdapter.LayoutResultCallback getLayoutResultCallback(InvocationHandler invocationHandler, File dexCacheDir) throws IOException {     return ProxyBuilder.forClass(PrintDocumentAdapter.LayoutResultCallback.class)         .dexCache(dexCacheDir)         .handler(invocationHandler)         .build();   }   @SuppressLint("NewApi")   public static PrintDocumentAdapter.WriteResultCallback getWriteResultCallback(InvocationHandler invocationHandler, File dexCacheDir) throws IOException {     return ProxyBuilder.forClass(PrintDocumentAdapter.WriteResultCallback.class)         .dexCache(dexCacheDir)         .handler(invocationHandler)         .build();   }

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。