当前位置: 首页 > news >正文

合并PDF出现OOM异常

  • 优化方法一:使用PdfSmartCopy类代替PdfCopy类。这个类可以在合并PDF文件时,检测并消除重复的对象,从而减少内存的占用。您可以参考以下代码示例:
//创建一个Document对象
Document document = new Document();//创建一个PdfSmartCopy对象
PdfSmartCopy copy = new PdfSmartCopy(document, new FileOutputStream("output.pdf"));//打开Document对象
document.open();//创建一个PdfReader对象
PdfReader reader = null;//遍历要合并的PDF文件
for (String file : files) {//加载PDF文件reader = new PdfReader(file);//获取PDF文件的总页数int n = reader.getNumberOfPages();//遍历每一页,添加到PdfSmartCopy对象中for (int page = 0; page < n;) {copy.addPage(copy.getImportedPage(reader, ++page));}
}//关闭PdfReader对象
reader.close();//关闭Document对象
document.close();//创建一个PdfStamper对象
PdfStamper stamper = new PdfStamper(new PdfReader("output.pdf"), new FileOutputStream("output.pdf"));//获取总页数
int pageCount = stamper.getReader().getNumberOfPages();//遍历每一页,添加页码
for (int i = 1; i <= pageCount; i++) {//获取当前页PdfContentByte content = stamper.getOverContent(i);//设置字体和颜色content.setFontAndSize(BaseFont.createFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.NOT_EMBEDDED), 12);content.setRGBColorFill(0, 0, 0);//获取当前页的宽度和高度Rectangle pageSize = stamper.getReader().getPageSize(i);float width = pageSize.getWidth();float height = pageSize.getHeight();//计算页码的位置float x = width / 2;float y = 10;//添加页码content.beginText();content.showTextAligned(PdfContentByte.ALIGN_CENTER, "第" + i + "页,共" + pageCount + "页", x, y, 0);content.endText();
}//关闭PdfStamper对象
stamper.close();
  • 优化方法二:使用PdfWriter类代替PdfCopy类。这个类可以在合并PDF文件时,直接将每一页写入到输出流中,而不需要将整个文档加载到内存中。可以参考以下代码示例:
//创建一个Document对象
Document document = new Document();//创建一个PdfWriter对象
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("output.pdf"));//打开Document对象
document.open();//创建一个PdfImportedPage对象
PdfImportedPage page = null;//创建一个PdfReader对象
PdfReader reader = null;//遍历要合并的PDF文件
for (String file : files) {//加载PDF文件reader = new PdfReader(file);//获取PDF文件的总页数int n = reader.getNumberOfPages();//遍历每一页,添加到PdfWriter对象中for (int i = 1; i <= n; i++) {//获取当前页的宽度和高度Rectangle pageSize = reader.getPageSizeWithRotation(i);float width = pageSize.getWidth();float height = pageSize.getHeight();//设置Document对象的页面大小document.setPageSize(pageSize);//创建一个新的页面document.newPage();//导入当前页page = writer.getImportedPage(reader, i);//将当前页添加到PdfWriter对象中writer.addPageDictEntry(PdfName.ROTATE, pageSize.getRotationAsPageDictEntry());writer.addDirectImageSimple(page);writer.getCurrentPage().add(page);//创建一个PdfContentByte对象PdfContentByte content = writer.getDirectContent();//设置字体和颜色content.setFontAndSize(BaseFont.createFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.NOT_EMBEDDED), 12);content.setRGBColorFill(0, 0, 0);//计算页码的位置float x = width / 2;float y = 10;//添加页码content.beginText();content.showTextAligned(PdfContentByte.ALIGN_CENTER, "第" + i + "页,共" + pageCount + "页", x, y, 0);content.endText();}
}//关闭PdfReader对象
reader.close();//关闭Document对象
document.close();
  • 优化方法三:使用PdfReader类的partial和selectPages方法。这些方法可以在加载PDF文件时,只读取需要的页面,而不需要将整个文档加载到内存中。可以参考以下代码示例:
//创建一个Document对象
Document document = new Document();//创建一个PdfCopy对象
PdfCopy copy = new PdfCopy(document, new FileOutputStream("output.pdf"));//打开Document对象
document.open();//创建一个PdfReader对象
PdfReader reader = null;//遍历要合并的PDF文件
for (String file : files) {//设置partial为true,只读取需要的页面reader = new PdfReader(new RandomAccessFileOrArray(file), null);reader.consolidateNamedDestinations();reader.partial = true;//获取PDF文件的总页数int n = reader.getNumberOfPages();//创建一个List对象,存储需要的页面List<Integer> pages = new ArrayList<Integer>();//遍历每一页,添加到List对象中for (int i = 1; i <= n; i++) {pages.add(i);}//使用selectPages方法,只选择需要的页面reader.selectPages(pages);//将选择的页面添加到PdfCopy对象中for (int i = 0; i < pages.size(); ) {copy.addPage(copy.getImportedPage(reader, ++i));}
}//关闭PdfReader对象
reader.close();//关闭Document对象
document.close();//创建一个PdfStamper对象
PdfStamper stamper = new PdfStamper(new PdfReader("output.pdf"), new FileOutputStream("output.pdf"));//获取总页数
int pageCount = stamper.getReader().getNumberOfPages();//遍历每一页,添加页码
for (int i = 1; i <= pageCount; i++) {//获取当前页PdfContentByte content = stamper.getOverContent(i);//设置字体和颜色content.setFontAndSize(BaseFont.createFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.NOT_EMBEDDED), 12);content.setRGBColorFill(0, 0, 0);//获取当前页的宽度和高度Rectangle pageSize = stamper.getReader().getPageSize(i);float width = pageSize.getWidth();float height = pageSize.getHeight();//计算页码的位置float x = width / 2;float y = 10;//添加页码content.beginText();content.showTextAligned(PdfContentByte.ALIGN_CENTER, "第" + i + "页,共" + pageCount + "页", x, y, 0);content.endText();
}//关闭PdfStamper对象
stamper.close();

[java - How to avoid OutOfMemoryError when merging PDFs using iText? - Stack Overflow]

[java - How to merge pdf files without loading all the documents in memory? - Stack Overflow]

[java - How to merge pdf files without loading all the documents in memory? - Stack Overflow]

http://www.lryc.cn/news/247613.html

相关文章:

  • c语言-数据结构-链式二叉树
  • DelayQueue介绍
  • centos8 redis 6.2.6源码安装+主从哨兵
  • 机器学习之危险品车辆目标检测
  • DHCP协议及实验omnipeek抓包工具分析 IPv4协议
  • 考过了PMP,面试的时候应该怎么办?
  • 技巧-PyTorch中num_works的作用和实验测试
  • Android:FragmentTransaction
  • 5.golang字符串的拆解和拼接
  • 配置 Mantis 在 Windows 上的步骤
  • Android 单元测试初体验(二)-断言
  • 通过ros系统中websocket中发送sensor_msgs::Image数据给web端显示
  • 【 Kubernetes 风云录 】- Istio 应用多版本流量控制
  • 比尔盖茨:GPT-5不会比GPT-4好多少,生成式AI已达到极限
  • let const 与var的区别
  • git 把项目托管到码云
  • sCrypt 现已支持各类主流前端框架
  • leetcode:2549. 统计桌面上的不同数字(python3解法)
  • 数据结构 / day03作业
  • 异步爬虫提速实践-在Scrapy中使用Aiohttp/Trio
  • Python与设计模式--访问者模式
  • 为社会做贡献的EasyDarwin 4.0.1发布了,支持视频点播、文件直播、摄像机直播、直播录像、直播回放、录像MP4合成下载
  • CG向量和矩阵元素的获取
  • 牛客 算法题 golang语言实现
  • 鸿蒙开发报错:agconnect sdk not initialized. please call initialize()【BUG已解决】
  • 极智芯 | 解读国产AI算力算能产品矩阵
  • docker介绍、部署与常用命令
  • windows定时任务命令工具schtasks
  • 多个nginx共享值、缓存问题
  • 【2023传智杯】第六届传智杯程序设计挑战赛AB组-DEF题解题分析详解【JavaPythonC++解题笔记】