scala - OpenPDF/iText 损坏的文档
问题描述
我一直在尝试在 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
}
这 是一个示例输出文档。我从 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
?
推荐阅读
- microsoft-teams - 有没有办法以编程方式访问 Teams 群聊视图中的“不在办公室”状态区域?
- angular-material - 根据内容大小将滚动条添加到 mat 选项卡
- c++ - 动画 gif 图像在我的无模式 Gtk::Dialog 中没有动画
- android - Nativescript 文件夹文件在哪里
- sql - SQL:对嵌套查询使用 AND 语句
- javascript - 来自 express 的 MongoDB API
- postgresql - Postgres 将一个过程的 refcursor 输出传递给另一个过程
- html - 如何定位用户位置:css中的粘性
- flutter - Flutter/Dart 变量丢失/尝试从不同类获取时不断重新初始化
- excel - 如何将数据从 Excel 导入另一个 Excel 文件 - 使用 VBA