我对尺寸文档有疑问。我通过了垂直方向(595.0x842.0)pdf,并且将方向pdf更改为水平(842.0x595.0),但是当我返回ByteArrayOutputStream
作为ByteArray并尝试读取此ByteArray时,我得到了垂直方向(595.0x842.0) )改为水平(842.0x595.0)
要编写新内容,我使用PdfWriter并发送具有新大小的Document
和ByteArrayOutputStream
作为第二个参数。
PdfReader reader = new PdfReader(pdf.getFile());
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
Document document = new Document(PageSize.A4.rotate(), 0, 0, 0, 0);
PdfWriter writer = PdfWriter.getInstance(document, outputStream);
我希望输出的是水平(842.0x595.0)而不是(595.0x842.0)
在此代码中我需要此尺寸:
PdfReader reader = new PdfReader(pdf.getFile());
int n = reader.getNumberOfPages();
PdfStamper stamper = new PdfStamper(reader,outputStream);
PdfContentByte pageContent;
for (int i = 0; i < n;) {
pageContent = stamper.getOverContent(++i);
System.out.println(reader.getPageSize(i));
ColumnText.showTextAligned(pageContent, Element.ALIGN_RIGHT,
new Phrase(String.format("page %s of %s", i, n)),
reader.getPageSize(i).getWidth()- 20, 20, 0);
}
此变量pdf.getFile()
是先前代码中的ByteArray(ByteArrayOutputStream
)。
我希望页面编号在右下角(x点842),但实际为595。
为了更好地理解,我发送了屏幕截图。
答案 0 :(得分:3)
您使用PdfReader
方法getPageSize
,但应使用getPageSizeWithRotation
,即您应该替换
System.out.println(reader.getPageSize(i));
ColumnText.showTextAligned(pageContent, Element.ALIGN_RIGHT,
new Phrase(String.format("page %s of %s", i, n)),
reader.getPageSize(i).getWidth()- 20, 20, 0);
作者
System.out.println(reader.getPageSizeWithRotation(i));
ColumnText.showTextAligned(pageContent, Element.ALIGN_RIGHT,
new Phrase(String.format("page %s of %s", i, n)),
reader.getPageSizeWithRotation(i).getWidth()- 20, 20, 0);
页面的两个属性负责最终显示的页面尺寸: MediaBox 和 Rotate 。 (让我们暂时忽略裁剪框和所有其他同样存在的框。)
因此,可以用两种在概念上不同的方式来创建风景A4页面:旋转为0°(或180°)的842x595媒体盒或旋转90°(或270°)的595x842媒体盒。
如果用Document
实例化PageSize.A4.rotate()
,则iText使用后一种方式。 (如果您使用new RectangleReadOnly(842,595)
实例化了它,则iText将使用前一种方法。)
PdfReader.getPageSize
仅检查媒体盒。因此,它将为您的PDF页面返回一个宽度为595的矩形,并带有595x842媒体框和90°旋转。
PdfReader.getPageSizeWithRotation
还检查页面旋转。因此,它将为您的PDF页面返回一个宽度为842的矩形,并带有595x842媒体框和90°旋转。