我一直在尝试从Scala中的OpenPDF 1.2.4和1.2.11重新实现连接示例:
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
}
Here Here是一个示例输出文档。我从this的两个副本生成它,然后是this的三个副本。
我看到两个问题:
- 文档已损坏(仅在FireFox中打开),部分原因是标题与第一个对象之间存在一条直线。删除违规行不会修复该文档 客户端代码中的错误,谢谢@mkl!
$ strings out.pdf | grep "A Simple PDF File" | wc -l | tr -d ' '
6
在一个案例中,我使用vim删除第一个内容流,并导致文本出现在第一页上。
我是否以某种方式滥用API?
结果文件的前17465个字节是代码的实际结果(“这个的两个副本,然后是这个的三个副本”)。 31181字节文件的剩余字节由其他PDF的片段组成。
在评论中,你说你“正在用生成的字节数组调用Files.write。”您使用哪种OpenOption
s?可能是CREATE
而不是TRUNCATE_EXISTING
?