我正在尝试提取嵌入到PDF中的图像的 x , y ,宽度和高度使用 PrintImageLocations.java 按照以下位置:
但是,返回值的所有实例都与我期望的不一致。由于这些值远远不够,我从下面的位置运行了 SaveImagesInPdf 类,以确保PDFBox正在查看正确的图像,它确实找到并完美地提取了所需的图像。 / p>
https://www.tutorialkart.com/pdfbox/extract-images-from-pdf-using-pdfbox/
我所期待的是我输入的 x , y ,宽度和高度相同在提取特定文本时,作为 Rectangle2D 到 PDFTextStripperByArea 类。
我做了大量的网络研究,我真的找不到直接的答案。从我所读到的,我认为我用来提取文本的坐标系统与图像的不同。
如果是这种情况,那么无论如何都要将 PrintImageLocations.java 带回的值转换回我用于 PDFTextStripperByArea的 Rectangle2D 坐标?
非常感谢任何有关此事的帮助。
答案 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");