我使用 Apple 的基本 PDF 框架在 Swift for MacOS 中编写了一个小型 PDF 合并应用程序。基本策略是获取 PDF 文件列表,然后遍历第 2 到第 n 个文件的页面,将它们中的每一个附加到第一个文件的末尾。核心功能是以下代码:
func openPDF(_ file: URL) throws -> PDFDocument {
guard let pdata = try? NSData(contentsOf: file) as Data else {
throw PDFMergeError.cannotOpenFile(filename: file.path)
}
guard let pdf = PDFDocument(data: pdata) else {
throw PDFMergeError.fileNotValidPDF(filename: file.path)
}
return pdf
}
public func mergePDFs(files: [URL]) throws -> PDFDocument {
if files.count == 1 {
throw PDFMergeError.justOneInputFile
}
let first = files[0]
let rest = files[1...]
let pdf = try openPDF(first)
var curpagenum = pdf.pageCount
var cur2add: PDFDocument
var curpage: PDFPage
var lenOfCurAdd: Int
for p2add in rest {
cur2add = try openPDF(p2add)
lenOfCurAdd = cur2add.pageCount
for i in 0..<lenOfCurAdd {
curpage = cur2add.page(at: i)!
pdf.insert(curpage, at: curpagenum)
curpagenum+=1
}
}
return pdf
}
这大部分工作正常,我自己也经常使用它(每隔一段时间,我就会遇到一个神秘的崩溃,我还没有费心去弄清楚如何修复,但我今天不问这个问题)。
但有时它似乎过度膨胀生成的合并文件的文件大小。例如,今天早上我用它来合并我下载的电子书的章节。各个章节的总大小约为 165mb。然而,在使用我的应用程序合并它之后,我最终得到了一个超过 500mb 的文件(!!!)。
当我尝试了众多 PDF 合并网站之一时,我最终得到了一个更合理的低于 200mb 的文件。
那么,有人可以帮我弄清楚我做错了什么吗?
更新
经过更多的工作,我开始认为这里的问题是苹果内部的。特别是,我使用与以前相同的 PDF 合并服务制作了不同的合并 PDF(如果有人好奇,它是 smallpdf.com)。结果不到 40MB。然后我在当前版本的 Preview(内置于 MacOS 10.15.6)中编辑了该 pdf,删除了几页并重新保存。重新保存的文件,我只删除了数据,大约有 80MB。
因此,无论出于何种原因,无论是在我的代码中还是在 Apple 自己的代码中,Apple 处理编写 PDF 的文件似乎都比原本可能的文件大小增加了一倍。