Java 使用pdfbox以PDF格式获取正确(旋转)的图像尺寸

Java 使用pdfbox以PDF格式获取正确(旋转)的图像尺寸,java,pdfbox,Java,Pdfbox,我想呈现一个PDF格式的图像,并在其上绘制所有包含图像的边框。为此,我需要一个页面上的图像正确的尺寸 这将使用以下代码: public class PrintImageLocations extends PDFStreamEngine { @Override protected void processOperator( Operator operator, List<COSBase> operands) throws IOException {

我想呈现一个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扩展了PDFStreamEngine
{
@凌驾
受保护的void processOperator(运算符运算符、列表操作数)引发IOException
{
字符串操作=operator.getName();
if(“Do.”等于(操作))
{
COSName objectName=(COSName)操作数。get(0);
PDXObject xobject=getResources().getXObject(objectName);
if(PDImageXObject的xobject实例)
{
PDImageXObject image=(PDImageXObject)xobject;
int imageWidth=image.getWidth();
int imageHeight=image.getHeight();
System.out.println(“找到的图像”+objectName.getName());
矩阵ctmNew=getGraphicsState().getCurrentTransformationMatrix();
float imageXScale=ctmNew.getScalingFactorX();
float imageYScale=ctmNew.getScalingFactorY();
//以用户空间单位表示的位置。72 dpi时,1个单位=1/72英寸
System.out.println(“PDF中的位置=“+ctmNew.getTranslate()+”,“+ctmNew.getTranslateY()+”,以用户空间单位表示”);
}
else if(PDFormXObject的xobject实例)
{
PDFormXObject form=(PDFormXObject)xobject;
展示形式(表格);
}
}
其他的
{
超级处理运算符(运算符、操作数);
}
}
}
资料来源:

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

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

我认为,在代码中,作者试图解决这个旋转问题,但1)我不理解转换在做什么,2)它不能正常工作,因为旋转后一个值为负值。

rotation 可以使用以下旋转矩阵在欧几里德空间中执行旋转

逆时针:

R = ⎡ cosθ -sinθ ⎤
    ⎣ sinθ  cosθ ⎦
顺时针:

R = ⎡  cosθ  sinθ ⎤
    ⎣ -sinθ  cosθ ⎦
每个矩阵将在二维笛卡尔平面上通过围绕原点的角度θ旋转点。此技术假定每个点都表示为一个列向量
v
。每个点的新值通过
R*v
计算,其中
*
表示矩阵乘法


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


使用图书馆 为了让你不必自己做所有关于这个的样板,你应该看看这个课程。

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

逆时针:

R = ⎡ cosθ -sinθ ⎤
    ⎣ sinθ  cosθ ⎦
顺时针:

R = ⎡  cosθ  sinθ ⎤
    ⎣ -sinθ  cosθ ⎦
每个矩阵将在二维笛卡尔平面上通过围绕原点的角度θ旋转点。此技术假定每个点都表示为一个列向量
v
。每个点的新值通过
R*v
计算,其中
*
表示矩阵乘法


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


使用图书馆
这样你就不必自己做所有关于这个的样板,你应该看看这个课程。

好的。。。我想我可以用一些数学来解决它。。。不幸的是,它不起作用(我认为问题出在电脑前)

受保护的void processOperator(运算符运算符,列表操作数)引发IOException{
字符串操作=operator.getName();
if(“Do.”等于(操作)){
COSName objectName=(COSName)操作数。get(0);
PDXObject xobject=getResources().getXObject(objectName);
if(PDImageXObject的xobject实例){
PDImageXObject image=(PDImageXObject)xobject;
矩阵ctmNew=getGraphicsState().getCurrentTransformationMatrix();
float imageXScale=ctmNew.getScalingFactorX();
float imageYScale=ctmNew.getScalingFactorY();
int rotationDegree=getCurrentPage().getRotation();
float pageHeight=this.getCurrentPage().getBBox().getHeight();
float pageWidth=this.getCurrentPage().getBBox().getWidth();
浮动translateX;
浮动平移;
如果(旋转度==0){
translateX=ctmNew.getTranslateX();
translateY=pageHeight-ctmNew.getTranslateY()-imageScale;
}否则如果(旋转度==90){
translateX=ctmNew.getTranslateY();
translateY=ctmNew.getTranslateX()-imageScale;
}否则如果(旋转度==270){
translateX=第页