You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用免费开源库将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 19:05:08