【问题标题】:PDFBox 2.0.3 - Image Coordinates returned from PrintImageLocations.java not as expectedPDFBox 2.0.3 - 从 PrintImageLocations.java 返回的图像坐标与预期不符
【发布时间】:2018-01-31 23:03:40
【问题描述】:

我正在尝试提取嵌入到 PDF 中的图像的 xywidthheight根据以下位置使用 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 正在查看正确的图像,并且它确实完美地找到并提取了所需的图像。

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

我所期望的与我输入的 xywidthheight 相同在提取特定文本时作为 Rectangle2DPDFTextStripperByArea 类。

我已经做了相当多的互联网研究,我真的找不到一个直接的答案。根据我的阅读,我认为我用于提取文本的坐标系与用于图像的坐标系不同。

如果是这种情况,是否可以将 PrintImageLocations.java 带回的值转换为我用于 PDFTextStripperByAreaRectangle2D 坐标> ?

我们将不胜感激任何有关此事的帮助。

【问题讨论】:

  • 当前版本为2.0.8。你能链接到PDF吗?
  • 我正在为客户端使用 PDFBox,他们可用的最新版本是 2.0.3,所以我目前无法获得 2.0.8。同样,有问题的 PDF 是客户端 PDF,所以我无法分享。但是,我在网上找到了一个 PDF 作为示例,但是当我运行 PrintImageLocations 时,它确实返回了所需的结果。我只能假设它与客户端 PDF 有关,因为它在生成 PDF 之前经过了许多系统。因此,这不是 PDFBox 的问题。
  • 谁知道... PDFBox 总是有可能出现问题,但没有 PDF 就不可能。最好是问客户。或者看看 PDFDebugger 到 PDF 文件,虽然你需要很好地理解 PDF 规范......

标签: java pdfbox


【解决方案1】:

我遇到了类似的问题。我的图像的 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");

【讨论】:

  • 位置并没有偏离,它们只是在与您预期不同的坐标系中给出,并且使用的锚点与您预期的不同。因此,问题只是错误的期望。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 2012-09-29
  • 1970-01-01
相关资源
最近更新 更多