如何更改页面来源? - 图像插入到意想不到的位置

How can I change page origin? - Image inserted at unexpected location

使用 iText 7.1.9 java 版本,我试图在 fixed/absolute 位置向 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 (before_unexpected.pdf) 的输出显示它已旋转,但如上所述,进一步旋转页面似乎对添加其他内容没有影响:

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

以下是我用于测试的 PDF 文件:

前两张图片显示了 expected/desired 行为,后两张显示了图片是如何插入错误位置的(基于不正确的 origin/rotation)。

Click here for the original file for the first pdf

Click here for the processed file for the first pdf


Click here for the original file for the second pdf

Click here for the processed file for the second pdf

首先,在判断当前页面是否为非横向(if (pageSize.getHeight() > pageSize.getWidth()))时,你应该已经使用了getPageSizeWithRotation()而不是简单的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();

两个输入文件的结果相同: