0

我有以下代码,它在页面中心呈现带有图像的 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();

}
4

2 回答 2

0

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

于 2012-09-26T08:18:57.107 回答
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();
于 2012-09-26T08:35:06.787 回答