После изменения размера документа новый контент будет иметь такой же размер. Как сохранить новый размер в ByteArrayOutputStream? - PullRequest
3 голосов
/ 10 июля 2019

У меня проблема с размером документа. Я передаю pdf вертикальной ориентации (595.0x842.0) и меняю 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() является байтовым массивом (ByteArrayOutputStream) из предыдущего кода. Я ожидаю номер страницы в правом нижнем углу (х точка 842), но фактическая 595. Для лучшего понимания я отправляю скриншот.

enter image description here

1 Ответ

3 голосов
/ 10 июля 2019

Вы используете 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 и Поворот . (Давайте пока проигнорируем поле кадрирования и все остальные поля, которые также существуют.)

Таким образом, альбомную страницу формата A4 можно создать двумя концептуально разными способами: либо в виде медиа-бокса 842x595 с поворотом на 0 ° (или 180 °), либо в виде медиа-бокса 595x842 с поворотом на 90 ° (или 270 °).

Если вы создаете экземпляр Document с помощью PageSize.A4.rotate(), iText использует последний способ. (Если бы вы создали его с помощью new RectangleReadOnly(842,595), iText использовал бы прежний способ.)

PdfReader.getPageSize только проверяет носитель. Таким образом, он возвращает прямоугольник шириной 595 для вашей страницы PDF с мультимедийным блоком 595x842 и поворотом на 90 °.

PdfReader.getPageSizeWithRotation также проверяет поворот страницы. Таким образом, он возвращает прямоугольник шириной 842 для вашей страницы PDF с мультимедийным блоком 595x842 и поворотом на 90 °.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...