PDF上绘制的图像是颠倒的

时间:2016-02-17 12:50:32

标签: ios pdf uiimage

我正在尝试在现有PDF上绘制图像(显示在屏幕上)。最终目标是在任何地方签署pdf。

My sample code is here on Github

代码(基本)的工作方式如下:

  • 用户点击他想要绘制图片的位置
  • 进行PDF编辑,最终PDF出现在屏幕上

然而问题是我的图像颠倒了。在使用PDF时,我了解到你必须翻转上下文来渲染,它可能是相关的。

- (void)editPDFWithName:(NSString*)pdfName
{
// grab reference to bundled PDF
CGPDFDocumentRef pdf = CGPDFDocumentCreateWithURL((CFURLRef)[[NSBundle mainBundle] URLForResource:pdfName withExtension:@"pdf"]);

const size_t numberOfPages = CGPDFDocumentGetNumberOfPages(pdf);

// Begin PDF context
NSMutableData* data = [NSMutableData data];
UIGraphicsBeginPDFContextToData(data, CGRectZero, nil);

// loop over PDF pages to render it
for(size_t page = 1; page <= numberOfPages; page++)
{
    //  Get the current page and page frame
    CGPDFPageRef pdfPage = CGPDFDocumentGetPage(pdf, page);
    const CGRect pageFrame = CGPDFPageGetBoxRect(pdfPage, kCGPDFMediaBox);

    UIGraphicsBeginPDFPageWithInfo(pageFrame, nil);

    //  Draw the page (flipped)
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextSaveGState(ctx);

    // Y axis is negative in order to render PDF (mandatory)
    CGContextScaleCTM(ctx, 1, -1);
    CGContextTranslateCTM(ctx, 0, -pageFrame.size.height);
    CGContextDrawPDFPage(ctx, pdfPage);
    CGContextRestoreGState(ctx);

    if(page == [self getCurrentPage])
    {
        // 0.75f factor to convert pixel/points
        CGContextDrawImage(ctx, CGRectMake(self.xTouchCoord*0.75f, self.yTouchCoord*0.75f, self.logo.size.width, self.logo.size.height), self.logo.CGImage);
    }

}
UIGraphicsEndPDFContext();

CGPDFDocumentRelease(pdf);
pdf = nil;

//  Save PDF
[self savePDF:data];

}

I tried multiple ways to flip image as suggested on this post

但图像仍在翻转。

我注意到的一件事是,如果我在图像上使用方法drawAtPoint方法,它看起来不会被翻转但不会出现在指定的位置,就像有一个偏移量(see other post here

有人可以提出任何建议吗?我打赌保存和恢复上下文方法,但无法使其正常工作。

1 个答案:

答案 0 :(得分:0)

好吧,我终于找到了解决方案:

  • 使用drawInRect代替CGContextDrawImage
  • 为了获得更好的精确度,请不要忘记将宽度和高度的一半减去坐标以调整中心:

        // 0.75f factor to convert pixel/points
        [self.logo drawInRect:CGRectMake(self.xTouchCoord*0.75f - self.logo.size.width/2, self.yTouchCoord*0.75f - self.logo.size.width/2, self.logo.size.width, self.logo.size.height)];