2010-11-01 2 views
3

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

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")); 

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

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

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

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

enter code here 

ответ

3

Угу.

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

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

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

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

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

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

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

+0

Thanks Mark. Я заработал. Но теперь проблема, с которой я столкнулся, - это не запись заголовка. Хотя я делаю getOverContent getUnderContent, а затем добавляю таблицы, но почему-то заголовок не записывается. Есть предложения? –

Смежные вопросы