PdfWriter и события - PullRequest
       6

PdfWriter и события

3 голосов
/ 01 ноября 2010

Я хочу создать объект PdfWriter и установить события для верхнего и нижнего колонтитула. Проблема в том, что это работает, если я создаю новый PDF. Но моя проблема в том, что у меня уже есть PDF в Output Stream. Пожалуйста, найдите мой пример кода ниже.

Document document = new Document();
    try {
        // step 2:
        FileInputStream is = new FileInputStream("D://2.pdf");
        int nRead;
        byte[] data = new byte[16384];
        ByteArrayOutputStream buffer = new ByteArrayOutputStream();
        while ((nRead = is.read(data, 0, data.length)) != -1) {
          buffer.write(data, 0, nRead);           
        }

        buffer.flush();
        PdfWriter writer = PdfWriter.getInstance(document,buffer);
        writer.setViewerPreferences(PdfWriter.PageLayoutTwoColumnLeft);
        writer.setPageEvent(new DossierPortalUtil());

        document.setMargins(36, 36, 54, 72);
        // step 3:
        document.open();

        document.add( new Chunk("testing")); 

    } catch (Exception de) {
        de.printStackTrace();
    } 
    finally{
        document.close();
    }

Если я прокомментирую строку

document.add( new Chunk("testing"));

Я получаю исключение

Исключение в потоке "main". ExceptionConverter: java.io.IOException: в документе нет страниц.

Без комментариев нет исключений, но он не добавляет верхний и нижний колонтитулы. Любые подсказки высоко ценятся.

С уважением, Tina

enter code here

1 Ответ

3 голосов
/ 02 ноября 2010

Да.

Вы пытаетесь изменить существующий PDF с помощью PdfWriter, когда вы должны использовать PdfStamper.

Добавление текста с помощью штампа гораздо менее тривиально, чемДелая это с PdfWriter и Document.

Вам необходимо создать ColumnText объект и получить PdfContentByte, вызвав myStamper.getOverContent(pageNum).

Вы добавляете абзацы/ chunks / etc к ColumnText и передать ему PdfContentByte (и некоторые позиционные параметры) для рисования текста.

В качестве альтернативы, вы можете создать отдельный PDF с вашим текстом (и всем остальным)затем используйте PdfStamper & PdfImportedPage, чтобы импортировать эти страницы и записать их поверх существующих.Фоны страниц PDF прозрачны, пока вы не нарисуете что-то поверх них, поэтому текст (и прочее) будет отображаться поверх существующей страницы.Это заметно менее эффективно, так как второй документ необходимо преобразовать в байтовый массив в синтаксисе PDF (если вы используете ByteArrayOutputStream вместо записи в файл, что было бы еще медленнее), снова проанализировать, а затемдобавлен в исходный документ и записан во второй раз.

Стоит немного дополнительных усилий, чтобы использовать ColumnText.

Вам также необходимо написать свой верхний и нижний колонтитулы непосредственно с помощью PdfContentByte звонки, но вы должны сделать это уже в вашем PdfPageEvent, поэтому эти изменения должны быть довольно простыми.

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