使用Core Graphics绘图时,PDF文件显示不正确

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Core Graphics绘图时,PDF文件显示不正确相关的知识,希望对你有一定的参考价值。

面对使用Core Graphics Context绘制时某些PDF文件显示不正确的问题。正确绘制背景块但不显示文本。

enter image description here

借助在线工具对PDF文件进行快速分析后发现,所有文本都保存为单独的图片,并带有一些奇怪的分辨率和dpi。但徽标图像很好。

enter image description here

显示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框架 利用Quartz 2D绘图

带有 Core Graphics 绘图的 Core Animation

iOS绘图—— UIBezierPath 和 Core Graphics

在 iOS 上使用 Core Graphics 在 PDF 中嵌入超链接

使用 Core Graphics 绘图在 Retina 显示屏上看起来很厚实

使用 Core Graphics 绘制圆弧时绘制的额外线