【发布时间】:2018-07-30 08:02:43
【问题描述】:
我正在使用最新的 PDFBOX 库来提取文本,为了做到这一点,我编写了我的自定义 PDFStreamEngine(显示部分代码,但其余部分应该类似):
else if ("Tf".equals(operation) && parsingTextObject) {
if (operands.size() < 2) {
throw new MissingOperandException(operator, operands);
}
COSBase base0 = operands.get(0);
COSBase base1 = operands.get(1);
if (!(base0 instanceof COSName)) {
return;
}
if (!(base1 instanceof COSNumber)) {
return;
}
COSName fontName = (COSName) base0;
float fontSize = ((COSNumber) base1).floatValue();
getGraphicsState().getTextState().setFontSize(fontSize);
PDFont font = getResources().getFont(fontName);
getGraphicsState().getTextState().setFont(font);
}
但是,我遇到了 3 个问题: 第一个:“Tf”运算符 - 在 PDF /F1 1 Tf 中:当我显示 fontName 和 size 时,它显示:EVMANJ+MyriadPro-Regular, size 1;但是,illustrator 和 adobe acrobat 上的实际字体名称:Myriad Pro, size 8 pt
第三题:如何正确对待TJ算子?
P.S:我可以私下提供pdf。
【问题讨论】:
-
1) 这是一个子集,size 1表示Adobe在Tf命令中直接使用了比例而不是8; 2)当前转换矩阵/文本矩阵 3)我不明白这个问题 - 也许看看 PDF 32000 规范?还可以查看源代码下载中的 PrintTextLocations 示例和 TextPosition 对象。还可以使用 PDFDebugger 查看您的文件,然后查看内容流。
-
@TilmanHausherr 非常感谢,PrintTextLocations 是一个很好的例子,但是,我已经在扩展 PDFStreamEngine 并且我需要坚持使用它,是否有一种方法可以覆盖执行与 writeString 类似的功能?
-
我无法回答这个问题,因为我对您的代码了解得不够多,而且我从未扩展过 PDFStreamEngine(可能在复制和粘贴代码中除外)。然而,我提到的那个例子扩展了 PDFTextStripper,它扩展了 LegacyPDFStreamEngine。它扩展了 PDFStreamEngine。