Я пытался повторно реализовать объединенный пример из OpenPDF 1.2.4 и 1.2.11 в Scala:
def mergePdfs(docs: Seq[Array[Byte]]): Array[Byte] = {
log.debug(s"merging ${docs.size} PDFs")
val output = new ByteArrayOutputStream()
val document = new Document()
val copy = new PdfCopy(document, output)
getPageSize(docs.headOption) foreach document.setPageSize
document.open()
docs foreach { doc =>
val reader = new PdfReader(doc)
1 to reader.getNumberOfPages foreach { pageNum =>
copy.addPage(copy.getImportedPage(reader, pageNum))
}
}
document.close()
output.toByteArray
}
Здесь Здесь - пример выходного документа. Я сгенерировал его из двух копий этого , а затем из трех копий этого .
Я вижу две проблемы:
- Документ поврежден (открывается только в FireFox), частично из-за линии разрыва непосредственно между заголовком и первым объектом. Удаление ошибочной строки не исправляет ошибку документа в коде клиента, спасибо @mkl!
- Некоторые страницы (обычно одна, но недетерминированные) выглядят пустыми. Никаких шаблонов, в которых я видел. Кроме того, текст каждой страницы появляется дважды в файле. например в приведенном выше примере:
$ strings out.pdf | grep "A Simple PDF File" | wc -l | tr -d ' '
6
В одном случае я использовал vim, чтобы удалить первый поток контента, и это привело к тому, что текст появился на первой странице.
Я неправильно использую API?