PDFBox 2.0.3 - 从PrintImageLocations.java返回的图像坐标不符合预期

时间:2018-01-31 23:03:41

标签: java pdfbox

我正在尝试提取嵌入到PDF中的图像的 x y 宽度高度使用 PrintImageLocations.java 按照以下位置:

https://svn.apache.org/repos/asf/pdfbox/tags/2.0.3/examples/src/main/java/org/apache/pdfbox/examples/util/PrintImageLocations.java

但是,返回值的所有实例都与我期望的不一致。由于这些值远远不够,我从下面的位置运行了 SaveImagesInPdf 类,以确保PDFBox正在查看正确的图像,它确实找到并完美地提取了所需的图像。 / p>

https://www.tutorialkart.com/pdfbox/extract-images-from-pdf-using-pdfbox/

我所期待的是我输入的 x y 宽度高度相同在提取特定文本时,作为 Rectangle2D PDFTextStripperByArea 类。

我做了大量的网络研究,我真的找不到直接的答案。从我所读到的,我认为我用来提取文本的坐标系统与图像的不同。

如果是这种情况,那么无论如何都要将 PrintImageLocations.java 带回的值转换回我用于 PDFTextStripperByArea的 Rectangle2D 坐标

非常感谢任何有关此事的帮助。

1 个答案:

答案 0 :(得分:0)

我有类似的问题。我图像的Y位置偏离了(页面顶部而不是页面底部)。经过大量搜索,我终于找到了一个新的PrintImageLocations,其中包含以下代码,该代码进行了必要的调整以纠正问题所在:

    PDImageXObject image = (PDImageXObject)xobject;
    int imageWidth = image.getWidth();
    int imageHeight = image.getHeight();

    Matrix ctmNew = getGraphicsState().getCurrentTransformationMatrix();
    float imageXScale = ctmNew.getScalingFactorX();
    float imageYScale = ctmNew.getScalingFactorY();

    float yScaling = ctmNew.getScaleY();
    float angle = (float)Math.acos(ctmNew.getValue(0, 0)/ctmNew.getScaleX());
    if (ctmNew.getValue(0, 1) < 0 && ctmNew.getValue(1, 0) > 0)
    {
        angle = (-1)*angle;
    }

    PDPage page = getCurrentPage();
    double pageHeight = page.getMediaBox().getHeight();
    ctmNew.setValue(2, 1, (float)(pageHeight - ctmNew.getTranslateY() - Math.cos(angle)*yScaling));
    ctmNew.setValue(2, 0, (float)(ctmNew.getTranslateX() - Math.sin(angle)*yScaling));

    // because of the moved 0,0-reference, we have to shear in the opposite direction
    ctmNew.setValue(0, 1, (-1)*ctmNew.getValue(0, 1));
    ctmNew.setValue(1, 0, (-1)*ctmNew.getValue(1, 0));

    System.out.println("NEW NEW:  position in PDF = " + ctmNew.getTranslateX() + ", " + ctmNew.getTranslateY() + " in user space units");