Swift中将一个PDF文件追加到另一个PDF的函数

7

我用以下代码在两个不同的视图中创建了两个不同的pdf文件:

private func toPDF(views: [UIView]) -> NSData? {

    if views.isEmpty {return nil}

    let pdfData = NSMutableData()
    UIGraphicsBeginPDFContextToData(pdfData, CGRect(x: 0, y: 0, width: 1024, height: 1448), nil)
    let context = UIGraphicsGetCurrentContext()

    for view in views {
        UIGraphicsBeginPDFPage()
        view.layer.renderInContext(context!)
    }

    UIGraphicsEndPDFContext()

    return pdfData
}

在最终视图中,我使用以下方式调用两个文件:
let firstPDF = NSUserDefaults.standardUserDefaults().dataForKey("PDFone")
let secondPDF = NSUserDefaults.standardUserDefaults().dataForKey("PDFtwo")

我的问题是:是否有人可以建议一个函数,将第二个文件附加到第一个文件?(两个文件都是NSData格式)

“合并”是什么意思?您想将第二个PDF的内容附加到第一个PDF中吗?请编辑您的问题并解释清楚。 - Eric Aya
是的,这正是我所指的。 - Ali
1
请问如何在iOS设备上合并PDF文件? - Larme
在 Swift 中对我无效。 - Ali
@Ali:其他问题中给出的解决方案有什么问题吗? - Larme
@Larme:我不理解输入和输出的过程!正如你在我的问题中所看到的,我有两个 PDF 文件作为 NSData,你提到的代码对它没有用。 - Ali
3个回答

12

Swift 4:

func merge(pdfs:Data...) -> Data
{
    let out = NSMutableData()
    UIGraphicsBeginPDFContextToData(out, .zero, nil)

    guard let context = UIGraphicsGetCurrentContext() else {
        return out as Data
    }

    for pdf in pdfs {
        guard let dataProvider = CGDataProvider(data: pdf as CFData), let document = CGPDFDocument(dataProvider) else { continue }

        for pageNumber in 1...document.numberOfPages {
            guard let page = document.page(at: pageNumber) else { continue }
            var mediaBox = page.getBoxRect(.mediaBox)
            context.beginPage(mediaBox: &mediaBox)
            context.drawPDFPage(page)
            context.endPage()
        }
    }

    context.closePDF()
    UIGraphicsEndPDFContext()

    return out as Data
}

这样做是可行的,但会移除你添加的任何注释,比如链接。我发现更简单的方法是从你的数据中创建多个PDF文档,然后针对每个文档获取其PDF页面。然后你可以将这些页面插入到一个新的PDF文档中。 - DogCoffee
@DogCoffee 如果你找到了解决方案,我会很感兴趣。谢谢... 如何将PDF转换为数据? - FrugalResolution
DogCoffee的代码回答: 在Swift5中,合并对我有效。 - FrugalResolution

9
可以通过PDFKit及其PDFDocument轻松实现此功能。 我正在使用此扩展程序:
    import PDFKit
    
    extension PDFDocument {
    
        func addPages(from document: PDFDocument) {
            let pageCountAddition = document.pageCount
    
            for pageIndex in 0..<pageCountAddition {
                guard let addPage = document.page(at: pageIndex) else {
                    break
                }
    
                self.insert(addPage, at: self.pageCount) // unfortunately this is very very confusing. The index is the page *after* the insertion. Every normal programmer would assume insert at self.pageCount-1
            }
        }
    
    }

记得保存编辑后的PDF,否则您将看不到添加到文件中的页面。供参考,此解决方案https://stackoverflow.com/a/53857161/5691990 - hermannb

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接