【问题标题】:How can I change page origin? - Image inserted at unexpected location如何更改页面来源? - 图像插入意外位置
【发布时间】:2020-01-22 21:11:18
【问题描述】:

使用 iText 7.1.9 java 版本,我试图在固定/绝对位置将图像添加到 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 文件:

前两个图像显示预期/期望的行为,后两个显示图像如何插入错误的位置(基于不正确的原点/旋转)。

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

【问题讨论】:

    标签: itext itext7


    【解决方案1】:

    首先,在确定当前页面是否不是横向(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();
    

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

    【讨论】:

    • 这按预期工作,谢谢。我本来打算为这个问题开悬赏,但你的回答打败了我,所以我会比有资格的时候奖励。使用setIgnorePageRotationForContent(true); 似乎也解决了我遇到的纵向问题,因此不再需要旋转 PDF,谢谢。
    猜你喜欢
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 2021-01-03
    • 1970-01-01
    相关资源
    最近更新 更多