Java给pdf添加页码(这是我之前的一篇文章)出现内存溢出Java heap space
最近闲着没事做,就想着如何优化这个PDF添加页码f的执行效率,我尝试了之前提供的思路,发现不能从根本来解决问题。
首先贴出我电脑的配置 我的用的是华硕的电脑 处理器是AMD R5900HX 内存是16G 3200
我开启多线程来处理这个问题,无论我怎样设置都会出现这个 内存溢出 Java heap space的报错
于是我开始调试jvm
我这是idea 2022版的 下面是对jvm的设置
发现还是无法从根本解决这个问题,于是我思考是不是代码本身造成了内存过多。经过一些调试后发现真的是代码本身的问题。这段代码也是我直接在网上找的一段别人写的代码。
最后得出一个结论就是自己强大才是真的强大!
好了不啰嗦了,上代码 当然这是测试代码,写法不优雅,这里只是为了解决问题而写的,问题就解决了,思路给出来了其他的交给小伙伴们去解决 如果到这里还不能理解的可以百度一波堆栈的区别。(学无止境)
package com.example.demo.test;import com.spire.pdf.PdfDocument;
import com.spire.pdf.automaticfields.PdfCompositeField;
import com.spire.pdf.automaticfields.PdfPageCountField;
import com.spire.pdf.automaticfields.PdfPageNumberField;
import com.spire.pdf.graphics.*;import java.awt.*;
import java.awt.geom.Dimension2D;
import java.awt.geom.Rectangle2D;/*** @Author long* @Date 2022/1/13 16:59* @Version 1.0*/
public class HeaderFooter {private static Font fon = new Font("黑体", Font.PLAIN, 8);private static PdfPageNumberField number = new PdfPageNumberField();private static PdfPageCountField count = new PdfPageCountField();private static PdfPen pen = new PdfPen(PdfBrushes.getGray(), 0.5f);private static PdfTrueTypeFont font = new PdfTrueTypeFont(fon, true);private static PdfCompositeField compositeField = new PdfCompositeField(font, PdfBrushes.getBlack(), "第{0}页 共{1}页", number, count);private static PdfStringFormat pdfStringFormat = new PdfStringFormat(PdfTextAlignment.Right, PdfVerticalAlignment.Top);private static Rectangle2D.Float rfloat = new Rectangle2D.Float();public static void main(String[] args) {//System.out.println(Runtime.getRuntime().availableProcessors());doPages("C:\\test\\pdf0.pdf", "C:\\test\\temp\\pdf3.pdf");}//添加页码public static void doPages(String inPath, String outPath) {//创建pdfDocument对象,并加载PDF文档PdfDocument doc = new PdfDocument();doc.loadFromFile(inPath);//删除有红色字体的一页: Evaluation Warning : The document was created with Spire.PDF for Java.doc.getPages().add();doc.getPages().remove(doc.getPages().get(doc.getPages().getCount() - 1));//添加页眉//drawHeader(doc);//添加页脚drawFooter(doc);//保存文档doc.saveToFile(outPath);}//添加页眉public static void drawHeader(PdfDocument doc) {//获取页面尺寸Dimension2D pageSize = doc.getPages().get(0).getSize();//定义两个float变量float x = 90;float y = 20;for (int i = 0; i < doc.getPages().getCount(); i++) {//添加图片到指定位置PdfImage headerImage = PdfImage.fromFile("C:\\Users\\long\\Desktop\\logo.png");float width = headerImage.getWidth() / 2;float height = headerImage.getHeight() / 2;doc.getPages().get(i).getCanvas().drawImage(headerImage, x, y, width, height);//doc.getPages().get(i).getCanvas().drawLine(pen, x, y + height + 1, pageSize.getWidth() - x, y + height + 1);}}//添加页脚public static void drawFooter(PdfDocument doc) {//获取页面大小Dimension2D pageSize = doc.getPages().get(0).getSize();//定义两个float变量float x = 90;float y = (float) pageSize.getHeight() - 72;long startTime = System.currentTimeMillis();
// Font fon = new Font("黑体", Font.PLAIN, 8);
// PdfPageNumberField number = new PdfPageNumberField();
// PdfPageCountField count = new PdfPageCountField();
// PdfPen pen = new PdfPen(PdfBrushes.getGray(), 0.5f);
// PdfTrueTypeFont font = new PdfTrueTypeFont(fon, true);
// PdfCompositeField compositeField = new PdfCompositeField(font, PdfBrushes.getBlack(), "第{0}页 共{1}页", number, count);
// PdfStringFormat pdfStringFormat = new PdfStringFormat(PdfTextAlignment.Right, PdfVerticalAlignment.Top);
// Rectangle2D.Float rfloat = new Rectangle2D.Float();int pagecCount = doc.getPages().getCount();for (int i = 0; i < pagecCount; i++) {doc.getPages().get(i).getCanvas().drawLine(pen, x, y, pageSize.getWidth() - x, y);compositeField.setStringFormat(pdfStringFormat);Dimension2D fontSize = font.measureString(compositeField.getText());rfloat.setRect((pageSize.getWidth() - x - fontSize.getWidth()),y,fontSize.getWidth(),fontSize.getHeight());compositeField.setBounds(rfloat);compositeField.draw(doc.getPages().get(i).getCanvas());}long endTime = System.currentTimeMillis();System.out.println("运行时长:" + (endTime - startTime));}
}
这是用静态的
Java给pdf添加页码(这是我之前的一篇文章)出现内存溢出Java heap space相关推荐
- JAVA实现 PDF转换 常用工具类(html转PDF、PDF添加页码、PDF文件下载、PDF添加印章或者水印)
JAVA实现 PDF转换 常用工具类(html转PDF.PDF添加页码.PDF文件下载.PDF添加印章或者水印)可直接使用 package com.bestvike.util; import com. ...
- PDF添加页码的工具有什么 PDF添加页码的小窍门
大家在制作PDF文件时,每次结束时都需要给整份PDF文件都添加准确的页码数.以此来方便后期的检查文件工作以及阅读者可更加清晰明了的翻阅文件,找寻自己需要的内容. 那么给PDF添加页码的工具有什么? 其 ...
- 利用PDF编辑软件给PDF添加页码的操作全过程
还记得小时候,在微机电脑课时.老师在教给大家一项操作的时候,老师肯定会详细的,一步一步的将操作全过程展示给大家.老师们如此严谨其,目的也就是为了防止学生们再操作中因为细小的问题,而导致全盘皆错.一步一 ...
- PDF怎么添加页码?PDF添加页码的方法
PDF怎么添加页码呢?现在我们对PDF文件的了解也是比较多的,但是想要给PDF文件添加页码还是比较难得,给PDF添加页码就可以使用迅捷PDF编辑器,下面小编就为大家操作一下PDF添加页码的操作方法. ...
- 如何给pdf添加页码?
很多人将文件生成pdf格式后,发现pdf格式的文件并没有页码显示,这非常不利于查看,这时候大家会想着给pdf格式的文件添加页码显示,在pdf格式文件中如何添加页码呢?不少人对这一问题并不清楚,今天我们 ...
- java获取Pdf文件页码
java获取Pdf文件页码步骤如下: 引入依赖: <dependency><groupId>org.apache.pdfbox</groupId><artif ...
- 一篇文章让你从JAVA零基础入门`OOP`编程12.19
一篇文章让你从JAVA零基础入门OOP编程 前言: 此文为玄子,复习ACCP-S1课程后,整理的文章,文中对知识点的解释仅为个人理解. 配套PPT,站点源码,等学习资料 一.预科 1.1 JAVA 介 ...
- 一篇文章让你从JAVA零基础入门`OOP`编程12.20
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(QQ_3336392096.png)] 一篇文章让你从JAVA零基础入门OOP编程 前言: 此文为玄子,复习ACCP-S1课程后, ...
- 一期完结《一篇文章让你从JAVA零基础入门`OOP`编程》12.21
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(QQ_3336392096.jpg)] 一篇文章让你从JAVA零基础入门OOP编程 前言: 此文为玄子,复习ACCP-S1课程后, ...
- C# Pdf添加页码(iTextSharp)
通过Nuget添加iTextSharp引用,具体代码如下 /// <summary>/// 添加页码/// </summary>/// <param name=" ...
最新文章
- 人人可以理解的区块链100问——区块链记录哪些信息
- Avalonia跨平台入门第十四篇之ListBox折叠列表
- 581. 最短无序连续子数组
- java学习(142):file类的基本创建
- 特征值_陶哲轩数学发现的故事 | 特征值特征向量等式
- devops 开源_没有开源就无法拥有DevOps
- 现代操作系统原理与实践01:操作系统概述
- Gensim官方教程翻译(二)——主题与转换(Topics and Transformations)
- .NET网络编程学习(三)--网络蜘蛛程序(Spider)
- linux系统下Gaussian16和Gaussian view6的详细安装步骤
- 移动开发的设计稿为什么大多数是750px?
- 多应用集中落地,四川区块链产业爆发增长
- 世界豪车 TOP 10
- Windows10下电脑版微信未读消息自动弹窗工具
- 【Unity入门计划】Unity2D动画(2)-脚本与混合树实现玩家角色动画过渡
- IP5306是一款2.1A 充电 2.4 A 放电高集成度移动电源 SOC
- 研究生如何进行文献的搜索和参考文献信息的搜寻
- Java详细讲解OOP面向对象
- VCC、VDD、VSS、VDDA、VSSA、VREF+等标识
- js、++、--、switch、for、if
热门文章
- Rust FFI 编程 - libc crate
- 多示例学习 (multi-instance learning, MIL)学习路线 (分类)
- grep, sed, awk 的用法
- 8.系统研发中的领导意志
- 润肤悦颜各种偏方秘方
- “立字据,你们这群混蛋!”
- bzoj3939 [Usaco2015 Feb]Cow Hopscotch
- JavaScript正则表达式匹配中英文以及常用标点符号白名单写法
- 进程间通信(管道、XSI--->SysV、网络套接字)
- 小女子菜鸟一枚,因本科毕业设计第一次接触安卓开发……图片上传问题求教