使用itextpdf,横向和纵向之间PDF的PageSize始终相同

我有一个PDFReader,其中包含横向模式的一些页面和纵向的其他页面 .

我需要区分它们来做一些处理......但是,如果我调用getOrientation或getPageSize,则值总是相同的(页面大小为595,方向为0) .

为什么景观中的页面的值不同?

我试图找到其他方法来检索页面宽度/方向但没有任何效果 .

这是我的代码:

for(int i = 0; i < pdfreader.getNumberOfPages(); i++)
{
    document = PdfStamper.getOverContent(i).getPdfDocument();

    document.getPageSize().getWidth; //this will always be the same
}

谢谢 !

回答(2)

2 years ago

有两种方便的方法,名为 getPageSize()getPageSizeWithRotation() .

我们来看一个例子:

PdfReader reader =
    new PdfReader("src/main/resources/pages.pdf");
show(reader.getPageSize(1));
show(reader.getPageSize(3));
show(reader.getPageSizeWithRotation(3));
show(reader.getPageSize(4));
show(reader.getPageSizeWithRotation(4));

在此示例中, show() 方法如下所示:

public static void show(Rectangle rect) {
    System.out.print("llx: ");
    System.out.print(rect.getLeft());
    System.out.print(", lly: ");
    System.out.print(rect.getBottom());
    System.out.print(", urx: ");
    System.out.print(rect.getRight());
    System.out.print(", lly: ");
    System.out.print(rect.getTop());
    System.out.print(", rotation: ");
   System.out.println(rect.getRotation());
}

这是输出:

llx: 0.0, lly: 0.0, urx: 595.0, lly: 842.0, rotation: 0
llx: 0.0, lly: 0.0, urx: 595.0, lly: 842.0, rotation: 0
llx: 0.0, lly: 0.0, urx: 842.0, lly: 595.0, rotation: 90
llx: 0.0, lly: 0.0, urx: 842.0, lly: 595.0, rotation: 0
llx: 0.0, lly: 0.0, urx: 842.0, lly: 595.0, rotation: 0

第3页(参见代码示例3.8中的第4行)是一个A4页面,就像第1页一样,但它以横向为导向 . /MediaBox 条目与第一页 [0 0 595 842] 使用的条目相同,这就是 getPageSize() 返回相同结果的原因 .

该页面处于横向,因为页面字典中的 \Rotate 条目设置为 90 . 此条目的可能值为 0 (如果缺少该条目,则为默认值),_ 279494180270 .

getPageSizeWithRotation() 方法将此值考虑在内 . 它交换宽度和高度,以便您了解其中的差异 . 它还为您提供了 /Rotate 条目的值 .

第4页也有横向方向,但在这种情况下,通过调整 /MediaBox 条目来模拟旋转 . 在这种情况下, /MediaBox 的值为 [0 0 842 595] ,如果有 /Rotate 条目,则其值为 0 .

这就解释了为什么 getPageSizeWithRotation() 方法的输出与 getPageSize() 方法的输出相同 .

当我读到你的问题时,我发现你正在寻找轮换 . 这可以使用 getRotation() 方法完成 .

Remark: 此文本是从我的书"The ABC of PDF"中复制的(该书正在建设中;您可以免费下载第一章) . 代码示例可以找到here .

2 years ago

修复:

使用

PdfStamper.getImportedPage(pdfReader, pagenumber).getBoundingBox().getWidth()

代替

stamper.getOverContent(i).getPdfDocument().getPageSize().getWidth();