栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 移动开发 > Android

Android webview转PDF的方法示例

Android 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android webview转PDF的方法示例

1.网上找了好多没有显示出来效果不错,后来看到调用手机打印预览,看了效果还不错,就打算使用系统打印服务预览下载

2.‘webView.createPrintdocumentAdapter()'得到打印的PrintdocumentAdapter有了该类就可以使用onWrite方法写入制定的文件,但是这个方法需要传入回调这个悲剧的是这个回调方法是hiden的我们没办法调用

3,字怎么解决呢,有连个方法

3.1 使用此开源库替换自己的sdk 中的android.jar文件,就可以使用了

https://github.com/anggrayudi/android-hidden-api

3.2 使用dexmaker生成动态代理代理PrintdocumentAdapter.WriteResultCallback和PrintdocumentAdapter.LayoutResultCallback方法依赖地址

compile 'org.droidparts.dexmaker:dexmaker-mockito:1.5'

4.完整代码如下:

File file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM + "/PDFTest.pdf");
  File dexCacheFile;
  // 获取需要打印的webview适配器
  PrintdocumentAdapter printAdapter;
  PageRange[] ranges;
  ParcelFileDescriptor descriptor;

  
  private void printPDFFile(WebView webView) {
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
      
      //新的创建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();
      }
    }
  }

  
  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();
  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/156494.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号