首页 > 解决方案 > 使用 Swift PDFKit 的 PDF 大小膨胀

问题描述

我使用 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 的文件似乎都比原本可能的文件大小增加了一倍。

标签: swiftpdfdiskspaceapple-pdfkit

解决方案


推荐阅读