当前位置: 首页 > 知识库问答 >
问题:

PDFBox文本提取,旋转和字体名称,大小

从渊
2023-03-14

我正在使用最新的PDFBOX库来提取文本,为了做到这一点,我编写了我的自定义PDFStreamEngine(shwoing部分代码,但其余应该类似):

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);
}

然而,我有三个问题:第一个:“Tf”操作符-在PDF/F1中1 Tf:当我显示fontName和size时,它显示:evmanj+myriadpro-regular,size 1;但是,illustrator和adobe Acrobat上的实际字体名称是:Myriad Pro,大小8 pt

第三个问题:如何妥善处理TJ运营商?

附注:我可以私下提供pdf。

共有1个答案

尉迟德惠
2023-03-14

这个问题的答案并不直接,我必须扩展showFontGlyph

protected void showFontGlyph(Matrix textRenderingMatrix, PDFont font, int code, String unicode, Vector displacement) throws IOException {
..do you logic here}

为了找到旋转,我不得不将PDFBox1.8中的代码复制粘贴到我的类中

/**
 * Return the direction/orientation of the string in this object based on
 * its text matrix.
 * 
 * @return The direction of the text (0, 90, 180, or 270)
 */
public int getDir() {
    int direction = -1;
    if (direction < 0) {
        float a = getTextMatrix().getScaleY();
        float b = getTextMatrix().getShearY();
        float c = getTextMatrix().getShearX();
        float d = getTextMatrix().getScaleX();
        // 12 0 left to right
        // 0 12
        if (a > 0 && Math.abs(b) < d && Math.abs(c) < a && d > 0) {
            direction = 0;
        }
        // -12 0 right to left (upside down)
        // 0 -12
        else if (a < 0 && Math.abs(b) < Math.abs(d) && Math.abs(c) < Math.abs(a) && d < 0) {
            direction = 180;
        }
        // 0 12 up
        // -12 0
        else if (Math.abs(a) < Math.abs(c) && b > 0 && c < 0 && Math.abs(d) < b) {
            direction = 90;
        }
        // 0 -12 down
        // 12 0
        else if (Math.abs(a) < c && b < 0 && c > 0 && Math.abs(d) < Math.abs(b)) {
            direction = 270;
        } else {
            direction = 0;
        }
    }
    return direction;
}

并且在处理流时检测到TJ运算符时调用getDir函数。

 类似资料:
  • 我试图从pdf文件中获得特定文本或行的字体大小或格式(粗体等),但没有任何成功到现在。 使用下面的PDFTextStripper只能得到纯文本 PDFTextStripper tripper=新的PDFTextStripper();String actualText=stripper.gettext(actualDoc); 你能帮我做这个吗?谢了。

  • 这是我的代码。 当它读到。docx文件它有时会返回-1的字体大小和null的字体系列。 我知道这是因为它们是默认值,但我不想要-1和null,我只想要那个默认值的名称。 我怎么读呢?

  • 问题内容: 我正在使用pdfbox库从pdf文件中提取文本内容。我可以提取所有文本,但找不到提取字体样式的方法。 问题答案: 这不是提取字体的正确方法。要读取字体,必须遍历pdf页面并提取字体,如下所示:

  • 我正试图从一组PDF文件中提取一些信息。这是目前为止的工作,但一个PDF给我的委屈。 我使用的是PDFBOX1.8.8和Java7。 我没有例外,什么都没有。有什么想法吗? 编辑:附加信息:使用Acrobat Distiller 9.0.0(Windows)创建,格式为PDF-1.6;其他PDF是版本1.4和1.5 似乎并不包含异国情调的角色。我可以在Evince PDF-viewer中标记/复制

  • 问题内容: 我正在使用Apache pdfbox提取文本。我可以从pdf中提取文本,但我不知道该单词是否为粗体?(代码建议会很好!!!)这是从pdf提取纯文本的代码,可以正常工作。 问题答案: 的结果是纯文本。因此,将其提取后为时已晚。但是,您可以覆盖某些方法,只允许根据您的意愿格式化的文本通过。 在这种情况下,您必须覆盖 在您的替代中,您检查所讨论的文本是否满足您的要求(包含有关所讨论文本的很多

  • 我正在编写一个应用程序,它使用PDFbox库来填充PDF文件中的字段。 在其中一个字段中,我将文本设置为希伯来字母。 当我在Android设备上运行代码时,我会得到以下日志: 我试图在堆栈溢出中找到一些关于它的信息,但我找到的答案都与填充表单有关。它都与有关。 你能帮我解决这个错误并用PDFBox在表格中填写希伯来字母吗?