java - 使用 pdfbox 在 PDF 中获取正确(旋转)的图像尺寸

标签 java pdfbox

我想将 PDF 渲染为图像,并在其上绘制所有包含图像的边框。为此,我需要页面上图像的正确尺寸。

这适用于以下代码:

public class PrintImageLocations extends PDFStreamEngine
{
    @Override
    protected void processOperator( Operator operator, List<COSBase> operands) throws IOException
    {
        String operation = operator.getName();
        if( "Do".equals(operation) )
        {
            COSName objectName = (COSName) operands.get( 0 );
            PDXObject xobject = getResources().getXObject( objectName );
            if( xobject instanceof PDImageXObject)
            {
                PDImageXObject image = (PDImageXObject)xobject;
                int imageWidth = image.getWidth();
                int imageHeight = image.getHeight();

                System.out.println("Found image " + objectName.getName());

                Matrix ctmNew = getGraphicsState().getCurrentTransformationMatrix();
                float imageXScale = ctmNew.getScalingFactorX();
                float imageYScale = ctmNew.getScalingFactorY();
                // position in user space units. 1 unit = 1/72 inch at 72 dpi
                System.out.println("position in PDF = " + ctmNew.getTranslateX() + ", " + ctmNew.getTranslateY() + " in user space units");
                           }
            else if(xobject instanceof PDFormXObject)
            {
                PDFormXObject form = (PDFormXObject)xobject;
                showForm(form);
            }
        }
        else
        {
            super.processOperator( operator, operands);
        }
    }

}

来源:PrintImageLocations.java

输出示例:PDF 中的位置 = 535.68,用户空间单位中的 97.79052

不幸的是,当页面旋转时我遇到了问题。有很多 pdf 在“getCurrentPage().getRotation()”上返回 90。对于 90 度,我必须切换 getTranslateX 和 getTranslateY 值才能获得正确的位置,但这仅适用于 90 度。是否有任何很酷的矩阵变换可以用来旋转位置?

我认为在this代码中,作者试图解决这个旋转问题,但是第一)我不明白转换正在做什么,第二)它无法正常工作,因为旋转后一个值为负数。

最佳答案

旋转

您可以使用以下旋转矩阵在欧几里得空间中执行旋转。

逆时针:

R = ⎡ cosθ -sinθ ⎤
    ⎣ sinθ  cosθ ⎦

顺时针:

R = ⎡  cosθ  sinθ ⎤
    ⎣ -sinθ  cosθ ⎦

每个矩阵都会将二维笛卡尔平面中的点绕原点旋转角度 θ。该技术假设每个点都表示一个列 vector v。每个点的新值通过 R * v 计算,其中 * 表示矩阵乘法。

<小时/>

“负”值

对于两个维度中的至少一个维度上的至少某些点,此技术将产生负值(无论如何,相对于初始值)。为了相对于笛卡尔原点进行校正,请将旋转图像“向上”平移 min(y) - min(y'),将旋转图像“右”平移 min(x) - min(x'),其中 min(d) 表示沿任意点的维度的最小值。

<小时/>

使用库

这样您就不必自己完成所有样板文件,您应该看看 AffineTransform类。

关于java - 使用 pdfbox 在 PDF 中获取正确(旋转)的图像尺寸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41373262/

相关文章:

java - PDFBox 或 IText 文档?

java - 使用 PDFBox 替换 PDF 页面

java - 如何使用 PDFBox 从 PDF 中提取数据时用单词替换空格

java - 使用java读取文件头

java - 返回类型与 Object.getClass() 不兼容

java - 如何使用 ImageJ-Plugin 水平翻转图像?

java - 使用 PDFBox 和 Swing 显示嵌入字体

java - java中如何动态加载类、资源、jar?

java - Rest 服务出现 404 错误 - Jersey/tomcat8

java - PDFBox - 将 2 个纵向页面合并到一个并排的横向页面上