如何使用PDFBox修改PDF内容的文本编码?
基于PDFBox修复PDF文本编码异常的实操方案
先做问题诊断
这类编码乱码/异常问题,大多是PDF内部字体编码映射错误(比如自定义编码未关联正确Unicode)或字体嵌入不完整导致的。先用PDFBox的命令行工具提取文本,明确问题细节:java -jar pdfbox-app-x.x.x.jar ExtractText -encoding UTF-8 你的PDF文件.pdf 输出文本.txt
打开输出的文本文件,确认是全文档乱码还是局部字体导致的异常。核心修复步骤(代码实现)
如果是编码映射错误,通过PDFBox重新关联字体的标准编码(比如WinAnsiEncoding或UTF-8),核心代码如下:
import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDResources; import org.apache.pdfbox.pdmodel.font.*; import java.io.File; public class FixPdfEncoding { public static void main(String[] args) throws Exception { PDDocument document = PDDocument.load(new File("你的PDF文件.pdf")); for (PDPage page : document.getPages()) { PDResources resources = page.getResources(); for (COSName fontName : resources.getFontNames()) { PDFont font = resources.getFont(fontName); // 针对不同类型字体重置编码 if (font instanceof PDType0Font) { ((PDType0Font) font).setEncoding(WinAnsiEncoding.INSTANCE); } else if (font instanceof PDType1Font) { ((PDType1Font) font).setEncoding(WinAnsiEncoding.INSTANCE); } // 若为CJK字体,需确保嵌入对应完整字体,可额外设置CIDFont编码 } } document.save("修复后的PDF文件.pdf"); document.close(); } }
注意:如果是中文等CJK字体异常,要确保使用的字体文件包含完整的CJK字符集,必要时替换为已嵌入完整字符的字体。
验证修复效果
再次用PDFBox提取修复后的PDF文本,对比你期望的结果:java -jar pdfbox-app-x.x.x.jar ExtractText -encoding UTF-8 修复后的PDF文件.pdf 验证输出.txt
如果仍有局部异常,需单独排查对应字体的编码映射,手动补充缺失的字符编码映射表。特殊情况处理
如果你的PDF是扫描件经OCR生成的,编码异常可能是OCR识别错误导致的,这种情况需要重新用专业OCR工具(比如Tesseract)处理后,再用PDFBox整合文本内容。
内容的提问来源于stack exchange,提问作者pathfinder
相关产品推荐
相关产品推荐

