使用Core Graphics绘图时,PDF文件显示不正确
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Core Graphics绘图时,PDF文件显示不正确相关的知识,希望对你有一定的参考价值。
面对使用Core Graphics Context绘制时某些PDF文件显示不正确的问题。正确绘制背景块但不显示文本。
借助在线工具对PDF文件进行快速分析后发现,所有文本都保存为单独的图片,并带有一些奇怪的分辨率和dpi。但徽标图像很好。
显示pdf文件的代码如下所示:
// #1 Load CGPDFDocument from file
guard let pdf = CGPDFDocument(NSURL(fileURLWithPath: fileURL.path)) else { return }
DispatchQueue.global(qos: .userInitiated).async { [weak self] in
// #2 Enumerate a file pages
for pageNumber in 1...pdf.numberOfPages {
guard let pdfPage = pdf.page(at: pageNumber) else { return }
var pageRect = pdfPage.getBoxRect(.mediaBox)
// #3 Rendering current page
var previewImage: UIImage?
DispatchQueue.main.sync {
let renderer = UIGraphicsImageRenderer(size: pageRect.size)
previewImage = renderer.image { ctx in
// ...
// #4 Draw PDF page on the context
ctx.cgContext.drawPDFPage(pdfPage)
}
}
// ...
}
此问题发生在iPhone X(ios 11)和iPhone 8(iOS 11)上。但在其他设备上不会发生这种情况(包括iOS 11的其他设备)。
除非我错误处理错误,否则pdf会发生在drawPDFPage函数中。但是幕后发生了什么以及影响结果的是什么?日志中没有错误。
你有类似的问题吗?这个问题的解决方法是什么?有没有其他方法可以从文件中绘制pdf?
任何帮助都会很明显。
答案
我找到了问题的解决方案。
从iOS 11开始,您可以使用PDFKit以简单方便的方式使用此文件格式。在我的应用程序中从PDF页面获取UIImages的代码如下所示:
var pageImages: [UIImage] = []
if #available(iOS 11.0, *) {
// iOS 11 approach
// #1 Load PDFDocument using PDFKit
if let pdfDocument = PDFDocument(url: fileURL) {
// #2 Enumerate a file pages
while pdfDocument.pageCount > index {
guard let pdfPage = pdfDocument.page(at: index) else { continue }
// #3 Rendering current pages thimbnail
pageImages.append(pdfPage.thumbnail(of: self.canvasSize, for: .mediaBox))
index += 1
}
}
} else {
// iOS 10 and earlier
// #1 Load CGPDFDocument from file
guard let pdf = CGPDFDocument(NSURL(fileURLWithPath: fileURL.path)) else { return }
// #2 Enumerate a file pages
for pageNumber in 1...pdf.numberOfPages {
guard let pdfPage = pdf.page(at: pageNumber) else { return }
var pageRect = pdfPage.getBoxRect(.mediaBox)
// #3 Rendering current page
var previewImage: UIImage?
DispatchQueue.main.sync {
let renderer = UIGraphicsImageRenderer(size: pageRect.size)
previewImage = renderer.image { ctx in
// ...
// #4 Draw PDF page on the context
ctx.cgContext.drawPDFPage(pdfPage)
}
}
guard let preview = previewImage else { return }
pageImages.append(preview)
}
别忘了添加import PDFKit
。
以上是关于使用Core Graphics绘图时,PDF文件显示不正确的主要内容,如果未能解决你的问题,请参考以下文章
带有 Core Graphics 绘图的 Core Animation
iOS绘图—— UIBezierPath 和 Core Graphics
在 iOS 上使用 Core Graphics 在 PDF 中嵌入超链接