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

时间:2018-07-30 08:02:44

标签: pdf pdfbox

我正在使用最新的PDFBOX库提取文本,为此,我编写了自定义PDFStreamEngine(显示了部分代码,但其余部分应该相似):


    book_id | book_name              | book_author
    =====================================================
          1 | NoSQL Distilled        | Pramod J. Sadalage
    -----------------------------------------------------
          1 | NoSQL Distilled        | Martin Fowler
    -----------------------------------------------------
          2 | Building Microservices | Sam Newman

但是,我遇到3个问题: 第一个:“ Tf”运算符-PDF / F1中1 Tf:当我显示fontName和大小时,它显示:EVMANJ + MyriadPro-Regular,大小1;但是,插图画家和Adobe Acrobat上的实际字体名称为:Myriad Pro,大小为8磅

第二个问题:如图所示,文本是垂直的,如何提取文本的旋转度? enter image description here

第三个问题:如何正确对待TJ运营商?

P.S:我可以私下提供pdf。

1 个答案:

答案 0 :(得分:1)

这个问题的答案不是直接的,我不得不扩展showFontGlyph

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

为了找到旋转位置,我不得不将代码从PDFBox 1.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函数。