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

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

许涵容
2023-03-14

我正在尝试使用PrintImageLocations提取嵌入到PDF中的图像的x、y、宽度和高度。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/

我所期望的是相同的x,y,宽度和高度,我将作为矩形2D输入到PDFTextStripperByArea类时提取特定文本。

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

如果是这种情况,是否有任何转换值,PrintImageLocations.java带回矩形2D坐标我使用PDFTextStripperByArea?

在这个问题上的任何帮助将不胜感激。

共有1个答案

舒嘉德
2023-03-14

我有一个类似的问题。我的图像的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");
 类似资料:
  • 我想知道是否有人帮助我理解如何将顶部图像转换为底部图像。以下链接中提供了这些图像。顶部图像采用笛卡尔坐标。底部图像是极坐标中的转换图像

  • 我有一个包含坐标的.csv文件,我需要在我做过的地图上使用python绘制它们。有人能帮我吗?

  • 我在将图像转换为极坐标时遇到问题。在Photoshop中很容易:)所以这对我来说是一个新领域。 我有以下图片: 结果应该是这样的: 我在这里看了一下,了解了一些基本知识,但仍然对圆的平方有点困惑: 我几乎不知道如何重新绘制图像。还有一个警告:由于管理限制,我想避免使用像Numpy这样的外部库。

  • 我试图计算一种有效的方法,将笛卡尔坐标系中的图像转换为极坐标表示。我知道ImToPolar等一些功能正在实现这一点,它工作得很好,但对于大图像来说需要相当长的时间,尤其是当它们需要来回处理时。 这是我的输入图像: 然后我使用以0为中心的笛卡尔网格和函数生成一个极网格。最后,我使用绘制我的图像。 这是我得到的: 这正是我需要的图像,它与ImToPolar相同,或者更好。 既然MATLAB知道如何计算

  • 我有一张以色列地图。 我需要创建一个获得两个双参数(经度和纬度)的函数,该函数应该在地图图像中的那个区域上画一个小圆圈。 我有以下关于地图的信息: null 截图: https://gyazo.com/5a19dece37ebace496c6b8d68eb9ec3c

  • 我正在尝试使用wp rest api返回一个博客帖子列表,包括标题、摘录和特色图片。使用下面的方法,我可以返回标题和摘录,但特征图像会导致致命错误:无法将stdClass类型的对象用作数组。 有人能告诉我我做错了什么吗?