如何在不丢失任何信息的情况下合并两个 pdf?

Posted

技术标签:

【中文标题】如何在不丢失任何信息的情况下合并两个 pdf?【英文标题】:How to combine two pdfs without losing any information? 【发布时间】:2018-02-16 05:21:45 【问题描述】:

我的目标是合并两个 PDF。一个有 10 页,另一个有 6 页,所以输出应该是 16 页。我的方法是将两个 PDF 加载到存储在 NSMutableArray 中的两个 NSData 中。

这是我的保存方法:

NSMutableData *toSave = [NSMutableData data];
for(NSData *pdf in PDFArray)
    [toSave appendData:pdf];

[toSave writeToFile:path atomically:YES];

但是输出的 PDF 只有第二部分,它只包含 6 页。所以我不知道我错过了什么。谁能给我一些提示?

【问题讨论】:

Swift 5 Easy full explanation how to merge, convert and save pdf data Swift 5 ----------- Easy full explanation how to merge, convert and save PDF 【参考方案1】:

PDF 是一种描述单个文档的文件格式。您无法连接到 PDF 文件以获取连接后的文档。

但可以通过PDFKit 实现这一点:

    使用initWithData: 创建两个文档。 使用insertPage:atIndex: 将第二个文档的所有页面插入到第一个文档中。

这应该看起来像:

PDFDocument *theDocument = [[PDFDocument alloc] initWithData:PDFArray[0]]
PDFDocument *theSecondDocument = [[PDFDocument alloc] initWithData:PDFArray[1]]
NSInteger theCount = theDocument.pageCount;
NSInteger theSecondCount = theSecondDocument.pageCount;

for(NSInteger i = 0; i < theSecondCount; ++i) 
    PDFPage *thePage = [theSecondDocument pageAtIndex:i];

    [theDocument insertPage:thePage atIndex:theCount + i];

[theDocument writeToURL:theTargetURL];

您必须将#import &lt;PDFKit/PDFKit.h&gt;@import PDFKit; 添加到您的源文件中,并且您应该将PDFKit.framework 添加到Xcode 中构建目标的Linked Frameworks and Libraries

【讨论】:

@GiddensA:我已经扩展了我的帖子。 是的,这就是我要找的!谢谢。但我还有一个问题。我的应用程序是一个 Cocoa 应用程序(我意识到我之前应该提过这个),我尝试添加 PDFKit.framework 但我找不到框架。我阅读了 PDFKit 的文档,它说 PDFKit 在 OSX 10.4 之后可用。那么我错过了什么?【参考方案2】:

我制作了一个 Swift 命令行工具来组合任意数量的 PDF 文件。它将输出路径作为第一个参数,将输入 PDF 文件作为其他参数。没有任何错误处理,因此您可以根据需要添加。完整代码如下:

import PDFKit

let args = CommandLine.arguments.map  URL(fileURLWithPath: $0) 
let doc = PDFDocument(url: args[2])!

for i in 3..<args.count 
    let docAdd = PDFDocument(url: args[i])!
    for i in 0..<docAdd.pageCount 
        let page = docAdd.page(at: i)!
        doc.insert(page, at: doc.pageCount)
    

doc.write(to: args[1])

【讨论】:

以上是关于如何在不丢失任何信息的情况下合并两个 pdf?的主要内容,如果未能解决你的问题,请参考以下文章

使用 iText 在不丢失注释的情况下裁剪 pdf

如何在不实际合并的情况下测试合并

如何在不丢失信息的情况下将因子转换为整数\数字?

如何在不丢失或复制任何记录的情况下移动或更改管道

如何使用 Typescript 在不丢失任何道具的情况下键入样式组件?

如何在不进行任何更改的情况下恢复推送的合并?