适用于iOS的Retina PDF图像渲染

时间:2012-09-26 07:10:06

标签: iphone objective-c ios pdf retina-display

我有以下代码,用于在页面中心呈现带有图像的PDF。然而,图像(实际上也是文本)看起来非常像素化,显然不是为视网膜显示而设计的。

我在以下代码中没有做什么?

-(void)drawText
{
    NSString* fileName = @"Workbook.PDF";

    NSArray *arrayPaths =
    NSSearchPathForDirectoriesInDomains(
                                    NSDocumentDirectory,
                                    NSUserDomainMask,
                                    YES);
    NSString *path = [arrayPaths objectAtIndex:0];
    NSString* pdfFileName = [path stringByAppendingPathComponent:fileName];

    // Create the PDF context using the default page size of 612 x 792.
    UIGraphicsBeginPDFContextToFile(pdfFileName, CGRectZero, nil);
    CGContextSetShouldAntialias(UIGraphicsGetCurrentContext(), YES);

    for(UIImage *image in _pages)
    {

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    NSString* textToDraw = [NSString stringWithFormat:@"Page %i of %@", [_pages indexOfObject:image] + 1, [defaults objectForKey:@"OpenBookKey"]];
    CFStringRef stringRef = (__bridge CFStringRef)textToDraw;

    // Prepare the text using a Core Text Framesetter.
    CFAttributedStringRef currentText = CFAttributedStringCreate(NULL, stringRef, NULL);
    CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(currentText);

    CGRect frameRect = CGRectMake(230, 0, 612, 50);
    CGMutablePathRef framePath = CGPathCreateMutable();
    CGPathAddRect(framePath, NULL, frameRect);

    // Get the frame that will do the rendering.
    CFRange currentRange = CFRangeMake(0, 0);
    CTFrameRef frameRef = CTFramesetterCreateFrame(framesetter, currentRange, framePath, NULL);
    CGPathRelease(framePath);

    // Mark the beginning of a new page.
    UIGraphicsBeginPDFPageWithInfo(CGRectMake(0, 0, 612, 792), nil);

    // Get the graphics context.
    CGContextRef currentContext = UIGraphicsGetCurrentContext();

    CGRect frame = CGRectMake(20, 50, 550, 550);
    [image drawInRect:frame];

    CGContextSetTextMatrix(currentContext, CGAffineTransformIdentity);

    CGContextTranslateCTM(currentContext, 0, 100);
    CGContextScaleCTM(currentContext, 1.0, -1.0);

    // Draw the frame.
    CTFrameDraw(frameRef, currentContext);

    CFRelease(frameRef);
    CFRelease(stringRef);
    CFRelease(framesetter);

    }

    // Close the PDF context and write the contents out.
    UIGraphicsEndPDFContext();

}

2 个答案:

答案 0 :(得分:0)

PDF背景与Retina显示屏无关。图像可能看起来像素化,因为它以小分辨率绘制,文本显示像素化,因为它被绘制到中间位图,然后位图在PDF页面上绘制(这是它在内部工作的方式,其他用户在SO上抱怨像素化的文字)。
图像问题可以通过使用高分辨率图像来解决,这是我不知道的文本问题。

答案 1 :(得分:0)

与Retina显示无关,您只需调整大小适合缩小像素的图像。您可以参考我的代码,您需要添加代码来管理图像大小,以便调整大小

UIGraphicsBeginPDFContextToFile(pdfPath, CGRectZero, nil);
for (UIImage *img in FileArr ) {
    CGRect imageFrame = CGRectMake(0,0, img.size.width, img.size.height);
    UIGraphicsBeginPDFPageWithInfo(CGRectMake(0, 0, img.size.width, img.size.height), nil);
    [img drawInRect:imageFrame];
    NSString *pageString = [NSString stringWithFormat:@"Page 122"];
    UIFont *theFont = [UIFont systemFontOfSize:12];
    CGSize maxSize = CGSizeMake(612, 72);
    CGSize pageStringSize = [pageString sizeWithFont:theFont
                                   constrainedToSize:maxSize
                                       lineBreakMode:UILineBreakModeClip];
    CGRect stringRect = CGRectMake(((612.0 - pageStringSize.width) / 2.0),
                                   720.0 + ((72.0 - pageStringSize.height) / 2.0),
                                   pageStringSize.width,
                                   pageStringSize.height);
    [pageString drawInRect:stringRect withFont:theFont];
}
UIGraphicsEndPDFContext();