依赖文件:

<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.10</version>
</dependency>
<dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version>
</dependency>

创建PDF文件

public PdfReader getPdfBytes(Element element) {if (element == null) {return null;}Document document = new Document();try {ByteArrayOutputStream bos = new ByteArrayOutputStream();PdfWriter writer = PdfWriter.getInstance(document, bos);writer.setFullCompression();writer.setCompressionLevel(PdfStream.BEST_COMPRESSION);document.open();document.add(element);document.close();writer.close();return new PdfReader(bos.toByteArray());} catch (Exception e) {logger.error("getPdfBytes error", e);}return null;
}public PdfPTable getUserTableInfo(List<UserDataVo> data) {PdfPTable table = new PdfPTable(3);table.setWidthPercentage(100);float width = PageSize.A4.getWidth() - 40;float dataWidth = width / 4;float[] columnWidth = new float[] { dataWidth, dataWidth, dataWidth * 2};try {table.setTotalWidth(columnWidth);} catch (Exception e) {table.setTotalWidth(width);}table.addCell(getPdfCellInfo("ID"));table.addCell(getPdfCellInfo("用户"));table.addCell(getPdfCellInfo("简介"));if (CollectionUtils.isNotEmpty(data)) {data.stream().forEach(col -> {table.addCell(getPdfCellInfo(col.getId()));table.addCell(getPdfCellInfo(col.getUserName()));table.addCell(getPdfCellInfo(col.getUserText()));});}return table;
}
private PdfPCell getPdfCellInfo(String name) {return getPdfCellInfo(name, 1);
}
private PdfPCell getPdfCellInfo(String name, int rowSpan) {Font font = getBaseFontInstance();PdfPCell cell = new PdfPCell(new Paragraph(StringUtils.defaultString(name), font));cell.setHorizontalAlignment(Element.ALIGN_CENTER);cell.setVerticalAlignment(Element.ALIGN_MIDDLE);if (rowSpan > 1) {cell.setRowspan(rowSpan);}return cell;
}
public static Font getBaseFontInstance() {if (baseFont == null) {baseFont = getPdfFont();}return baseFont;
}
private static Font getPdfFont() {try {BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);return new Font(bf, 10);} catch (Exception e) {return null;}
}

合并pdf

public byte[] createAndMergeBlobPdf(List<PdfReader> readers) {if (CollectionUtils.isEmpty(readers)) {return null;}try {ByteArrayOutputStream bos = new ByteArrayOutputStream();Document document = new Document();if (CollectionUtils.isNotEmpty(readers)) {PdfCopy copy = new PdfCopy(document, bos);copy.setFullCompression();copy.setCompressionLevel(PdfStream.BEST_COMPRESSION);document.open();for (PdfReader reader: readers) {if (reader != null) {int n = reader.getNumberOfPages();for (int j = 1; j <= n; j++) {document.newPage();PdfImportedPage page = copy.getImportedPage(reader, j);copy.addPage(page);}reader.close();}}document.close();copy.close();}return bos.toByteArray();} catch (Exception e) {logger.error("createAndMergeBlobPdf error", e);}return null;
}

优化:PdfCopy 更换为PdfSmartCopy,能压缩一半的大小

  • PdfCopy:它会存储两个不同的图片流对象,在索引表中会引用两次,因此虽然是一个相同的图片,但是在不同的页面上会分别显示对应的图片。
  • PdfSmartCopy:经过它处理,会重建索引表,会把这个图片流对象引用到不同的页面上,而这个图片对象只存储了一份。

PdfCopy处理比较快,但生成的文件的大小会很大,PdfSmartCopy比较慢,会消耗更多内存,但文件大小会很小。

PDF生成、合并及压缩优化(Java)相关推荐

  1. java实现pdf生成,包括合并图片

    参考帖子: 这位大佬的帖子必读,因为涉及到pdf创建表单的教程: java使用itext填充pdf模板,超简单教学,有手就行 以下是学习当中参考的帖子: java pdf域插入img_java实现在p ...

  2. java Web程序使用wro4j合并、压缩js、css等静态资源

    在Web项目中,js.css合并压缩,不仅有利于减少Http请求数量.减少宽带资源占用,还能有效的管理各种js.css的引入,使整个项目更加有序.而对于访问用户来说,其更大的好处是增加了页面的打开速度 ...

  3. java css js 合并_java Web程序使用wro4j合并、压缩js、css等静态资源

    在Web项目中,js.css合并压缩,不仅有利于减少Http请求数量.减少宽带资源占用,还能有效的管理各种js.css的引入,使整个项目更加有序.而对于访问用户来说,其更大的好处是增加了页面的打开速度 ...

  4. java使用freemark实现word(.doc/.docx)/pdf生成和导出(附源码和模板文件)

    freemark生成word/pdf 一. 背景 二.实现的技术选型以及遇到的坑 三.最终的效果 2.1 `.doc` word效果展示 2.1 `.docx` word效果展示 2.2 docx w ...

  5. java将多个pdf文件合并成一个pdf文件

    需要下载jar:https://pan.baidu.com/s/1_wOUUAqWz_5jbfwzMP8ahg package com.skysz.framework.file;import java ...

  6. itext根据模版生成PDF与合并多个PDF以及向已存在PDF增加水印设置权限等操作

    我之前写了一篇文章讲了itext的基础操作常用方法(https://my.oschina.net/itazi/blog/1812042),但是有时涉及到比较复杂的PDF生成,手工操作就很复杂,可以使用 ...

  7. 用JAVA将多个PDF文件合并成一个PDF文件

    实现所需JAR包:pdfbox-1.7.1 JAR包下载地址:https://pdfbox.apache.org/ pom依赖: <dependency><groupId>or ...

  8. 从入门到精通(分布式文件系统架构)-FastDFS,FastDFS-Nginx整合,合并存储,存储缩略图,图片压缩,Java客户端

    从入门到精通-分布式文件系统架构-FastDFS,FastDFS-Nginx整合,合并存储,存储缩略图,图片压缩,Java客户端 一.FastDFS介绍 二.流程图 FastDFS架构原理分析(重点) ...

  9. thinkphp5 图片压缩旋转_【好工具】在线免费无限制的PDF处理工具(转换、编辑、分割、合并、压缩)...

    在线好用的 PDF 编辑工具,PDF 转文档,PDF 压缩.编辑.分割不再难,解密 PDF 文档也在行,快来试试- 作者 & 编辑 | Leong SmallPDF SmallPDF http ...

最新文章

  1. 全球芯片行业现状分析:大家都在依赖美国 未来如何破局?
  2. MyEclipse10安装SVN插件
  3. CTF web题总结--绕过正则表达式
  4. 大唐电信JAVA笔试题面试题
  5. python怎么显示结果_python中plot实现即时数据动态显示方法
  6. Blender文档翻译:Operators tutorial(操作教程)
  7. vba 循环读取单元格_利用VBA打开顺序文件,并读取
  8. db2 查看表结构_数据库结构文档的生成利器
  9. Java开发工程师,每个阶段需要掌握什么重点?
  10. rf 遍历列表_RF学习笔记
  11. 2019-数学建模美赛-B题翻译
  12. 各种材料衣服的保养 全面知识分享
  13. 企业微信登陆服务器设置,企业微信怎么登入
  14. 3D打印经验分享导航
  15. oracle12c的CDB与PDB
  16. 项目管理面试常见问题及答案
  17. 社区团购小程序怎么做,全流程解析
  18. 如何使用unity制作雷达探测目标效果动画
  19. Linux查看DNS地址以及端口,nslookup命令以及更强大的dig命令
  20. 小型计算机电源,身材虽小五脏俱全 精致SFX小电源推荐榜

热门文章

  1. VS2005 CBRUSH笔刷的使用
  2. AD20差分对(DifferentialPair)提高了信号传输的抗干扰性
  3. Kubernetes 常见运维技巧
  4. 装修就选集成墙板装饰材料
  5. 云计算起源:一个单词的演变,见证了一个时代的开端
  6. Mac labelme安装及运行时崩溃bug解决
  7. 《深度工作》一书摘抄
  8. 中小学生护眼台灯哪种质量好?分享适合中小学生的护眼台灯
  9. 第十一届蓝桥杯国赛-第10题-蓝跳跳
  10. 苹果为什么这么红?——美国之行总结短评之一