是否可以在更大的pdf页面内绘制pdf矢量图像?

时间:2016-03-03 21:29:28

标签: ios swift pdf core-graphics

我有一个pdf矢量文件,我希望将其显示为pdf文档的一部分。我真的不想将其更改为UIImage文件。我只是觉得这样做会降低质量。我试图做的是获取pdf的url并将其添加到主pdf文档中。我已经计算出我的pdf向量的大小并创建了一个CGRect,如下所示:

class

然后我想到只使用以下但是意识到我不能因为UIImage目前不支持pdf矢量图像

func drawPDFfromURL(url: NSURL) {
    guard let document = CGPDFDocumentCreateWithURL(url) else { return nil }
    guard let page = CGPDFDocumentGetPage(document, 1) else { return nil }

    let pageRect = CGPDFPageGetBoxRect(page, .MediaBox)

    let size = pageRect.size

    pdfImagePageRect = CGRectMake(0, 0, size.width, size.height)

    print("The size of the pdf is \(size)")

}

我只是觉得必须有一种方法将pdf矢量图像插入到pdf文档中。有什么建议吗?

1 个答案:

答案 0 :(得分:2)

虽然UIImage不支持PDF文件,但Apple确实提供了一种将PDF绘制到图形上下文中的方法(无论它是什么):

func CGContextDrawPDFPage(_ c: CGContext?, _ page: CGPDFPage?)

这将允许您获取正在编写的PDF的图形上下文,打开第二个PDF文件,获取对页面的引用并将页面呈现到PDF上下文中。

唯一困难的部分是您需要设置正确的变换矩阵,以便您渲染的PDF文件在正确的位置绘制并使用您想要的缩放。

另请查看此页面:https://www.cocoanetics.com/2010/06/rendering-pdf-is-easier-than-you-thought/,其中显示了如何绘制传入PDF文件的正确部分。该链接的基本代码是:

// url is a file URL
CGPDFDocumentRef pdf = CGPDFDocumentCreateWithURL((CFURLRef)url);
CGPDFPageRef page1 = CGPDFDocumentGetPage(pdf, 1);

// get the rectangle of the cropped inside
CGRect mediaRect = CGPDFPageGetBoxRect(page1, kCGPDFCropBox);
CGContextScaleCTM(ctx, rect.size.width / mediaRect.size.width,
    rect.size.height / mediaRect.size.height);
CGContextTranslateCTM(ctx, -mediaRect.origin.x, -mediaRect.origin.y);

// draw it
CGContextDrawPDFPage(ctx, page1);