ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java-pdfbox:提取图像位置(错误的x和y)

2019-10-26 13:00:43  阅读:892  来源: 互联网

标签:pdfbox java


各位程序员,您好!

我可以正确提取pdf文本坐标及其格式.但是我不能用图像做到这一点.

我可以得到适当的宽度和高度,但是它给了我错误的x和y.

我正在使用photoshop检查即时消息是否获得正确的x,y,宽度,高度坐标
但只有宽度和高度正确

这是我的代码

    @Override
    public void processOperator(Operator operator, List<COSBase> arguments) throws IOException {

        if ("cm".equals(operator.getName())) {
            float width = ((COSNumber)arguments.get(0)).floatValue();
            float height = ((COSNumber)arguments.get(3)).floatValue();
            float x = ((COSNumber)arguments.get(4)).floatValue();
            float y = ((COSNumber)arguments.get(5)).floatValue();
            System.out.println("w: " + width + " h: " + height + " x: " + x + " y: " + y);
            // process image coordinates
        }
        super.processOperator(operator, arguments);
    }

这是我使用的示例pdf

http://persci.mit.edu/pub_pdfs/personal_photo_enhancement.pdf

和即时通讯使用第2页

这是程序的输出

w: 503.87997 h: 152.64 x: 71.5168 y: 561.056

我使用Photoshop创建了一个矩形并覆盖了图像,但只有宽度和高度正确.

另一个问题

我用这个PDF

http://www.ctex.org/documents/shredder/src/example.pdf

我使用了第17页.

pdf为什么显示许多坐标.但是pdf中的图像只是一个?

w: 1.0 h: 1.0 x: 124.802 y: 776.998
w: 1.0 h: 1.0 x: 0.0 y: 3.587
w: 1.0 h: 1.0 x: 0.0 y: -3.985
w: 1.0 h: 1.0 x: 343.711 y: 0.398
w: 1.0 h: 1.0 x: -343.711 y: -24.906
w: 1.0 h: 1.0 x: 147.972 y: -106.0
w: 1.0 h: 1.0 x: 0.0 y: 0.0
w: 1.0 h: 1.0 x: 0.0 y: 0.0
w: 0.1 h: 0.1 x: 0.0 y: 0.0
w: 1.0 h: 1.0 x: 45.0 y: 0.0
w: 1.0 h: 1.0 x: -79.37 y: -21.918
w: 1.0 h: 1.0 x: 116.507 y: 0.0
w: 1.0 h: 1.0 x: -230.109 y: -2.145
w: 1.0 h: 1.0 x: 0.0 y: -20.324
w: 1.0 h: 1.0 x: 0.0 y: -13.682
w: 1.0 h: 1.0 x: 3.387 y: 2.989
w: 1.0 h: 1.0 x: 20.175 y: -2.989
w: 1.0 h: 1.0 x: -23.562 y: -0.398
w: 1.0 h: 1.0 x: 30.685 y: 3.387
w: 1.0 h: 1.0 x: 179.886 y: -66.21
w: 1.0 h: 1.0 x: 4.981 y: 0.0
w: 1.0 h: 1.0 x: -215.552 y: -17.195
w: 1.0 h: 1.0 x: 0.0 y: -13.682
w: 1.0 h: 1.0 x: 3.387 y: 2.989
w: 1.0 h: 1.0 x: 20.175 y: -2.989
w: 1.0 h: 1.0 x: -23.562 y: -0.398
w: 1.0 h: 1.0 x: 30.685 y: 3.387
w: 1.0 h: 1.0 x: -35.666 y: -76.173
w: 1.0 h: 1.0 x: 4.981 y: 0.0
w: 1.0 h: 1.0 x: -4.981 y: -41.843
w: 1.0 h: 1.0 x: 4.981 y: 0.0
w: 1.0 h: 1.0 x: -4.981 y: -51.806
w: 1.0 h: 1.0 x: 4.981 y: 0.0
w: 1.0 h: 1.0 x: 175.592 y: -19.925
w: 1.0 h: 1.0 x: 4.981 y: 0.0
w: 1.0 h: 1.0 x: -185.554 y: -19.925
w: 1.0 h: 1.0 x: 4.981 y: 0.0
w: 1.0 h: 1.0 x: 0.0 y: -37.121
w: 1.0 h: 1.0 x: 0.0 y: -13.682
w: 1.0 h: 1.0 x: 3.387 y: 2.989
w: 1.0 h: 1.0 x: 20.175 y: -2.989
w: 1.0 h: 1.0 x: -23.562 y: -0.398
w: 1.0 h: 1.0 x: 30.685 y: 3.387
w: 1.0 h: 1.0 x: 282.916 y: -18.389
w: 1.0 h: 1.0 x: 4.981 y: 0.0
w: 1.0 h: 1.0 x: -318.582 y: -17.196
w: 1.0 h: 1.0 x: 0.0 y: -13.682
w: 1.0 h: 1.0 x: 3.387 y: 2.989
w: 1.0 h: 1.0 x: 20.175 y: -2.989
w: 1.0 h: 1.0 x: -23.562 y: -0.398
w: 1.0 h: 1.0 x: 30.685 y: 3.387
w: 1.0 h: 1.0 x: 11.988 y: -11.216
w: 1.0 h: 1.0 x: 0.0 y: -14.833
w: 1.0 h: 1.0 x: 3.388 y: 4.926
w: 1.0 h: 1.0 x: 60.357 y: -4.926
w: 1.0 h: 1.0 x: -63.745 y: -0.399
w: 1.0 h: 1.0 x: 63.944 y: -3.985
w: 1.0 h: 1.0 x: -59.959 y: 0.0
w: 1.0 h: 1.0 x: 64.143 y: 0.0
w: 1.0 h: 1.0 x: -110.801 y: -13.101
w: 1.0 h: 1.0 x: 0.0 y: -2.241
w: 1.0 h: 1.0 x: 39.308 y: 2.241
w: 1.0 h: 1.0 x: 0.0 y: -2.241
w: 1.0 h: 1.0 x: -37.066 y: 0.0
w: 1.0 h: 1.0 x: 0.0 y: 13.294
w: 1.0 h: 1.0 x: 1.145 y: -9.907
w: 1.0 h: 1.0 x: 39.641 y: 11.302
w: 1.0 h: 1.0 x: 0.0 y: -15.686
w: 1.0 h: 1.0 x: 1.693 y: 14.291
w: 1.0 h: 1.0 x: 0.0 y: -12.896
w: 1.0 h: 1.0 x: 3.288 y: 2.989
w: 1.0 h: 1.0 x: 47.544 y: -2.989
w: 1.0 h: 1.0 x: -50.832 y: -0.299
w: 1.0 h: 1.0 x: 52.227 y: -1.096
w: 1.0 h: 1.0 x: -53.92 y: -0.597
w: 1.0 h: 1.0 x: 57.838 y: 14.888
w: 1.0 h: 1.0 x: 0.0 y: -11.22
w: 1.0 h: 1.0 x: 0.0 y: -2.473
w: 1.0 h: 1.0 x: 42.751 y: 2.473
w: 1.0 h: 1.0 x: 0.0 y: -2.473
w: 1.0 h: 1.0 x: -40.278 y: 0.0
w: 1.0 h: 1.0 x: 0.0 y: 13.693
w: 1.0 h: 1.0 x: 1.313 y: -9.907
w: 1.0 h: 1.0 x: -104.652 y: -78.762
w: 1.0 h: 1.0 x: 166.874 y: 0.0
w: 1.0 h: 1.0 x: 176.837 y: 0.0

解决方法:

问题的原因

您的代码并没有真正寻找图像的位置和大小,只是在友好的环境下才找到它们.

您的代码仅显示一个没有显式上下文的方法(我想这是没人认真分析该代码并发现问题的原因).

不过,考虑到上下文(PDFBox,内容流分析),我假设您创建了一个运算符处理器类,在其中根据发布的代码覆盖了processOperator方法.此外,我假设您已使用一些PDF流引擎为cm指令注册了操作处理器,并将其与示例PDF一起运行.

鉴于这些假设,很清楚为什么运算符处理器的输出有时仅包含图像大小和位置,但常常包含许多不相关的数据集:

指令cm的作用仅仅是改变当前的变换矩阵,它与绘制位图图像没有直接或唯一的关系!

赋予PDF规范:

Operands
Operator
Description

a b c d e f
cm
Modify the current transformation matrix (CTM) by concatenating the specified matrix (see 8.3.2, “Coordinate Spaces”). Although the operands specify a matrix, they shall be written as six separate numbers, not as an array.

(表57 –图形状态运算符– ISO 32000-1)

cm参数不时一次包含图像大小和位置信息的唯一原因是位图绘制运算符将图像绘制到以左下角为原点的1×1区域(以用户空间为单位),并进行拉伸和移动坐标系统,以便该区域最终与结果页面上所需的图像尺寸相对应,PDF处理器通常在绘制图像之前,先使用cm指令相应地修改当前的变换矩阵.

如果他们一步一步完成操作(如上所述,cm将指定的矩阵连接到CTM,不会替换它),并且不使用旋转或类似的技巧,则a和d(第一个和第四个cm参数)确实包含页面上图像的大小(默认用户空间单位)以及e和f(第五和第六cm参数)包含其左下角的坐标.

如何正确做

因此,不仅要查看cm参数,还必须

>解析有问题的内容流,
>计算应用于CTM的所有矩阵的级联(还跟踪中间q和Q指令的影响),以及
>当发生位图图像资源的Do指令时,检索当前变换矩阵的值.

幸运的是,如果允许的话,PDFBox已经为您做了所有繁重的工作,比照.的PrintImageLocations示例

>(对于PDFBox 1.8.13)https://svn.apache.org/repos/asf/pdfbox/tags/1.8.13/examples/src/main/java/org/apache/pdfbox/examples/util/PrintImageLocations.java
>(对于PDFBox 2.0.3)https://svn.apache.org/repos/asf/pdfbox/tags/2.0.3/examples/src/main/java/org/apache/pdfbox/examples/util/PrintImageLocations.java

关于你的问题

就PDF坐标系而言,您在“ personal_photo_enhancement.pdf”第2页上获得的坐标是正确的. Photoshop可能使用了不同的坐标系,或者您检查了错误的图像角.

您在第17页的“ example.pdf”中获得了很多输出,因为PDF使用CTM操纵不仅用于图像大小和位置定位,还用于其他效果,主要用于平移坐标系原点.此外,该页面上的图像不是位图.因此,它的位置和大小都不简单.

标签:pdfbox,java
来源: https://codeday.me/bug/20191026/1936809.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有