PdfBuilder

Android端使用图片生成PDF文件

一、应用场景

从本地选择图片生成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 下载链接

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 {

@Override

public 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 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官方网站:

4.2 iText5图片处理相关examples:

4.3 Stefan Fenz的博客地址:

android pdfjet_GitHub - lnj721/PdfBuilder: Android端使用图片生成PDF文件相关推荐

  1. Android环境下生成PDF文件

    一.背景 公司需要一个从本地选择图片生成pdf文件并上传的功能,由于Android本身并没有对pdf的支持,这里选择使用一个第三方的库来达成需求. 二.库的选择 2.1 当前主流的库 在众多Java语 ...

  2. iText的使用(1)-- 组合图片生成PDF

    使用iText组合图片生成PDF文件 关于iText的介绍不必说了,简单用它的功能合并若干图片到一个PDF中,目前iText支持的图像格式有:GIF, Jpeg, PNG, wmf等格式. 代码如下: ...

  3. Android 如何加载网页、图片以及PDF文件之项目实战

    这里对于App有需求需要做webView加载页面以及图片,pdf文件等,可以参考一下这篇文章: 我在做项目应用时,有个需求是把用户不同类型的数据上传到后台. 对于用户的数据大体分为以下类型: 图片(j ...

  4. Android使用iText7生成PDF文件

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

  5. android 原生 bitmap 生成pdf文件

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

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

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

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

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

  8. java图片转换pdf_Java实现图片转换PDF文件的示例代码

    最近因为一些事情,需要将一张简单的图片转换为PDF的文件格式,在网上找了一些工具,但是这些工具不是需要注册账号,就是需要下载软件. 而对于只是转换一张图片的情况下,这些操作显然是非常繁琐的,所以作者就 ...

  9. 将HTML文件转换为PDF文件(Thymeleaf模板转换,简单解决中文问题, 解决HTML带图片转换PDF文件问题)

    将HTML文件转换为PDF文件 一.导入依赖 <!-- itext生成Pdf --> <dependency><groupId>com.itextpdf</g ...

最新文章

  1. 基于Smiles2vec预测化合物物理性质
  2. python爬虫原理-爬虫原理解析
  3. c++局域网主动ftp_【Jmeter】使用Jmeter对FTP协议的测试
  4. Keras .ImageDataGenerator图像增强用法大全以及如何和模型结合起来(有代码)
  5. linux 跨IP拷贝命令 scp
  6. Scude导入MySQL_FM2017_FMF赛季更新和真实修正数据库[更新至9.9,超过89000个更新]
  7. 嵌入式面试中常见的问答题(线程进程、TCP等)
  8. 使用Epoll 在 Linux 上开发高性能应用服务器
  9. PaperWeekly 第十一期
  10. (1)win10 64位系统ISE14.7闪退问题(FPGA不积跬步101)
  11. asp.net checkboxlist绑定数据读取出来
  12. 1.大数据架构详解:从数据获取到深度学习 --- 大数据的本质
  13. sql server 远程连接问题
  14. 提高专业技能之 “专利申请”
  15. Jepack4.5.1上手动安装cuda10.0 cudnn 7, Jepack4.5.1 TX2 i安装pytorch1.6.0
  16. 蓝牙耳机播放音频无声问题的解决方案
  17. 【评价模型】层次分析法(AHP) 个人总结 续更
  18. 服务器的所有网站共用443,多个ssl证书共用443端口apache
  19. DB2JAVIT RC 9505
  20. mathematica 矩阵对角化

热门文章

  1. JavaScript 流行度最高,Java 屈居第三! | 2020 最新软件开发状况报告
  2. Milvus加入LF AI孵化,立志成为最流行的AI数据平台
  3. 库克:苹果从没有垄断;微信搜索升级;微软发布首款支持 Linux 的 Office 应用 | 极客头条...
  4. 漫画:如何给女朋友解释什么是“锟斤拷”?
  5. 一位程序员 8 年的物联网奋斗史
  6. NASA 遭攻击,安全 Bug 仍未解决!
  7. 直接拿来用!盘点四款优秀的开源协作文本编辑器
  8. @程序员,正在自学机器学习?这六点一定要牢记!
  9. AI 删库,程序员背锅?
  10. 动辄年薪 25 万只是白菜价的人工智能黄了?