欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > 如何在Java中使用pdfbox,进行生成pdf操作,如文本居中,数据二列显示及图片显示?

如何在Java中使用pdfbox,进行生成pdf操作,如文本居中,数据二列显示及图片显示?

2024/10/25 0:25:22 来源:https://blog.csdn.net/Do_LaLi/article/details/139458772  浏览:    关键词:如何在Java中使用pdfbox,进行生成pdf操作,如文本居中,数据二列显示及图片显示?

pdfbox的基本使用

1. 添加 PDFBox 依赖
首先,确保你的项目中已经添加了 PDFBox 的 Maven 依赖。你可以使用类似以下的 Maven 依赖配置:

    <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.24</version> </dependency><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox-tools</artifactId><version>2.0.24</version> </dependency>

2.创建pdf, 准备中文字体文件(如果你生成的pdf中没有中文可忽略)
为了支持中文字体,你需要有一个中文字体文件(如 .ttf 或 .otf 格式)。你可以从网络上下载常用的中文字体,如“微软雅黑”、“宋体”等。也可以使用本地字体,路径在C:\Windows\Fonts\下。

 // 创建一个页面并添加到文档中PDDocument document = new PDDocument();PDPage page = new PDPage(PDRectangle.A4);document.addPage(page);// 创建一个内容流以向页面添加内容PDPageContentStream contentStream = new PDPageContentStream(document, page);

3. 加载中文字体
在 Java 代码中,你需要使用 PDFBox 的 API 来加载中文字体。这通常涉及到使用 PDType0Font.load() 方法,该方法可以从文件中加载字体
案例:

 //加载加粗字体文件 PDType0Font jcload = PDType0Font.load(document, new FileInputStream("C:\\Windows\\Fonts\\SimHei.ttf"));
//加载常规字体文件 PDType0Font cgload = PDType0Font.load(document, new FileInputStream("C:\\Windows\\Fonts\\SimKai.ttf"));

4. 文本居中显示
在制作pdf的过程中文本居中显示是常见的如标题,首先我们要知道写入文本的高度和宽度,然后再计算出显示在pdf上的起始位置,x的值和y值。
案例:

//                pdf的长,宽float pageWidth = page.getMediaBox().getWidth();float pageHeight = page.getMediaBox().getHeight();
//                标题本身的长,宽String title = "中国****有限公司上海分公司****";//PDType0Font中的方法实现,其中fontSize是字体大小int fontSize = 18;float titleWidth = jcload.getStringWidth(title) / 1000 * fontSize;float titleHeight = jcload.getFontDescriptor().getFontBoundingBox().getHeight() / 1000 * fontSize;
//上边距int marginTop = 70;//居中的起始x值float startX = (pageWidth - titleWidth) / 2;//居中的起始Y值float startY = pageHeight - marginTop - titleHeight;//设置字体和大小contentStream.setFont(jcload, fontSize);contentStream.beginText();
//居中显示contentStream.newLineAtOffset(startX, startY);contentStream.showText(title);contentStream.endText();

4. 数据二列显示
在制作pdf的过程中文本显示为二列也是常见的如基本信息,首先我们要计算出显示在pdf上的每列宽带及它们的起始位置,x的值和y值,然后再设置好行间距。
案例:

//计算列宽float columnWidth = pageWidth / 2 - 10; // 假设有10点的间距
// 从页面顶部开始或者pdf上文Y的位置开始,这里是距离上文30行距的位置开始,实际使用可以根据需求自定义。float yPosition = startY - 30; // 行间距float leading = 20; // 假设我们有账单信息String[] items = {"客户名称: 张三","账单月份: 03月","客户账单地址: 上海市徐汇区*********室","账单周期: 2024年03月01日至2024年03月31日","客户装机地址: 上海市徐汇区*********室","最后付款日期: 2024年04月01日","设备号: 180*****893","打印日期: 2024年04月05日"};//标记一下第一列int currentColumn = 1;
//                // 写入账单项for (int i = 0; i < items.length; i++) {//第一列开始X值为10float xPosition = (currentColumn == 1) ? 10 : pageWidth - columnWidth - 10;contentStream.beginText();contentStream.setFont(cgload, 10);contentStream.newLineAtOffset(xPosition, yPosition);contentStream.showText(items[i]);contentStream.endText();//这里是判断是否是最后一个值,避免报异常if(i != items.length -1){contentStream.beginText();contentStream.setFont(cgload, 10);//第二列开始的X值为页宽-列宽-间距,Y值不变contentStream.newLineAtOffset(pageWidth - columnWidth - 10, yPosition);contentStream.showText(items[i+1]);i++;contentStream.endText();}//计算第二行的Y值yPosition -= leading;}

5. 图片显示
在 Java 代码中,你需要使用 PDFBox 的 API 来加载中文字体。这通常涉及到使用 PDImageXObject.createFromFile() 方法,该方法可以操作图片
案例:

//                加载图片 这里使用的是本地地址图片名为5g.png
String tp5 = "C:\\Desktop\\202406\\0604\\5g.png";
PDImageXObject imageXObject = PDImageXObject.createFromFile(tp, document);
//画图片 X值是10,Y值是页高-100,图片的宽度是90,图片的高度是30,这里根据实际情况自定义contentStream.drawImage(imageXObject,10,pageHeight-100,90,30);

6. 最后保存pdf文档,不要忘记关闭流

          //写入完成记得关闭contentStream.close();document.close();// 保存文档bill为忘记名,可自定义document.save("bill.pdf");

整体效果图附上一张!!!
在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com