调整文档大小后,新内容的大小相同。如何在ByteArrayOutputStream中保存新大小?

时间:2019-07-10 07:46:48

标签: java pdf itext

我对尺寸文档有疑问。我通过了垂直方向(595.0x842.0)pdf,并且将方向pdf更改为水平(842.0x595.0),但是当我返回ByteArrayOutputStream作为ByteArray并尝试读取此ByteArray时,我得到了垂直方向(595.0x842.0) )改为水平(842.0x595.0)

要编写新内容,我使用PdfWriter并发送具有新大小的DocumentByteArrayOutputStream作为第二个参数。

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。 为了更好地理解,我发送了屏幕截图。

enter image description here

1 个答案:

答案 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°旋转。