在 Swift 中生成多页 PDF

Generate multi-page PDF in Swift

我有一组 UIImage,我想制作成一个长的多页 PDF,每页一张图片。我已经尽可能将每张图像制作成由 NSData 表示的 PDF,但我正在努力寻找有关如何将它们组合成一个长文档的任何信息。

我当前的代码如下所示:

 //Convert images to pdf
    var pdfDatas = [NSData]()
    for image in images {
        let pdfData = NSData.convertImageToPDF(image)

        pdfDatas.append(pdfData!)


    }
    //Combine PDF's to one long document here. 

有人知道如何实现吗?

您在使用 CoreGraphics PDF 功能吗?如果是这样,我认为您可以在绘制每个页面的内容之前和之后使用 CGPDFContextBeginPage()/CGPDFContextEndPage() 对。

类似

CGPDFContextCreateWithURL(...)
CGPDFContextBeginPage(...)

// draw image using CGContextDraw functions

CGPDFContextEndPage(...)

Apple 文档中有更多信息 here

Swift 5.5.2,Xcode 版本 13.2.1.

将图像置于 A4 格式(每页一张图像)、居中并保持纵横比的潜在解决方案。

部分灵感来自于 Ray Wenderlich tutorial on working with PDF

记下我在解决方案中使用的自定义代码:

PDFConstants.A4FormatRectangle 等于 CGRect(x: 0, y: 0, width: 595, height: 842)

您要查找的代码:

func getPDFDataFromImages(_ images: [UIImage], page rect: CGRect = PDFConstants.A4FormatRectangle) -> Data {
    
    let maxWidth        = rect.width
    let maxHeight       = rect.height
    
    var pdfData = Data()
    
    for image in images {
        let aspectWidth     = maxWidth / image.size.width
        let aspectHeight    = maxHeight / image.size.height
        let aspectRatio     = min(aspectWidth, aspectHeight)
        
        let scaledWidth     = image.size.width * aspectRatio
        let scaledHeight    = image.size.height * aspectRatio
        
        let imageYPosition  = (maxHeight - scaledHeight) / 2.0 // So it's centred on Y axis
        let imageXPosition  = (maxWidth - scaledWidth) / 2.0 // So it's centred on X axis
        let imageRect       = CGRect(x: imageXPosition, y: imageYPosition, width: scaledWidth, height: scaledHeight)
        
        let renderer = UIGraphicsPDFRenderer(bounds: rect)
        pdfData = renderer.pdfData { context in
            for image in images {
                context.beginPage()
                image.draw(in: imageRect)
            }
        }
    }
    
    return pdfData
}