使用 swift 将图像转换为 A4 大小的 pdf
Converting images to A4 size pdf using swift
我想将 UIImage 数组转换为 pdf 文件。 PDF 文件页面大小应为 A4。我尝试使用 PDFKIT,但结果不合适。
我想要的:
- A4 页面大小
- 图像应在页面上居中并缩放(数组图像尺寸不相同)
我试过的:
func makePDF(images: [UIImage])-> PDFDocument? {
let pdfDoc = PDFDocument()
for (index,image) in images.enumerated() {
let resizedImage = resizeImage(image: image, targetSize: PDFPageSize.A4)
guard let cgImage = resizedImage?.cgImage else { return pdfDoc }
let uiimage = UIImage(cgImage: cgImage, scale: image.scale, orientation: .up)
if let pdfPage = PDFPage(image: uiimage) {
let page = CGRect(x: 0, y: 0, width: 595.2, height: 841.8) // A4, 72 dpi
pdfPage.setBounds(page, for: PDFDisplayBox.mediaBox)
pdfDoc.insert(pdfPage, at: index)
}
}
return pdfDoc
}
func resizeImage(image: UIImage, targetSize: CGSize) -> UIImage? {
let size = image.size
let widthRatio = targetSize.width / size.width
let heightRatio = targetSize.height / size.height
var newSize: CGSize
if(widthRatio > heightRatio) {
newSize = CGSize(width: size.width * heightRatio, height: size.height * heightRatio)
} else {
newSize = CGSize(width: size.width * widthRatio, height: size.height * widthRatio)
}
let rect = CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height)
UIGraphicsBeginImageContextWithOptions(newSize, false, 1.0)
image.draw(in: rect)
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage
}
我的输出是:
- 图片丢失
- 图像裁剪
- 不在中心位置
My Output
我的期望输出是:
My Desire Output
我该怎么做?
首先你要明白为什么你会看到你所看到的,这在一定程度上解释了这一点:
由于 PDF 的原点在左下角,当您添加内容时,它会被添加到页面底部,这就是为什么您的图像位于底部。
您可能需要执行以下操作来解决此问题:
- 您的
graphics context
应该是 PDF 页面的大小,而不是图像
- 您在图形上下文中将图像居中
- 将此图片添加到您的 pdf 页面
以下是我要对您的调整大小功能所做的修改:
func resizeImage(image: UIImage, targetSize: CGSize) -> UIImage? {
let size = image.size
let widthRatio = targetSize.width / size.width
let heightRatio = targetSize.height / size.height
var newSize: CGSize
if(widthRatio > heightRatio) {
newSize = CGSize(width: size.width * heightRatio, height: size.height * heightRatio)
} else {
newSize = CGSize(width: size.width * widthRatio, height: size.height * widthRatio)
}
// Calculate the centerX and centerY
let centerX = (targetSize.width - newSize.width) / 2.0
let centerY = (targetSize.height - newSize.height) / 2.0
// The rect of the image should be based on the center calculations
let rect = CGRect(x: centerX,
y: centerY,
width: newSize.width,
height: newSize.height)
// The graphics context should be created with the page dimensions
UIGraphicsBeginImageContextWithOptions(targetSize, false, 1.0)
// The rest remains the same
image.draw(in: rect)
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage
}
而且我相信您会在 PDF 页面中获得所需的图像输出:
更新
要改变生成图像的质量,请尝试使用 UIGraphicsBeginImageContextWithOptions
函数的 scale
参数。
您可以通过 2.0
将比例增加到 2 倍或通过 0
使用设备的分辨率。
UIGraphicsBeginImageContextWithOptions(targetSize, false, 0.0)
我想将 UIImage 数组转换为 pdf 文件。 PDF 文件页面大小应为 A4。我尝试使用 PDFKIT,但结果不合适。
我想要的:
- A4 页面大小
- 图像应在页面上居中并缩放(数组图像尺寸不相同)
我试过的:
func makePDF(images: [UIImage])-> PDFDocument? {
let pdfDoc = PDFDocument()
for (index,image) in images.enumerated() {
let resizedImage = resizeImage(image: image, targetSize: PDFPageSize.A4)
guard let cgImage = resizedImage?.cgImage else { return pdfDoc }
let uiimage = UIImage(cgImage: cgImage, scale: image.scale, orientation: .up)
if let pdfPage = PDFPage(image: uiimage) {
let page = CGRect(x: 0, y: 0, width: 595.2, height: 841.8) // A4, 72 dpi
pdfPage.setBounds(page, for: PDFDisplayBox.mediaBox)
pdfDoc.insert(pdfPage, at: index)
}
}
return pdfDoc
}
func resizeImage(image: UIImage, targetSize: CGSize) -> UIImage? {
let size = image.size
let widthRatio = targetSize.width / size.width
let heightRatio = targetSize.height / size.height
var newSize: CGSize
if(widthRatio > heightRatio) {
newSize = CGSize(width: size.width * heightRatio, height: size.height * heightRatio)
} else {
newSize = CGSize(width: size.width * widthRatio, height: size.height * widthRatio)
}
let rect = CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height)
UIGraphicsBeginImageContextWithOptions(newSize, false, 1.0)
image.draw(in: rect)
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage
}
我的输出是:
- 图片丢失
- 图像裁剪
- 不在中心位置
My Output
我的期望输出是:
My Desire Output
我该怎么做?
首先你要明白为什么你会看到你所看到的,这在一定程度上解释了这一点:
由于 PDF 的原点在左下角,当您添加内容时,它会被添加到页面底部,这就是为什么您的图像位于底部。
您可能需要执行以下操作来解决此问题:
- 您的
graphics context
应该是 PDF 页面的大小,而不是图像 - 您在图形上下文中将图像居中
- 将此图片添加到您的 pdf 页面
以下是我要对您的调整大小功能所做的修改:
func resizeImage(image: UIImage, targetSize: CGSize) -> UIImage? {
let size = image.size
let widthRatio = targetSize.width / size.width
let heightRatio = targetSize.height / size.height
var newSize: CGSize
if(widthRatio > heightRatio) {
newSize = CGSize(width: size.width * heightRatio, height: size.height * heightRatio)
} else {
newSize = CGSize(width: size.width * widthRatio, height: size.height * widthRatio)
}
// Calculate the centerX and centerY
let centerX = (targetSize.width - newSize.width) / 2.0
let centerY = (targetSize.height - newSize.height) / 2.0
// The rect of the image should be based on the center calculations
let rect = CGRect(x: centerX,
y: centerY,
width: newSize.width,
height: newSize.height)
// The graphics context should be created with the page dimensions
UIGraphicsBeginImageContextWithOptions(targetSize, false, 1.0)
// The rest remains the same
image.draw(in: rect)
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage
}
而且我相信您会在 PDF 页面中获得所需的图像输出:
更新
要改变生成图像的质量,请尝试使用 UIGraphicsBeginImageContextWithOptions
函数的 scale
参数。
您可以通过 2.0
将比例增加到 2 倍或通过 0
使用设备的分辨率。
UIGraphicsBeginImageContextWithOptions(targetSize, false, 0.0)