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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 20:43:14