Объединенные документы в PDFBox либо не содержат пустых страниц, либо их слишком много ... но только при печати - PullRequest
1 голос
/ 19 августа 2011

Проект, над которым я сейчас работаю, требует больших тиражей документов, которые будут разосланы клиентам.Например, один сеанс печати может содержать более 1000 писем, каждое из которых отправляется разному клиенту.

Для создания этого сеанса печати внешний сервис (т.е. не использующий PDFBox) сначала генерирует каждое из этих писем.как отдельный файл PDF.Затем мой код загружает все эти файлы PDF, объединяет их все вместе с PDFBox (чтобы их можно было распечатать как одно задание в типографии), и я добавляю «баннерную страницу» спереди (также с PDFBox), котораяговорит типографии, что делать с буквами.

Все напечатано с двух сторон.Но поскольку каждое письмо отправляется разному клиенту, у меня не может быть двух писем, напечатанных вплотную на одном листе бумаги.Это означает, что к любому письму с нечетным числом страниц должна быть добавлена ​​пустая страница.Непосредственно перед печатью объединенный PDF-документ для очень маленького тиража, состоящего только из двух букв, может выглядеть примерно так:

Banner Page
Blank
Letter 1
Blank
Letter 2
Blank

Но тут возникает моя проблема. Я добавил пустые страницыс этим кодом:

PDFMergerUtility docMerger = new PDFMergerUtility();
for (PDDocument currDoc : documents) {

    // Add blank page to document if odd number
    if (currDoc.getNumberOfPages() % 2 != 0) {
        currDoc.addPage(new PDPage());
    }

    // Merge into single document
    docMerger.appendDocument(mergedDoc, currDoc);

    // Close currDoc
    currDoc.close();
}

Кажется, что это работает последовательно для баннерных страниц, но для некоторых типов букв, это облажается.Если я открываю полученный PDF-файл, он выглядит нормально, но когда я печатаю, я получаю дополнительный чистый лист бумаги между буквами.

Поэтому, пока я вижу это в Acrobat Reader (или даже в средстве просмотра PDFBox):

Sheet 1: Banner Page
Sheet 2: Letter 1
Sheet 3: Letter 2

Вывод на печать выглядит следующим образом:

Sheet 1: Banner Page
Sheet 2: Letter 1
Sheet 3: BLANK!
Sheet 4: Letter 2
Sheet 5: BLANK!

Между тем, если я возьму этот код new PDPage(), я получу следующий результат, как в Acrobat, так и в распечатанном виде:

Sheet 1: Banner Page
Sheet 2: Letter 1 (front) AND Letter 2 (back)

Я пытался отладить через PDDocument.silentPrint(PrinterJob), но все становится действительно рискованным, когда он глубоко проникает в структуру PDF, и ничто не выскакивает как неуместное.Есть идеи, что может происходить?

1 Ответ

0 голосов
/ 23 августа 2011

Ладно, думаю, я понял проблему.Похоже, что некоторые буквы были разработаны с бумагой «А4», а не «Письмо».Если я только что посмотрел файлы в Acrobat Reader, он выглядел совершенно нормально, и если я печатал буквы оттуда, Reader должен автоматически сжать вывод на доступный формат бумаги.К сожалению, PDFBox, кажется, не делает то же самое сжатие.Таким образом, при печати через PDFBox письмо слегка перебегало на следующую страницу, вызывая странное поведение, которое я видел.

У меня еще не было возможности проверить эту теорию ... разработчик письма нашелошибка, но его изменения еще не были размещены на нашем тестовом сервере.Если это не решит проблему, я вернусь.

...