Pdf 如何从内容流中解码数据

Pdf 如何从内容流中解码数据,pdf,itext,Pdf,Itext,我使用如下代码创建了一个pdf文档: // The text parameter equels 'שדג' it is Hebrew. unicode equivalent is '\u05E9\u05D3\u05D2' private static void createSimplePdf(String filename, String text) throws Exception { final String path = RunItextApp.class.getReso

我使用如下代码创建了一个pdf文档:

// The text parameter equels 'שדג' it is Hebrew. unicode equivalent is '\u05E9\u05D3\u05D2'
private static void createSimplePdf(String filename, String text) throws Exception {

        final String path = RunItextApp.class.getResource("/Arial.ttf").getPath();
        final PdfFont font = PdfFontFactory.createFont(path, PdfEncodings.IDENTITY_H);

        Style hebrewStyle = new Style()
                .setBaseDirection(BaseDirection.RIGHT_TO_LEFT)
                .setFontSize(14)
                .setFont(font);

        final PdfWriter pdfWriter = new PdfWriter(filename);
        final PdfDocument pdfDocument = new PdfDocument(pdfWriter);
        final Document pdf = new Document(pdfDocument);
        pdf.add(
                new Paragraph(text)
                        .setFontScript(Character.UnicodeScript.HEBREW)
                        .addStyle(hebrewStyle)
        );

        pdf.close();
        System.out.println("The document '" + filename + "' has been created.");
    }
之后,我尝试使用
pdfbox
util打开此文档,得到了以下数据:
但是我在
Contents:stream
部分得到了一个意想不到的结果,尤其是
Tj
标记。我希望字符串如下所示
05E905D305D2
,但我得到了
02b902a302a2
。我试图将这个
hex
字符串转换为普通字符串,结果如下:


我错了什么?转换此
02b902a302a2
字符串并获取
。谢谢你的帮助!

您得到的数字不是Unicode字符,而是字体索引。(检查字体是如何嵌入的!)PDF中的文本并不特别关注Unicode,可能是,也可能不是。好的PDF创建者会添加一个/ToUnicode表来帮助解码,但这是可选的。

您得到的数字不是Unicode字符,而是字体索引。(检查字体是如何嵌入的!)PDF中的文本并不特别关注Unicode,可能是,也可能不是。优秀的PDF创建者添加了一个
/ToUnicode
表来帮助解码,但这是可选的。为什么要使用PDFBox标签?@usr2564301感谢您的帮助!我找到了
/ToUnicode
部分。@tilmahausherr,因为他们使用的是Pdfbox的PDF语法浏览器(我不知道正式名称)。也许他们不知道iText还有一个名为RUPS的PDF语法浏览器:仅从屏幕截图来看,基本功能是一样的,但RUPS有更多的功能。但我有偏见。:)很高兴提及usr2564301最初在对您的问题的评论中写道。@mkl我同意您的看法。我试图找到如何添加评论作为答案,但找不到。只有版主才能在评论中转换答案,反之亦然。你可以简单地要求另一条评论中的人重新发布评论作为答案。或者你可以创建一个答案并引用作者参考的原始内容,就像你现在所做的一样。我的评论只指出了一个可能的原因(和解决方案)。如果您添加了更改代码的确切方式,这将是一个更好的答案。