PDFBox无法编写上标字符

时间:2015-06-03 12:22:25

标签: pdfbox

也许这是一个重复的查询,但我不知道该如何解决这个问题?

我提到了所有可用的线程,但无法继续进行。我正在使用PDFBox来绘制字符串。 [pt上标字符也适用于所有特殊字符。)我想写的PDF是“90000039-PREDISOL®CYELLOW 13 SNDOT™M”,但实际上写的是 “þÿ9 0 0 0 0 0 3 9 - P R E D I S OL®CY E L L O W 1 3 S N D O T!” M“

有些人可以帮我详细说明如何识别这种编码方式以及如何处理?

此外,还有其他选项,以便我们可以避免明确地通过文件加载ttf。

谢谢&问候, 阿奇纳

1 个答案:

答案 0 :(得分:0)

正如this answer中已经解释的那样, PDFBox的字符串编码远非完美(版本1.8.x)。不幸的是,它在编码通用PDF对象中的字符串时使用相同的例程,就像在内容流中编码字符串那样从根本上是错误的。

根据该答案,可以手动为特殊字符创建文本绘图命令:

    contents.drawString("90000039-PREDISOL ® C YELLOW 13 SNDOT");
    byte[] commands = "(x) Tj ".getBytes();
    commands[1] = (byte) 0231;
    contents.appendRawCommands(commands);
    contents.drawString("M");
     

DrawSpecialCharacters方法testDrawTmSignCustomDraw

testDrawTmSignCustomDraw output

由于所讨论的特殊字符本质上是一组上标的普通字符,因此可以使用较小字体的字母来绘制它,并使用一些文字上升:

    contents.drawString("90000039-PREDISOL ® C YELLOW 13 SNDOT");
    contents.appendRawCommands("\n6 Ts\n".getBytes());
    contents.setFont(font, 10);
    contents.drawString("TM");
    contents.appendRawCommands("\n0 Ts\n".getBytes());
    contents.setFont(font, 18);
    contents.drawString("M");
     

DrawSpecialCharacters方法testDrawTmSignLetters

testDrawTmSignLetters output