【问题标题】:Generate multi-page PDF in Swift在 Swift 中生成多页 PDF
【发布时间】:2016-03-12 19:03:53
【问题描述】:

我有一组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. 

有谁知道如何做到这一点?

【问题讨论】:

    标签: ios swift pdf nsdata


    【解决方案1】:

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

    类似

    CGPDFContextCreateWithURL(...)
    CGPDFContextBeginPage(...)
    
    // draw image using CGContextDraw functions
    
    CGPDFContextEndPage(...)
    

    Apple 的文档here 中有更多信息。

    【讨论】:

    • 好的,谢谢。为我的图像数组添加了一个循环,其中包含存在和结束页面。
    【解决方案2】:

    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
    }
    

    【讨论】:

      猜你喜欢
      • 2017-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-01
      • 1970-01-01
      • 2019-12-25
      • 1970-01-01
      相关资源
      最近更新 更多