Swift 中的函数将 Pdf 文件附加到另一个 Pdf

Posted

技术标签:

【中文标题】Swift 中的函数将 Pdf 文件附加到另一个 Pdf【英文标题】:Function in Swift to Append a Pdf file to another Pdf 【发布时间】:2016-05-10 08:26:47 【问题描述】:

我使用以下代码在两个不同的视图中创建了两个不同的 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 的内容附加到第一个吗?请edit您的问题并解释一下。 是的,这正是我的意思。 ***.com/questions/6553540/merge-pdf-files-on-ios ? 它在 Swift 中对我不起作用。 @Ali:另一个问题给出的解决方案有什么问题? 【参考方案1】:

斯威夫特 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

【讨论】:

这会起作用,但它会删除您添加的任何注释,例如链接。我发现最简单的方法是从您的数据中创建多个 PDFDocument,然后为每个获取其 PDFPage。然后,您可以从这些页面将这些页面中的每一个插入新的 PDFDocument @DogCoffee 如果您找到了解决方案,我会很感兴趣。谢谢...如何将 PDF 转换为数据? ***.com/a/64190865/12035498DogCoffee 在代码中的回答:Merging is working for me in swift5【参考方案2】:

这可以通过 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
            
        
    
    

【讨论】:

【参考方案3】:

斯威夫特 5:

像这样合并 pdf 以保留链接等...

See answer here

【讨论】:

以上是关于Swift 中的函数将 Pdf 文件附加到另一个 Pdf的主要内容,如果未能解决你的问题,请参考以下文章

如何在 swift 3.0. 中将一个 pdf 合并到另一个 pdf 文件中?

在 Swift 3 中附加一个函数范围之外的变量

Swift 3 - NSLayoutConstraint CollectionView 附加到另一个视图

在 Swift 中传递数组

如何在 Symfony2 中使用 Swiftmailer 将 PDF 附加到电子邮件

如何将绘图附加到现有的 pdf 文件