Java-模板生成PDF方式2-PDFBox
PDFBox文本域+内容流生成PDF
BSD许可下的源码开放项目
pom.xml引入依赖
<!-- pdfbox生成PDF -->
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.27</version>
</dependency>
生成PDF的util类
final static String FONT_SEGUISYM = "fonts/seguisym.ttf";
final static String FONT_SIMHEI = "fonts/simhei.ttf";
final static String TEMPLATE = "templates/applying_for_volunteer_service_form_pdfBox.pdf";
public static void generatePdf(OutputStream os, Message message, List<String> pickVolunteers, Map<String, List<DictData>> allVolunteers, List<DictData> volunteerTypes) throws IOException, DocumentException {
InputStream templateInputStream = new ClassPathResource(template).getInputStream();
try (PDDocument pdfDocument = PDDocument.load(templateInputStream)) {
// 1:使用文本域填充模板 -- 基础数据
buildBasicData(pdfDocument,message);
// 2:使用内容流写入数据 -- 特殊数据
// 配置类型
buildVolunteerTypes(pdfDocument,message.getVolunteerType(),volunteerTypes);
// 配置志愿服务
buildAllVolunteers(pdfDocument,allVolunteers,pickVolunteers);
// 特殊复选框
buildCheckBox(pdfDocument);
// 3:保存文档
pdfDocument.save(os);
}
}
资源
使用到的字体
fonts/seguisym.ttf fonts/simhei.ttf
使用到的模板
template/applying_for_volunteer_service_form_pdfBox.pdf
源码地址
效果图
遇到的问题
1.PDF自带的14种字体无法输出中文->使用嵌入字体,会导致生成的pdf文件偏大——>载入字体子集化
InputStream simfangInputStream = new ClassPathResource("fonts/simhei.ttf").getInputStream();
PDFont simfangFont = PDType0Font.load(pdfDocument, simfangInputStream, false);
// 改为 -- 默认字体在嵌入前子集化(嵌入所有未使用到的字体会使pdf文档变的很大,所以将其子集化)
PDFont simfangFont = PDType0Font.load(pdfDocument, simfangInputStream);
2.PDF写入复选框,同样需要嵌入特殊字体。
/**
* 复选框选中
*/
public final static String CHECK_BOX = "☑";
/**
* 复选框未选中
*/
public final static String UN_CHECK_BOX = "☐";
PDType0Font.load(doc, new File("C:\\Windows\\Fonts\\seguisym.ttf"))
3.嵌入字体显示外观比较细,无法调整为粗体。-->未解决--> 通过更换字体处理
4.多行行距无法调整。-->未解决--->通过内容流处理(绝对位置)
5.文本域+内容流 写入内容显示,pdf原有文本不显示
/** 内容流默认覆盖原有内容
APPEND 附加--将内容流附加到所有现有页面内容流之后。
OVERWRITE 覆盖--覆盖现有页面内容流。
PREPEND 预置--在所有其他页面内容流之前插入。
*/
PDPageContentStream contentStream = new PDPageContentStream(pdfDocument, page);
// 创建内容流 增加预置参数
PDPageContentStream contentStream = new PDPageContentStream(pdfDocument, page,PDPageContentStream.AppendMode.PREPEND, false);
6.PDF模板制作
工具:Adobe Acrobat Pro DC
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)