Java 使用pdfbox以PDF格式获取正确(旋转)的图像尺寸
我想呈现一个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 {
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=第页