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