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
}
ここ に出力ドキュメントの例を示します。thisの 2 つのコピーから生成し、次にthisの 3 つのコピーから生成しました。
2 つの問題が発生しています。
- ドキュメントが壊れています (FireFox でのみ開きます)。これは、ヘッダーと最初のオブジェクトの間のすぐ下にある無駄な行が原因の 1 つです。問題のある行を削除しても、クライアント コードのドキュメント エラーは修正されません。@mkl に感謝します。
- 一部のページ (通常は 1 つですが、確定的ではありません) は空白に見えます。私が見たパターンはありません。さらに、各ページのテキストはファイルに 2 回表示されます。たとえば、上記の例では:
$ strings out.pdf | grep "A Simple PDF File" | wc -l | tr -d ' '
6
あるケースでは、vim を使用して最初のコンテンツ ストリームを削除したところ、テキストが最初のページに表示されました。
何らかの方法で API を誤用していませんか?