iText 合并多个 pdf 文件

  • iText 合并多个 pdf 文件
    • 核心代码
    • 完整的类代码
    • 参考代码
    • 参考来源

iText 合并多个 pdf 文件

核心代码

/*** 合并多个pdf** @param os    合并的pdf输出目标流* @param files 需要被合并的多个pdf列表*/
public static void mergePdf(OutputStream os, List<byte[]> files) {Document document = null;try {// 获取纸张大小并实例化一个新的空文档, 例如 A5 纸document = new Document(new PdfReader(files.get(0)).getPageSize(1));// 实例化复制工具final PdfCopy copy = new PdfCopy(document, os);// 打开文档准备写入内容document.open();// 循环所有pdf文件for (byte[] file : files) {// 读取pdffinal PdfReader reader = new PdfReader(file);// 获取页数final int numberOfPages = reader.getNumberOfPages();// pdf的所有页, 从第1页开始遍历, 这里要注意不是0for (int i = 1; i <= numberOfPages; i++) {document.newPage();// 把第 i 页读取出来final PdfImportedPage page = copy.getImportedPage(reader, i);// 把读取出来的页追加进输出文件里copy.addPage(page);}}} catch (IOException | DocumentException e) {throw new RuntimeException(e);} finally {if (document != null) {document.close();}}
}

完整的类代码


import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.PdfCopy;
import com.itextpdf.text.pdf.PdfImportedPage;
import com.itextpdf.text.pdf.PdfReader;import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;/*** @see <a href="https://www.cnblogs.com/whatlonelytear/p/9040600.html">用itext合并多个pdf文件【转】【补】</a>*/
public class PdfDemo {public static void main(String[] args) throws IOException {// 远程文件List<byte[]> fileList = getRemoteFiles();// 本地文件// List<byte[]> fileList = getLocalFiles("/tmp/pdf");// 使用字节os可以让数据写到内存里final var os = new ByteArrayOutputStream();// 获取合并的pdfmergePdf(os, fileList);// 写入硬盘Files.write(Paths.get("/tmp/pdf/all.pdf"), os.toByteArray());}private static List<byte[]> getRemoteFiles() throws IOException {// 获取所有urlvar urlList = new String[]{"file:///tmp/pdf/04d4c382-18bd-4739-84fb-c1fa8c346222.pdf","file:///tmp/pdf/21ad1053-bb2e-4f8d-b29f-12f036f5edd6.pdf"};// 文件列表List<byte[]> fileList = new ArrayList<>();// 下载所有文件for (String path : urlList) {// 建立连接final URLConnection conn = new URL(path).openConnection();// 下载文件final InputStream is = conn.getInputStream();// 读取进内存,这个时候文件已经完全存在于内存里了// 如果不读成 byte 数组的话, 输入流可能会关闭// final var bytes = is.readAllBytes(); // jdk 9 提供的方法final byte[] bytes = readAllBytes(is);fileList.add(bytes);}return fileList;}/*** 把 inputStream 里的所有数据读取出来** @param inputStream 输入流* @return 输入流里的所有数据* @throws IOException 当读取数据出错时*/private static byte[] readAllBytes(InputStream inputStream) throws IOException {final ByteArrayOutputStream os = new ByteArrayOutputStream();final byte[] buffer = new byte[1024];while (inputStream.read(buffer) != -1) {os.write(buffer);}return os.toByteArray();}/*** 读取指定目录下的所有文件** @param location 指定目录, 例如 "/tmp/pdf"* @return 指定目录下的所有文件的内容* @throws IOException 当读取文件异常时*/private static List<byte[]> getLocalFiles(String location) throws IOException {final Path p = Paths.get(location);final Stream<Path> list = Files.list(p);return list.map(file -> {try {return Files.readAllBytes(file);} catch (IOException e) {throw new RuntimeException(e);}}).collect(Collectors.toList());}/*** 合并多个pdf** @param os    合并的pdf输出目标流* @param files 需要被合并的多个pdf列表*/public static void mergePdf(OutputStream os, List<byte[]> files) {Document document = null;try {// 获取纸张大小并实例化一个新的空文档, 例如 A5 纸document = new Document(new PdfReader(files.get(0)).getPageSize(1));// 实例化复制工具final PdfCopy copy = new PdfCopy(document, os);// 打开文档准备写入内容document.open();// 循环所有pdf文件for (byte[] file : files) {// 读取pdffinal PdfReader reader = new PdfReader(file);// 获取页数final int numberOfPages = reader.getNumberOfPages();// pdf的所有页, 从第1页开始遍历, 这里要注意不是0for (int i = 1; i <= numberOfPages; i++) {document.newPage();// 把第 i 页读取出来final PdfImportedPage page = copy.getImportedPage(reader, i);// 把读取出来的页追加进输出文件里copy.addPage(page);}}} catch (IOException | DocumentException e) {throw new RuntimeException(e);} finally {if (document != null) {document.close();}}}
}

参考代码

该代码来自

用itext合并多个pdf文件【转】【补】
https://www.cnblogs.com/whatlonelytear/p/9040600.html

    /*** 输出多个pdf合并出来的pdf, 这个方法未经改良** @param fileList 文件地址列表, 是指硬盘目录* @param output   输出的目标流* @see <a href="https://www.cnblogs.com/whatlonelytear/p/9040600.html">用itext合并多个pdf文件【转】【补】</a>*/public static void morePdfTopdf(List<String> fileList, OutputStream output) {Document document = null;try {document = new Document(new PdfReader(fileList.get(0)).getPageSize(1));PdfCopy copy = new PdfCopy(document, output);document.open();for (int i = 0; i < fileList.size(); i++) {PdfReader reader = new PdfReader(fileList.get(i));int n = reader.getNumberOfPages();// 获得总页码for (int j = 1; j <= n; j++) {document.newPage();PdfImportedPage page = copy.getImportedPage(reader, j);// 从当前Pdf,获取第j页copy.addPage(page);}System.out.println(i);}} catch (IOException | DocumentException e) {e.printStackTrace();} finally {if (document != null) {document.close();}}}

maven 依赖为

<!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf -->
<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13.1</version>
</dependency>

我使用的是 jdk 11

<build><plugins><plugin><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>11</source><target>11</target></configuration></plugin></plugins>
</build>

参考来源

  • 用itext合并多个pdf文件【转】【补】

iText 合并多个 pdf 文件相关推荐

  1. java 使用itext合并多个pdf文件成一个pdf

    maven <!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf --><dependency><g ...

  2. Java实现多张图片合并成一份PDF文件

    Java实现多张图片合并成一份PDF文件,一行两列展示 引入依赖包 <dependency><groupId>com.lowagie</groupId><ar ...

  3. Python实现按序合并多个pdf文件

    技术交流QQ群:1027579432,欢迎你的加入! 欢迎关注我的微信公众号:CurryCoder的程序人生 1.整体实现步骤 在日常办公中,我们可能会有一个需求,需要将多个pdf文件合并成一个文件. ...

  4. shell换行合并多个文件_如何合并多个pdf文件?这里有合并PDF最简单的方法

    如何合并多个pdf文件?今天在整理一些PDF文件的时候,由于文件的数量比较多,我就想着将这些PDF文件合并起来,好在平时也了解了一些PDF合并的方法,很快就完成了文件的合并.想到应该还有很多朋友还不知 ...

  5. python合并多个pdf_python合并多个pdf文件

    假设您有个无聊的工作,将几十个PDF文档合并成一个PDF文件. 他们每个都有封面页作为第一页,但你不希望在最终结果中重复覆盖表. 即使有有很多免费的程序来组合PDF,其中许多只是合并整个文件在一起. ...

  6. 如何合并多个PDF文件?这几个小妙招快来码住吧

    在日常工作中,由于PDF文件具有不可编辑性,因此,我们也经常使用PDF格式来传输文件.可当文件数量较多时,一个个传输较麻烦且对方接收文件也不方便,但如果将多个PDF文件合并成一个文件就可以解决上述的烦 ...

  7. python多图片合并pdf_Python结合ImageMagick实现多张图片合并为一个pdf文件的方法

    本文实例讲述了Python结合ImageMagick实现多张图片合并为一个pdf文件的方法.分享给大家供大家参考,具体如下: 前段时间买了不少书,现在手头的书籍积累的越来越多,北京这边租住的小屋子空间 ...

  8. 怎么合并多个PDF文件?仅需三个步骤,轻松合成一个文档

    大家在日常学习.工作中有没有碰到过这种情况,当完成一项任务时,需要在网上寻找各式各样的PDF文档资料,而寻找完之后,为了方便阅读与整理,将它们合并成一个PDF文件不失为一个好方法. 有的小伙伴可能刚接 ...

  9. PHP fpdi合并多个PDF文件,取多个PDF特定页数合并以及导出

    在说之前,先说明一下,FPDI 插件,不能操作被 pdf 软件编辑过的 pdf 文件. 在我们写项目的时候,经常需要对PDF文件进行操作.例如:合并多个PDF文件,取PDF特定页数以及合并. PHP ...

最新文章

  1. 怎么修改nginx的access.log的时间格式
  2. 第六届全国大学生智能汽车竞赛获奖名单
  3. 连接控制台_智能消防水炮视频系统连接方法
  4. 定期存单丢了被别人捡到,里面的存款会不会被领走?
  5. saas是什么意思_为什么越来越多的人选择SaaS模式的crm客户管理系统?
  6. linux一步一脚印---more、less、head、tail
  7. 3dmax人物表情动画、骨骼动画、半透明材质导出FBX文件、导入unity的方法
  8. F1C100S自制开发板调试过程
  9. 紫罗兰永恒花园rust简谱_Sincerely钢琴谱_TRUE_紫罗兰永恒花园OP
  10. AD软件绘制stm32最小系统电路原理图与PCB图
  11. 程序员创业:小程序开发费用报价表,包含项目工期和费用明细
  12. 四川地区办理增值电信经营许可证
  13. opencv-viz模块简单示例
  14. MATLAB实现小波变换去噪
  15. 推荐10个AI人工智能技术网站
  16. linux之nohup命令
  17. Chrome 插件 记录
  18. 腾讯发布QQ影像软件 山寨picasa/美图
  19. 20155318 《网络攻防》Exp4 恶意代码分析
  20. 计算机技能节活动作文,技能节观后感这500字作文

热门文章

  1. kernel:mce: [Hardware Error]: TSC 0 ADDR 1938f0cc0 MISC 401a9a86 是什么意思
  2. SAAS系统架构之成熟度模型
  3. iOS小技能:蓝牙打印商品价签和交易小票的模版,实现自动连接最近使用的打印机 (针对佳博GP-2120TU型号为例子进行展开) 【包含完整demo源码】
  4. CANoe与外界的信息交互-UDP实现
  5. 【C++】Complex复数类运算符重载(类的成员函数实现)
  6. Charles 注册、抓包 详细操作手册
  7. 北大青鸟培训第四天:HTML和CSS相关知识 (持续更新)
  8. c#获取计算机全名的方法
  9. 独家 | 十四问Roadstar.ai 创始人佟显乔、衡量,了解解聘风暴始末...
  10. 前端自动化测试——vue单元测试vue-test-utils