技术标签: Android之应用实战 android
android项目中在webview中打开pdf。
关于android打开pdf文件方法有多种,下面的文章有详细说明:
总结一下:
1、WebView 中调用 GoogleDocs
这个方案要翻墙!!!
2、调起第三方支持 PDF 阅读的应用
建议使用这种方法,扩展性兼容性强,可以扩展为支持其他的文件格式。但是如果用户手机没有安装PDF的应用,就比较尴尬了。
3、集成第三方 PDF SDK,在 Native 页面中阅读
第三方包很大,APK体积会增大20M左右,不介意APK体积的可以采用。
4、将 PDF 文件转换成 HTML 或者图片等格式文件
这种方案是比较low,但是能解决部分问题
5、集成第三方JS:pdf.js
这种方案有两种方式集成:服务端和客户端,因为准备在android端实现所以介绍客户端集成的方案。
客户端集成也有两种方式,
①将pdf.js和相关的文件全部下载下来并拷贝的工程中的assets目录。pdf.js和相关文件体积也比较大(5M左右),同样会增加APK体积,但是这种方式更快,全部都是本地资源,不需要每次都联网加载pdf.js文件。
②就是使用CDN的方式。在asset目录想编写html文件和js文件,加载网络中的pdf.js的相关资源。但是相对第一中方法比较慢,如果而且文件过大,会报错。具体实现参考文章 Android中显示PDF的问题解决(安卓端使用pdf.js CDN模式)
我使用的是集成第三方的pdf.js,并且把所有资源下载到本地。
核心方法
1、pdf.js资源到android项目的asset目录 下载地址 http://mozilla.github.io/pdf.js/getting_started/#download
2、使用webview加载viewer.html界面
mWebView.loadUrl(file:///android_asset/pdf/web/viewer.html?file=PDFURl)
(其中PDFURL为pdf文件路径,可以是网络路径也可以是本地文件)
超级简单!!
但是实际操作中遇到很多的问题
1、webView 打失败,报错 unexpected server response (0) while retrieving PDF
webview的权限设置有问题,需要设置:
webSettings.setJavaScriptEnabled(true);//支持js
webSettings.setAllowFileAccess(true);;//否允许访问文件,默认允许访问
webSettings.setAllowFileAccessFromFileURLs(true);//一个文件被允许访问其他文件中的内容
webSettings.setAllowUniversalAccessFromFileURLs(true);//可以是否访问任何原始起点内容
2、打开失败, file origin does not match viewer's
处理方法:需要在web/viewer.js(1793行)中注释的代码如下:
// if (origin !== viewerOrigin && protocol !== 'blob:') {
// throw new Error('file origin does not match viewer\'s');
// }
3、低版本android手机(5.0)打开失败,
检查之后发现是低版本android浏览器不支持es6语法。
最简单的处理方法,下载es5版本的pdf.js。但是这个版本比es6版本大,有11M
在网上有文章提到 4.4及以下版本,有兼容问题,需要使用低版本的pdf.js。我们项目不支持4.4及以下版本,所有没有测试。处理方法是判断android系统版本, 4.4及以下版本使用低版本的pdf.js(文章使用的1.4版本的),高版本系统,使用当前最新的pdf.js。
4、屏蔽下载按钮
实现使用中发现,工具栏用些功能在android手机上是不能使用的,比如下载、打印。
解决方案:隐藏工具栏中的按钮,web/viewer.html找到 id="secondaryDownload",在button标签添加 style="display:none"。
注意,在文件中还有id="download"的按钮,隐藏该按钮并没有使界面中下载按钮消失
android 4.4 报错,
使用低版本的psdjs
pdfjs-1.9.426下载地址 https://pan.baidu.com/s/1wW6P-fdHpiEHD_zME0pIXQ
这个亲测可用。
但是相关的功能比新版的要少一些
文章浏览阅读733次。一、datax插件hbase12xwriter开发查看datax源码,发现有hbase094xwriter和hbase11xwriter源码,说明datax支持hbase写入,再查看测试和生产环境使用的hbase版本是:hbase-1.2.0-cdh5.8.4自己写一个hbase12xwriter插件包开发流程:1、搭建项目模块moduledatax-all项目上右击->New->ot..._datax 同步mysql数据到hive上执行成功但是没数据
文章浏览阅读795次。TensorRT 的 pytorch_quantization 是一个实现的。_nvidia developer blog qat
文章浏览阅读2.2k次。使用Nuitka打包pyd_nuitka pyd
文章浏览阅读943次。华为认证hcia-5G V2.0(中文版)自2021年6月8日起,正式中国区发布。发布概述基于“平台+生态”战略,围绕“云-管-端”协同的新ICT技术架构,华为公司打造了覆盖ICT领域的认证体系,包含ICT技术架构与应用认证、云服务与平台两类认证。根据ICT从业者的学习和进阶需求,华为认证分为工程师级别、高级工程师级别和专家级别三个认证等级。华为认证覆盖ICT领域,符合ICT融合的技术趋势,致力于提供领先的人才培养体系和认证标准,培养数字化时代的新型ICT人才,构建良性的ICT人才生态。HC_华为考试h35-660 v2版本什么时候开始的
文章浏览阅读931次。在这个例子中,/app1 和 /app2 的请求路径都会被重写,但每个请求路径的替换目标不同。/app1 的请求路径将重写为 /,而 /app2 的请求路径将重写为 /foo/1、nginx-ingress路由配置并将路由名称去除(不传递到后台service)上述配置得到结果是请求的接口/foo和/bar不会传递到后台service。这个前提是要保证后台service中有对应的foo和bar路径。3、部分路由传递,其余的不匹配的不传递过去。4、部分路由传递,不匹配的不传递。5、同一配置不同路由路径配置。_nginx.ingress.kubernetes.io
文章浏览阅读837次,点赞14次,收藏8次。通过此次学习51单片机单片机定时器与串口通信的相关内容,掌握了单片机定时器与串口通信的使用方法,了解了如何利用单片机定时器与串口来实现对外部事件的实时控制,还学习了单片机定时器与串口的工作原理和编程方法,掌握了如何利用定时器来实现时间精确控制,提高了系统的时间管理能力。了解了单片机定时器与串口的工作机制,学会了合理设置定时器的工作参数,从而能够有效地节省系统资源,提高系统的性能和效率。
文章浏览阅读662次。实战详解docker安装步骤——Linux操作系统(CentOS7.9)下安装容器技术docker引擎_配置国内docker的yum源
文章浏览阅读117次。贝塞尔曲线(Bézier curve),又称贝兹曲线或贝济埃曲线,是应用于二维图形应用程序的数学曲线。一般的矢量图形软件通过它来精确画出曲线,贝兹曲线由线段与节点组成,节点是可拖动的支点,线段像可伸缩的皮筋,我们在绘图工具上看到的钢笔工具就是来做这种矢量曲线的。主要结构:起始点、终止点(也称锚点)、控制点。通过调整控制点,贝塞尔曲线的形状会发生变化。_android bezier(0.33,0,0.67,1.00)
文章浏览阅读859次,点赞23次,收藏18次。系统采用西门子SIMATICS7-200系列可编程控制器(PLC)作为数据采集与控制的核心部件,昆仑通态触摸屏作为数据显示、存储部件,采用德国进口的红外吸收原理的SF6气体浓度传感器和日本进口的氧气含量传感器为主要部件,配上通讯、电源隔离、信号隔离、抗电磁干扰等电路,组成SF6浓度/氧气含量复合传感器,使传感器具有检测精度高、稳定性好、抗于扰能力强、维护方便等优点,采用RS485总线输出,使系统扩充更为容易,完全能够满足现场各项要求。温湿度变送器设置方法与SF6/02变送器的设置方法相同。
文章浏览阅读290次。题目大意在一维数轴上,狼的起始位置是x1x_1x1,马的起始位置的x2x_2x2 。每轮狼移动v1v_1v1步,小马移动v2v_2v2 步,每一步都可以向左或者向右移动。狼和马轮流先移动,第一轮狼先动,第二轮马先动。如果两个动物位置相同,那么马被抓住。移动不能超过数轴n的长度代码#include <iostream>using namespace std;int n,v1,v2,x1,x2;// 模拟int main(){ int t; cin >>_cocktail with pony
文章浏览阅读6.6k次,点赞3次,收藏9次。Glide是一个非常好用的图片加载框架,它可以很好的缓存图片以提高图片加载效率。 但是在使用的时候,会出现一个问题:当服务器图片资源已经更新,但是URL地址不变时,Glide不会重新加载URL,而是从缓存中读取旧的图片资源。 下面给出两种解决方式: 1、仅使当前网络加载为服务器新数据——治标,一次性: 此方法关键在于指定Re..._glide url不变,图片更新 缓存问题
文章浏览阅读1.2k次。请注意,上述代码中的一些函数需要根据具体的问题和地图定义进行实现,例如加载栅格地图数据、初始化蚂蚁位置、计算概率、选择下一个移动位置、更新信息素、找到最佳路径等。在本篇文章中,我们将介绍如何使用蚁群算法来解决机器人在栅格地图上的路径规划问题,并提供相应的 MATLAB 代码实现。在每个迭代步骤中,蚂蚁根据当前位置、信息素和启发函数计算下一步移动的概率,并根据概率选择下一步的移动位置。然后,更新路径和位置,并根据蚂蚁的路径更新信息素。在每次迭代结束后,我们找到最佳路径,并根据信息素蒸发率更新信息素。_蚁群算法在机器人路径规划