如何使用免费开源库将PDF转换为PDF/A(优先A-4标准)
免费开源方案:将Word模板生成的PDF转为PDF/A-4格式
可以使用Apache PDFBox实现需求,这是Apache基金会旗下完全免费开源的PDF处理类库,无商业限制,也不会添加水印或警告文本。结合你原有的Apache POI代码,只需添加PDFBox依赖并扩展转换逻辑即可。
步骤1:添加依赖
在你的Gradle或Maven配置中加入以下依赖(以Gradle为例):
dependencies { // Apache POI:处理Word模板 implementation 'org.apache.poi:poi:5.2.5' implementation 'org.apache.poi:poi-ooxml:5.2.5' implementation 'org.apache.poi:poi-ooxml-converter:5.2.5' // Apache PDFBox:PDF/A转换 implementation 'org.apache.pdfbox:pdfbox:2.0.32' implementation 'org.apache.pdfbox:pdfbox-tools:2.0.32' }
步骤2:修改代码实现PDF/A转换
以下是优化后的完整代码,修复了原代码的资源泄漏问题,并添加了PDF/A-4转换逻辑:
@GetMapping(value = ["/generate-pdf"], produces = [MediaType.APPLICATION_PDF_VALUE]) fun generatePdf(): ResponseEntity<FileSystemResource> { // 加载并填充Word模板 File("src/main/resources/template.docx").inputStream().use { templateStream -> XWPFDocument(templateStream).use { document -> // 替换模板中的变量 document.paragraphs.forEach { paragraph -> paragraph.runs.forEach { run -> val text = run.getText(0) ?: return@forEach val replacedText = text.replace("{{name}}", "John Doe").replace("{{product}}", "Sample Product") run.setText(replacedText, 0) } } // 生成临时普通PDF文件,避免并发请求下的文件覆盖 val tempPdf = File.createTempFile("temp_pdf", ".pdf") FileOutputStream(tempPdf).use { out -> PdfConverter.getInstance().convert(document, out, null) } // 将普通PDF转换为PDF/A-4格式 val pdfaFile = File.createTempFile("pdfa_output", ".pdf") PDDocument.load(tempPdf).use { originalDoc -> // 设置PDF/A要求的颜色输出意图(sRGB是标准配置) val outputIntent = PDOutputIntent(originalDoc, "sRGB IEC61966-2.1", null, "sRGB Color Space Profile", null) val converter = PDFAConverter() // 指定转换为PDF/A-4标准 converter.convertToPDFA(originalDoc, pdfaFile, PDFAConformanceLevel.PDF_A_4, outputIntent) } // 标记临时文件在JVM退出时自动删除 tempPdf.deleteOnExit() // 构建响应头 val responseHeaders = HttpHeaders().apply { contentType = MediaType.APPLICATION_PDF contentLength = pdfaFile.length() add("Content-Disposition", "attachment; filename=outputfile.pdf") } return ResponseEntity.ok().headers(responseHeaders).body(FileSystemResource(pdfaFile)) } } }
关键说明
- 使用Kotlin的
use函数自动关闭所有流和文档对象,彻底避免资源泄漏问题 - 采用临时文件处理生成过程,解决多请求场景下的文件冲突问题
- 通过
PDOutputIntent配置sRGB颜色空间,满足PDF/A标准对颜色管理的要求 - 明确指定
PDFAConformanceLevel.PDF_A_4,确保输出符合目标标准
内容的提问来源于stack exchange,提问作者screwedDev
相关产品推荐
相关产品推荐

