Itext 如何更改页面原点?-图像插入到意外位置

Itext 如何更改页面原点?-图像插入到意外位置,itext,itext7,Itext,Itext7,使用iText 7.1.9 java edition,我试图在固定/绝对位置向PDF添加图像,如果PDF不是横向的,那么我将其旋转90度,但是,一旦页面旋转,原点(原来是左下角)也会旋转(现在在左上角,旋转90度),因此,当我插入图像时,它最终会旋转并使用错误的原点。请参阅下面链接的两个PDF示例,了解正在发生的情况 旋转页面后,有没有办法将页面原点更改为左下角?有没有比使用PdfDocument.getPage(p).setRotation更好的方法来旋转页面 我是否应该简单地旋转图像并做一

使用iText 7.1.9 java edition,我试图在固定/绝对位置向PDF添加图像,如果PDF不是横向的,那么我将其旋转90度,但是,一旦页面旋转,原点(原来是左下角)也会旋转(现在在左上角,旋转90度),因此,当我插入图像时,它最终会旋转并使用错误的原点。请参阅下面链接的两个PDF示例,了解正在发生的情况


旋转页面后,有没有办法将页面原点更改为左下角?有没有比使用
PdfDocument.getPage(p).setRotation更好的方法来旋转页面

我是否应该简单地旋转图像并做一些数学运算来计算出任何附加元素的新位置?我尝试使用
imageData.setRotation(90)
旋转图像,但它似乎没有任何作用


以下是使用此问题底部所附PDF的输入:

//String pdfPath = "before_expected.pdf";
//String pdfDest = "after_expected.pdf";
//Or
String pdfPath = "before_unexpected.pdf";
String pdfDest = "after_unexpected.pdf";
以下是我旋转页面和添加图像的代码:

//Open existing PDF
FileInputStream inputStream = new FileInputStream(pdfPath);
PdfReader reader = new PdfReader(inputStream).setUnethicalReading(true);

//Create new PDF
FileOutputStream outputStream = new FileOutputStream(pdfDest);
PdfWriter writer = new PdfWriter(outputStream);
PdfDocument pdfDocument = new PdfDocument(reader, writer);

//Load sample image
ImageData imageData = ImageDataFactory.create("C:/sample_image.png");
Image image = new Image(imageData);

//Get root element of PDF
Document document = new Document(pdfDocument);

//Get orientation
Rectangle pageSize = pdfDocument.getPage(1).getPageSize();
System.out.println("Original rotation " + pdfDocument.getPage(1).getRotation() + System.lineSeparator() + pageSize.toString());
//Rotate 90 if page is not landscape - placeholder
if (pageSize.getHeight() > pageSize.getWidth())
{
    pdfDocument.getPage(1).setRotation(pdfDocument.getPage(1).getRotation() + 90);
}

//Find page size
Rectangle currentPageSize = pdfDocument.getPage(1).getPageSizeWithRotation();
//Locate image 40% across page and 20% up page
float absoluteXpos = currentPageSize.getWidth() * 0.4f;
float absoluteYpos = currentPageSize.getHeight() * 0.2f;
System.out.println("Image location from origin: " + absoluteXpos + ", "+absoluteYpos);

//Add image
image.setFixedPosition(absoluteXpos, absoluteYpos);
document.add(image);

//Removed code to close any tidy up
document.close();
第二个PDF(在_unexpected.PDF之前)的输出显示它是旋转的,但如上所述,进一步旋转页面似乎对添加其他内容没有影响:

Original rotation 90
Rectangle: 842.0x1191.0
Image location from origin: 336.80002, 238.2

以下是我用于测试的PDF文件: 前两幅图像显示预期/期望的行为,后两幅图像显示如何将图像插入错误的位置(基于不正确的原点/旋转)



首先,在确定当前页面是否为横向(
if(pageSize.getHeight()>pageSize.getWidth())
)时,您应该已经使用
getPagesizeWidthotation()
而不是简单地使用
getPageSize()
。稍后在代码中使用此方法,您也应该在较早的时候使用它

第二,如果您想将一些内容添加到与页面旋转无关的固定位置,可以在添加内容之前使用以下说明:

pdfDocument.getPage(1).setIgnorePageRotationForContent(true);
完整代码:

//Open existing PDF
FileInputStream inputStream = new FileInputStream("C:/in.pdf");
PdfReader reader = new PdfReader(inputStream).setUnethicalReading(true);

//Create new PDF
FileOutputStream outputStream = new FileOutputStream("C:/Users/Alexey/Desktop/exp.pdf");
PdfWriter writer = new PdfWriter(outputStream);
PdfDocument pdfDocument = new PdfDocument(reader, writer);

//Load sample image
ImageData imageData = ImageDataFactory.create("C:/sample_image.png");
Image image = new Image(imageData);

//Get root element of PDF
pdfDocument.getPage(1).setIgnorePageRotationForContent(true);
Document document = new Document(pdfDocument);

//Get orientation
Rectangle pageSize = pdfDocument.getPage(1).getPageSizeWithRotation();
System.out.println("Original rotation " + pdfDocument.getPage(1).getRotation() + System.lineSeparator() + pageSize.toString());
//Rotate 90 if page is not landscape - placeholder
if (pageSize.getHeight() > pageSize.getWidth())
{
    pdfDocument.getPage(1).setRotation(pdfDocument.getPage(1).getRotation() + 90);
}

//Find page size
Rectangle currentPageSize = pdfDocument.getPage(1).getPageSizeWithRotation();
//Locate image 40% across page and 20% up page
float absoluteXpos = currentPageSize.getWidth() * 0.4f;
float absoluteYpos = currentPageSize.getHeight() * 0.2f;
System.out.println("Image location from origin: " + absoluteXpos + ", "+absoluteYpos);

//Add image
image.setFixedPosition(absoluteXpos, absoluteYpos);
document.add(image);

//Removed code to close any tidy up
document.close();
它为两个输入文件提供了相同的结果:


首先,在确定当前页面是否为横向(
if(pageSize.getHeight()>pageSize.getWidth())
)时,您应该已经使用
getPagesizeWidthotation()
而不是简单地使用
getPageSize()
。稍后在代码中使用此方法,您也应该在较早的时候使用它

第二,如果您想将一些内容添加到与页面旋转无关的固定位置,可以在添加内容之前使用以下说明:

pdfDocument.getPage(1).setIgnorePageRotationForContent(true);
完整代码:

//Open existing PDF
FileInputStream inputStream = new FileInputStream("C:/in.pdf");
PdfReader reader = new PdfReader(inputStream).setUnethicalReading(true);

//Create new PDF
FileOutputStream outputStream = new FileOutputStream("C:/Users/Alexey/Desktop/exp.pdf");
PdfWriter writer = new PdfWriter(outputStream);
PdfDocument pdfDocument = new PdfDocument(reader, writer);

//Load sample image
ImageData imageData = ImageDataFactory.create("C:/sample_image.png");
Image image = new Image(imageData);

//Get root element of PDF
pdfDocument.getPage(1).setIgnorePageRotationForContent(true);
Document document = new Document(pdfDocument);

//Get orientation
Rectangle pageSize = pdfDocument.getPage(1).getPageSizeWithRotation();
System.out.println("Original rotation " + pdfDocument.getPage(1).getRotation() + System.lineSeparator() + pageSize.toString());
//Rotate 90 if page is not landscape - placeholder
if (pageSize.getHeight() > pageSize.getWidth())
{
    pdfDocument.getPage(1).setRotation(pdfDocument.getPage(1).getRotation() + 90);
}

//Find page size
Rectangle currentPageSize = pdfDocument.getPage(1).getPageSizeWithRotation();
//Locate image 40% across page and 20% up page
float absoluteXpos = currentPageSize.getWidth() * 0.4f;
float absoluteYpos = currentPageSize.getHeight() * 0.2f;
System.out.println("Image location from origin: " + absoluteXpos + ", "+absoluteYpos);

//Add image
image.setFixedPosition(absoluteXpos, absoluteYpos);
document.add(image);

//Removed code to close any tidy up
document.close();
它为两个输入文件提供了相同的结果:


这一切都如期进行,谢谢。我本打算为这个问题悬赏,但你的回答打败了我,所以我会在有资格的时候奖励你。使用
setIgnorePageRotationForContent(true)
似乎也解决了我遇到的肖像方向问题,因此不再需要旋转PDF,谢谢。这工作如预期的一样,谢谢。我本打算为这个问题悬赏,但你的回答打败了我,所以我会在有资格的时候奖励你。使用
setIgnorePageRotationForContent(true)
似乎也解决了我遇到的纵向问题,因此不再需要旋转PDF,谢谢。