2011-10-30 2 views
8

다음 방법을 사용하여 UIView에서 PDF를 생성했습니다. 그들 모두는 PDF를 만들 수 있지만, 품질 손실 :iOS - 렌더링으로 UIView에서 PDF를 생성하면 품질이 떨어집니다.

방법 1 :

@implementation UIView(PDFWritingAdditions) 

- (void)renderInPDFFile:(NSString*)path 
{ 
    CGRect mediaBox = self.bounds; 
    CGContextRef ctx = CGPDFContextCreateWithURL((__bridge_retained CFURLRef)[NSURL fileURLWithPath:path], &mediaBox, NULL); 
    CGPDFPageRef page; 
    CGContextDrawPDFPage(ctx, page); 

    CGPDFContextBeginPage(ctx, NULL); 

    // Also tried following commented lines but no luck 
    // CGContextSetFlatness(ctx, 0.1); 
    // CGContextSetAllowsAntialiasing(ctx, YES); 
    // CGContextSetAllowsFontSmoothing(ctx, YES); 
    // CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh); 
    CGContextScaleCTM(ctx, 1, -1); 
    CGContextTranslateCTM(ctx, 0, -mediaBox.size.height); 
    [self.layer renderInContext:ctx]; 
    CGPDFContextEndPage(ctx); 
    CFRelease(ctx); 
} 

@end 

방법 2 :

- (void)createPDFfromUIView:(UIView*)aView saveToDocumentsWithFileName:(NSString*)aFilename 
{ 
    // Creates a mutable data object for updating with binary data, like a byte array 
    NSMutableData *pdfData = [NSMutableData data]; 

    // Points the pdf converter to the mutable data object and to the UIView to be converted 
    UIGraphicsBeginPDFContextToData(pdfData, aView.bounds, nil); 
    UIGraphicsBeginPDFPage(); 
    CGContextRef pdfContext = UIGraphicsGetCurrentContext(); 


    // draws rect to the view and thus this is captured by UIGraphicsBeginPDFContextToData 

    [aView.layer renderInContext:pdfContext]; 

    // remove PDF rendering context 
    UIGraphicsEndPDFContext(); 

    // Retrieves the document directories from the iOS device 
    NSArray* documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES); 

    NSString* documentDirectory = [documentDirectories objectAtIndex:0]; 
    NSString* documentDirectoryFilename = [documentDirectory stringByAppendingPathComponent:aFilename]; 

    // instructs the mutable data object to write its context to a file on disk 
    [pdfData writeToFile:documentDirectoryFilename atomically:YES]; 
    NSLog(@"documentDirectoryFileName: %@",documentDirectoryFilename); 
} 

나는 확실하지 PDF로 컨텍스트에 대한 몇 가지 설정을 누락 될 수 있습니다 생각합니다. 또한 UIView에서 정확히 동일한 품질의 다음과 같은 방법으로 png 이미지를 만들었습니다.

- (UIImage *)imageFromView:(UIView *)view 
{ 
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0); 
    [view.layer renderInContext:UIGraphicsGetCurrentContext()]; 

    UIImage * img = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 
    // Retrieves the document directories from the iOS device 
    NSArray* documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES); 

    NSString* documentDirectory = [documentDirectories objectAtIndex:0]; 
    NSString* documentDirectoryFilename = [documentDirectory stringByAppendingPathComponent:@"pdf.png"]; 

    // instructs the mutable data object to write its context to a file on disk 
    [UIImagePNGRepresentation(img) writeToFile:documentDirectoryFilename atomically:YES]; 
    NSLog(@"documentDirectoryFileName: %@",documentDirectoryFilename); 
    return img; 
} 

내가 잘못하고있는 것을 누군가 볼 수 있습니까? 감사합니다. .

+0

품질이 어떻게 떨어 집니까? –

+0

원본보기 링크는 다음과 같습니다. 및 이후 pdf 링크 : iEamin

+0

가능한 복제본 [고품질 PDF에서 UIImage] (http://stackoverflow.com/questions/14152477/high-quality-uiimage-from-pdf) – nielsbot

답변

2

망막 디스플레이를 사용합니까? contentsScale 일 수 있습니다. &이 사진 후에, 나는 당신이 원하는 송장의 UIView는 당신의 PDF에 좋은, 높은 품질, 인쇄 벡터 데이터로 렌더링하는 것을보기 전에 당신이 게시 한 것을 지금, 확인 this SO post

편집에서보세요 .

[CALayer renderInContext]는 항상 래스터 데이터를 생성하므로, 수동으로 PDF를 만드는 것이 더 좋습니다. 세금 인보이스에 대해 이야기하는 경우 다음 iOS 업데이트로 레이아웃을 변경 하시겠습니까?

그러나 사용자는 look at this answer을 사용할 수 있습니다. UIView를 PDF 레이아웃의 템플릿 시스템으로 사용하기를 꺼려합니다.

+0

아니,이 정상적인 디스플레이와 함께 발생합니다. – iEamin

+0

나는 pdf에 대한 뷰를 이미 만들었습니다. [솔루션을 찾지 못했기 때문에] UIView를 사용하여 포인트와 색상을 참조로 사용했습니다. 뷰에서 아무 것도 변경하지 않으면 코드를 변경할 필요가 없습니다. 그러나 내가 추가 한 원본 이미지 링크는 "imageFromView"메서드와 래스터 이미지를 사용하여 생성됩니다. 그래서, 내 포인트는 "renderInContext"같은 품질의 PDF를 생성 할 수 있어야합니다. 또한 이미지에서 pdf를 만들려고했으나 운이 없었습니다. . . 같은 문제. – iEamin

+0

CGContextFillRect, CTFontDrawGlyphs 등의 호출을 통해 PDF를 만들어야합니다. renderInContext는 항상 화면 해상도가 나쁜 래스터 PDF를 만듭니다. –

0

예제 이미지를 보면 나는 당신의 기대가 옳은 것인지 잘 모르겠다 ... 미리보기 창은 부분적으로 확대되어 있지만 비트 맵 이미지는 PDF로 그려 지므로 '가장자리가 톱니 모양' '을 선택합니다. 실제 크기 (미리보기 또는 Cmd-0의보기 메뉴에서)를 볼 경우 스크린 샷에 다소 차이가있는 이미지가 나타납니다.

그러나 실제로하고 싶은 것은 비트 맵 UIView를 PDF 컨텍스트로 렌더링하는 것이 아니라 CoreGraphics 드로잉 및 레이아웃을 대신 PDF 컨텍스트에 직접 적용하는 것입니다. 이 자습서 http://www.raywenderlich.com/6818/how-to-create-a-pdf-with-quartz-2d-in-ios-5-tutorial-part-2에서 예제를 확인하십시오. 이렇게하면 확대 할 때 텍스트와 선이 선명하게 유지되고 용지에 인쇄 할 경우 우수한 품질의 제품을 보장 할 수 있습니다. Quartz2D 벡터 그래픽은 여러분의 친구입니다. 적어도 거대한 PDF 파일을 만들지 않고서도 비트 맵으로 높은 품질을 얻을 수는 없으므로 ...

0

편집 그래, 정확히 같은 문제는 아니지만

https://stackoverflow.com/a/14152516/210171

: 나는

나는이 거기에 내 대답을 참조하십시오 High quality UIImage from PDF

의 속는 생각 솔루션이 유사합니다 생각

페이지 크기로 PDF를 요청하면 72 PPI에 대해 너비/높이가 이됩니다. 스케일 변환을 사용하여 크기를 조정 한 컨텍스트를 만들 수도 있습니다. 예를 들어, 300 dpi로 렌더링하려면 축척 변환을 축척에 300.0/72.0으로 추가하십시오.

TIFF로 내보내는 경우 생성 된 이미지의 최종 PPI (300)을 캡슐화 할 수 있습니다.

관련 문제