使用PDFBox 2.0.27生成PDF时遇字符编码错误求助
解决PDFBox输出含特殊字符文本的编码错误问题
使用PDFBox 2.0.27生成PDF时,输出schodiště západ这类含Unicode扩展字符的文本时,抛出如下编码错误:
Exception in thread "main" java.lang.IllegalArgumentException: U+011B ('ecaron') is not available in the font Helvetica, encoding: WinAnsiEncoding at org.apache.pdfbox.pdmodel.font.PDType1Font.encode(PDType1Font.java:428) at org.apache.pdfbox.pdmodel.font.PDFont.encode(PDFont.java:333) at org.apache.pdfbox.pdmodel.PDPageContentStream.showTextInternal(PDPageContentStream.java:514) at org.apache.pdfbox.pdmodel.PDPageContentStream.showText(PDPageContentStream.java:476) at com.mytest.tasks.qrcode.AddingContent.main(AddingContent.java:27)
原代码如下:
package com.mytest.tasks.createPDF; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; import org.apache.pdfbox.pdmodel.font.PDType1Font; import java.io.IOException; public class AddingContent { public static void main (String[] args) throws IOException { try (PDDocument doc = new PDDocument()) { PDPage myPage = new PDPage(); doc.addPage(myPage); try (PDPageContentStream cont = new PDPageContentStream(doc, myPage)) { cont.beginText(); cont.setFont(PDType1Font.HELVETICA, 12); cont.setLeading(14.5f); cont.newLineAtOffset(25, 700); String line1 = "schodiště západ"; cont.showText(line1); cont.endText(); } doc.save("D:\\Temp\\QRCode\\QR_PDF_PDFBOX_Output.pdf"); } } }
错误原因
Helvetica属于Type1字体,仅支持有限的字符集(如WinAnsiEncoding),无法覆盖U+011B这类Unicode扩展字符,导致编码失败。
解决方法
使用支持Unicode的TrueType字体,并通过PDType0Font加载(PDFBox推荐的Unicode字体处理方式),以下是修改后的代码示例:
package com.mytest.tasks.createPDF; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; import org.apache.pdfbox.pdmodel.font.PDType0Font; import java.io.File; import java.io.IOException; public class AddingContent { public static void main (String[] args) throws IOException { try (PDDocument doc = new PDDocument()) { PDPage myPage = new PDPage(); doc.addPage(myPage); // 加载系统中的Arial字体(Windows系统路径示例,需确保字体存在) // 若为Linux/macOS,可替换为对应字体路径,如"/Library/Fonts/Arial.ttf" PDType0Font font = PDType0Font.load(doc, new File("C:/Windows/Fonts/arial.ttf")); try (PDPageContentStream cont = new PDPageContentStream(doc, myPage)) { cont.beginText(); cont.setFont(font, 12); cont.setLeading(14.5f); cont.newLineAtOffset(25, 700); String line1 = "schodiště západ"; cont.showText(line1); cont.endText(); } doc.save("D:\\Temp\\QRCode\\QR_PDF_PDFBOX_Output.pdf"); } } }
注意事项
- 确保加载的字体文件路径正确,且字体支持目标语言的字符集
PDType0Font会自动处理Unicode编码,无需手动指定编码格式- 嵌入字体可能会增加PDF文件体积,但能保证文本在不同设备上的一致性显示
内容的提问来源于stack exchange,提问作者Jugal Patel
相关产品推荐
相关产品推荐

