0

我在使用 imageFromPDFWithDocumentRef 来获取我的 PDF 封面时遇到了一个奇怪的问题。

代码如下。

 - (UIImage *)imageFromPDFWithDocumentRef:(CGPDFDocumentRef)documentRef
{
    CGPDFPageRef pageRef = CGPDFDocumentGetPage(documentRef, 1);
    CGRect pageRect = CGPDFPageGetBoxRect(pageRef, kCGPDFCropBox);

    UIGraphicsBeginImageContext(pageRect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextTranslateCTM(context, CGRectGetMinX(pageRect),CGRectGetMaxY(pageRect));
    CGContextScaleCTM(context, 1, -1);  
    CGContextTranslateCTM(context, -(pageRect.origin.x), -(pageRect.origin.y));

    CGContextSetInterpolationQuality(context, kCGInterpolationLow);
    CGContextSetRenderingIntent(context, kCGRenderingIntentDefault);

    CGContextDrawPDFPage(context, pageRef);

    UIImage *finalImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return finalImage;
}

但有时结果是这样的(“ABC”代表pdf文件的名称)

在此处输入图像描述

我的意思是这样。

在此处输入图像描述

我想知道是否有人可以帮我一把,并在此先感谢。:)

4

1 回答 1

2

您的代码不处理页面旋转,这就是在某些情况下输出旋转的原因。替换此代码:

CGContextTranslateCTM(context, CGRectGetMinX(pageRect),CGRectGetMaxY(pageRect));
CGContextScaleCTM(context, 1, -1);  
CGContextTranslateCTM(context, -(pageRect.origin.x), -(pageRect.origin.y));

使用此代码:

switch (rotate) {
    case 0:
        // Translate the origin of the coordinate system at the 
        // bottom left corner of the page rectangle.
        CGContextTranslateCTM(context, 0, cropBox.size.height);
        // Reverse the Y axis to grow from bottom to top.
        CGContextScaleCTM(context, 1, -1);
        break;
    case 90:
        // Reverse the Y axis to grow from bottom to top.
        CGContextScaleCTM(context, 1, -1);
        // Rotate the coordinate system.
        CGContextRotateCTM(context, -M_PI / 2);
        break;
    case 180:
    case -180:
        // Reverse the Y axis to grow from bottom to top.
        CGContextScaleCTM(context, 1, -1);
        // Translate the origin of the coordinate system at the 
        // top right corner of the page rectangle.
        CGContextTranslateCTM(context, cropBox.size.width, 0);
        // Rotate the coordinate system with 180 degrees.
        CGContextRotateCTM(context, M_PI);
        break;
    case 270:
    case -90:
        // Translate the origin of the coordinate system at the 
        // bottom right corner of the page rectangle.
        CGContextTranslateCTM(context, cropBox.size.height, cropBox.size.width);
        // Rotate the coordinate system.
        CGContextRotateCTM(context, M_PI / 2);
        // Reverse the X axis.
        CGContextScaleCTM(context, -1, 1);
        break;
}

在我的代码中,cropBox 与代码中的 pageRect 相同。关于如何将 PDF 坐标系映射到图像/屏幕坐标系的更详细说明见我博客上的这篇文章(此代码取自那里):http: //ipdfdev.com/2011/03/23/display- a-pdf-page-on-the-iphone-and-ipad/

于 2013-09-10T11:49:24.817 回答