一、背景

公司需要一个从本地选择图片生成pdf文件并上传的功能,由于Android本身并没有对pdf的支持,这里选择使用一个第三方的库来达成需求。

二、库的选择

2.1 当前主流的库

在众多Java语言编写的PDf库中,对Android有支持且有一定用户量的的有:iText、Qoppa qPDF工具包、PDFJet。

2.2 三个库的对比如下:

- iText Qoppa PDFJet
应用文件大小 1.52MB 0.93MB 0.67MB
时间消耗 3.7ms 39ms 51.3ms
平均CPU利用率 29% 77.9% 86.8%
修改PDF 没有
加密 没有
形式字段函数 没有
文本提取 没有
将PDF转换为图像 没有 没有
开源 没有
书可用 没有 没有
论坛,邮件列表 没有 没有

2.3 选型

鉴于性能和开源,决定选择iText作为此次接入的PDF库。

三、iText库接入

3.1 资源说明

3.1.1 下载链接

https://github.com/itext/itextpdf/tree/itextg

3.1.2 下载说明

If you want to use iText on Android or the Google App Engine, you need to use iTextG. iTextG is almost identical to iText, except that it only uses classes that are white-listed by Google. All references to java.awt, javax.nio and other “forbidden” packages have been removed.
(在Android上使用iText,需要使用iTextG。iTextG与iText基本相同,只是替换掉了java.awt,javax.nio等Android上不支持的包。)

3.1.3 混淆说明

# itext
-dontwarn com.itextpdf.**
-keep class com.itextpdf.** {*;}

3.2 图片生成pdf方法

3.2.1 设置pdf每页的背景

public class PdfBackground extends PdfPageEventHelper {@Overridepublic void onEndPage(PdfWriter writer, Document document) {//设置pdf背景色为白色PdfContentByte canvas = writer.getDirectContentUnder();Rectangle rect = document.getPageSize();canvas.setColorFill(BaseColor.WHITE);canvas.rectangle(rect.getLeft(), rect.getBottom(), rect.getWidth(), rect.getHeight());canvas.fill();//设置pdf页面内间距PdfContentByte canvasBorder = writer.getDirectContent();Rectangle rectBorder = document.getPageSize();rectBorder.setBorder(Rectangle.BOX);rectBorder.setBorderWidth(BORDER_WIDTH);rectBorder.setBorderColor(BaseColor.WHITE);rectBorder.setUseVariableBorders(true);canvasBorder.rectangle(rectBorder);}
}

3.2.2 根据图片Uri生成pdf

/*** 根据图片生成PDF** @param pdfPath 生成的PDF文件的路径* @param imagePathList 待生成PDF文件的图片集合* @throws IOException 可能出现的IO操作异常* @throws DocumentException PDF生成异常*/
private void createPdf(String pdfPath, List<String> imagePathList) throws IOException, DocumentException {Document document = new Document();PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(pdfPath));//设置pdf背景PdfBackground event = new PdfBackground();writer.setPageEvent(event);document.open();for (int i = 0; i < imagePathList.size(); i++) {document.newPage();Image img = Image.getInstance(imagePathList.get(i));//设置图片缩放到A4纸的大小img.scaleToFit(PageSize.A4.getWidth() - BORDER_WIDTH * 2, PageSize.A4.getHeight() - BORDER_WIDTH * 2);//设置图片的显示位置(居中)img.setAbsolutePosition((PageSize.A4.getWidth() - img.getScaledWidth()) / 2, (PageSize.A4.getHeight() - img.getScaledHeight()) / 2);document.add(img);}document.close();
}

四、参考文献

4.1 iText官方网站:

http://itextpdf.com/

4.2 iText5图片处理相关examples:

http://developers.itextpdf.com/examples/image-examples-itext5

4.3 Stefan Fenz的博客地址:

http://stefan.fenz.at/creating-pdfs-on-android-an-evaluation/

Android环境下生成PDF文件相关推荐

  1. Android 使用PdfDocument生成PDF文件及遇到的问题

    一.PdfDocument使用 PdfDocument是Android原生的生成pdf文件的类,这个类的使用可参考: https://developer.android.google.cn/refer ...

  2. Android使用iText7生成PDF文件

    一:添加依赖 implementation 'com.itextpdf:itext7-core:7.1.13' 二:清单文件AndroidManifest.xml 添加权限 <uses-perm ...

  3. android 原生 bitmap 生成pdf文件

    写这篇文章,是因为我编写这块功能时,公司要求能用android原生代码就不要用第三方,所以,我找了好久都没找到谁在用原生代码生成pdf文件,尤其是把bitmap写入pdf中,所以,在这里,我把原生 生 ...

  4. keil5环境下生成bin文件

    1. 首先对于keil5其编译生成的HEX文件,一般通过勾选如下: 在进行ISP烧写时,就可以通过传送HEX文件进行烧写. 2. 对于烧写而言不仅仅可以通过HEX文件进行烧写,还可以通过BIN文件进行 ...

  5. android studio下生成aar文件,本地调用

    第一步:首先创建一个工程MyAAR工程,让后新建一个Module,新建Module时候选择Android Library 第二步:新建module,选择Android Library, 选择next. ...

  6. opencv生成日志_OpenCV在Android环境下的使用方法

    按照使用语言角度,在Android下使用OpenCV有以下几种方式: 完全使用Java语言 完全使用C++语言 混合使用Java和C++语言 下面分别讲一下怎么做,并说明这样做可能需要注意的问题. 完 ...

  7. linux如何编译tex,linux下编译bib、tex生成pdf文件

    实验: 在linux环境下,编译(英文)*.bib和*.tex文件,生成pdf文件. 环境: fedora 20(uname -a : Linux localhost.localdomain 3.19 ...

  8. Android生成pdf文件之PdfDocument及踩过的坑

    有时候项目中可能会遇到这样的需求,如何将android中界面显示的内容生成pdf,这里讲述的是使用android原生的PdfDocument,并没有使用框架,其一是使用起来非常的简单,但是也会也到一些 ...

  9. android pdfjet_GitHub - lnj721/PdfBuilder: Android端使用图片生成PDF文件

    PdfBuilder Android端使用图片生成PDF文件 一.应用场景 从本地选择图片生成pdf文件,由于Android本身并没有对pdf的支持,这里选择使用一个第三方的库来达成需求. 二.库的选 ...

最新文章

  1. python logger日志工具类
  2. sql2008r 收缩数据库日志log文件;删除errorlog文件的方法
  3. android查看Logcat
  4. 从HashiCorp Nomad对上百万容器进行调度所学到的经验
  5. jquery的validate表单验证表单注册插件
  6. 【学习 OpenCV】—— Mat setTo/convertTo/copyTo
  7. js的注释方式和快捷键
  8. Windows 10微软拼音中添加自定义短语
  9. php源码 拼车网顺风车_php版某拼车网源码分享 微信拼车打车约车源码 微信拼车+手机拼车+双终端+发布平台...
  10. 台式计算机怎么强制关机,台式电脑怎么强制关机
  11. 小程序分享功能以及坑
  12. while和do while的用法区别
  13. Java温故而知新-递归
  14. AHB2APB 同步桥的设计代码(Verilog)
  15. 愚人节,60条短信祝你笑口常开……
  16. scrapy爬取苏宁所有图书
  17. 经济管理类的顶刊和核心整理
  18. Final Cut Pro 必备插件
  19. SKU解密,修改SKU的影响,修改SKU流量下滑原因
  20. LXC、LXD、Docker的区别与联系

热门文章

  1. chunked java_HTTP协议的chunked编码
  2. mysql sql批量插入_mysql批量插入数据的纯sql脚本
  3. Minigui 调试支持藏文过程记录
  4. iOS 横竖屏的切换以及个别界面横屏
  5. android 环信红包异常,环信上线新特征:阅后即焚+消息撤回+红包
  6. 手机照片删除了怎么恢复
  7. 目前最快,视频剪辑批量制作字幕方法,剪映str字幕提取!
  8. 数据结构——时间复杂度和空间复杂度
  9. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java基于2023最新SSM计算机毕业设计选题大全(附源码+LW)之JAVA的社区疫情防控管理信息系统的设计与实现khjit
  10. 小程序swiper修改指示点样式