热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Androidwebview转PDF的方法示例

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

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;

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

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


推荐阅读
  • 2023年1月28日网络安全热点
    涵盖最新的网络安全动态,包括OpenSSH和WordPress的安全更新、VirtualBox提权漏洞、以及谷歌推出的新证书验证机制等内容。 ... [详细]
  • Android常见漏洞漏洞名称:Log敏感信息泄露漏洞描述: 程序运行期间打印了用户的敏感信息,造成泄露修改建议: 建议禁止隐私信息的log  ... [详细]
  • 汇总了2023年7月7日最新的网络安全新闻和技术更新,包括最新的漏洞披露、工具发布及安全事件。 ... [详细]
  • 本文出处:炎之铠csdn博客:http:blog.csdn.nettotond炎之铠邮箱:yanzhikai_yjk@qq.com本文原创,转载请注明本出处!前言 ... [详细]
  • 前言作为一个移动端初学者、爱好者,能使用前端技术开发原生游戏一直是一件渴望而不可及的事情,暂且不说游戏逻辑的复杂度,算法的健壮性ÿ ... [详细]
  • 安卓端开源移动浏览器开源项目
    进入android开发以来,webview用的比较多,后来又看了一些基于webview的浏览器代码,慢慢的将积累的东西做成了一个安卓移动浏 ... [详细]
  • 本文详细介绍了PHP中的几种超全局变量,包括$GLOBAL、$_SERVER、$_POST、$_GET等,并探讨了AJAX的工作原理及其优缺点。通过具体示例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 本文详细介绍了在PHP中如何获取和处理HTTP头部信息,包括通过cURL获取请求头信息、使用header函数发送响应头以及获取客户端HTTP头部的方法。同时,还探讨了PHP中$_SERVER变量的使用,以获取客户端和服务器的相关信息。 ... [详细]
  • 01mui框架使用概述
    1MUI概述1.1MUI诞生背景?性能和体验的差距,一直是手机APP开发者放弃HTML5的首要原因。浏览器默认控件样式又少又丑,制作一 ... [详细]
  • Git版本控制基础解析
    本文探讨了Git作为版本控制工具的基本概念及其重要性,不仅限于代码管理,还包括文件的历史记录与版本切换功能。通过对比Git与SVN,进一步阐述了分布式版本控制系统的独特优势。 ... [详细]
  • 分布式计算助力链力实现毫秒级安全响应,确保100%数据准确性
    随着分布式计算技术的发展,其在数据存储、文件传输、在线视频、社交平台及去中心化金融等多个领域的应用日益广泛。国际知名企业如Firefox、Google、Opera、Netflix、OpenBazaar等均已采用该技术,推动了技术创新和服务升级。 ... [详细]
  • 本文探讨了在不同场景下如何高效且安全地存储Token,包括使用定时器刷新、数据库存储等方法,并针对个人开发者与第三方服务平台的不同需求提供了具体建议。 ... [详细]
  • 本文概述了在GNU/Linux系统中,动态库在链接和运行阶段的搜索路径及其指定方法,包括通过编译时参数、环境变量及系统配置文件等方式来控制动态库的查找路径。 ... [详细]
  • 资源:吊炸天!74款APP完整源码!android界面中点击输入框时弹出输入法如果输入框在底部会出现输入法遮挡输入内容的问题解决办法设置activity的windowsoftinpu ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了预加载多个本地WebView相关的知识,希望对你有一定的参考价值。 ... [详细]
author-avatar
赵美晓
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有