以前有个需求就是要把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 方法的功能。