3

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 を誤用していませんか?

4

1 に答える 1