0

ページの中央に画像があるPDFをレンダリングする次のコードがあります。ただし、画像 (および実際のテキスト) は非常にピクセル化されており、明らかに Retina ディスプレイ用に設計されていません。

次のコードで何をしていないのですか?

-(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

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 に答える
0

The PDF context has nothing to do with the Retina display. The image might appear pixelated because it is drawn at a small resolution and the text appears pixelated because it is drawn to an intermediary bitmap and then the bitmap is drawn on the PDF page (this is how it seems to work internally, other users on SO complain about pixelated text).
The image problem can be solved by using a high resolution image, the text problem I do not know.

于 2012-09-26T08:18:57.107 に答える