2011-09-30 3 views
54

scrollviewの内容をPDFの文脈に描画しようとしています&私はpaginationに問題があります。私が使用しているContex Drawing + Pagination

次のコード:

- (void)renderTheView:(UIView *)view inPDFContext:(CGContextRef)pdfContext 
{ 
    // Creating frame. 
    CGFloat heightOfPdf = [[[self attributes] objectForKey:SRCPdfHeight] floatValue]; 
    CGFloat widthOfPdf = [[[self attributes] objectForKey:SRCPdfWidth] floatValue]; 
    CGRect pdfFrame = CGRectMake(0, 0, widthOfPdf, heightOfPdf); 
    CGRect viewFrame = [view frame]; 

    if ([view isKindOfClass:[UIScrollView class]]) 
    { 
     viewFrame.size.height = ((UIScrollView *)view).contentSize.height; 
     [view setFrame:viewFrame]; 
    } 
    // Calculates number of pages. 
    NSUInteger totalNumberOfPages = ceil(viewFrame.size.height/heightOfPdf); 

    // Start rendering. 
    for (NSUInteger pageNumber = 0; pageNumber<totalNumberOfPages; pageNumber++) 
    { 
     // Starts our first page. 
     CGContextBeginPage (pdfContext, &pdfFrame); 
     // Turn PDF upsidedown 
     CGAffineTransform transform = CGAffineTransformIdentity; 
     transform = CGAffineTransformMakeTranslation(0,view.bounds.size.height); 
     transform = CGAffineTransformScale(transform, 1.0, -1.0); 
     CGContextConcatCTM(pdfContext, transform); 

     // Calculate amount of y to be displace. 
     CGFloat ty = (heightOfPdf*(pageNumber)); 

     CGContextTranslateCTM(pdfContext,0,-ty); 
     [view.layer renderInContext:pdfContext]; 

     // We are done drawing to this page, let's end it. 
     CGContextEndPage (pdfContext); 
    }  
} 

それが必要なページ数を作成しますが、誤ってコンテンツを配置します。次の図はその説明です。 enter image description here

コードに間違いがありますか?

+0

これで運がいいですか? – Magnus

+0

ScrollViewからサブビューを取った場合、どのように機能するのでしょうか? – bentford

+0

pdfページに追加する必要がある部分は、スクロールの中に別々のビューを入れてpdfコンテキストにレンダリングします –

答えて

1

PDFを逆さまにするコードは必要ありません。私はこれまで(手動のページネーション、しかしスクロールビューなしで)これを行い、コンテキストを垂直に反転させる必要はありませんでした。私の主な関心事は、すべての反復でそれをやっているということです。逆転させる正当な理由がある場合は、おそらくループ内では必要なく、ループが始まる前に一度だけ必要になるでしょう。また、コードCGContextTranslateCTM(pdfContext,0,-ty);は、問題が解決しない場合は、代わりにCGContextBeginPage()UIGraphicsBeginPDFPage();を試してみてくださいCGContextTranslateCTM(pdfContext,0,heightOfPdf);

と交換する必要があるかもしれません、それはあなたのコードと私の間の唯一の大きな違いです。

1

PDFをレンダリングするこのリンクが見つかりました。複数のページについては、実装は表示されていません。それはあなたの質問にすぐに答えることはありませんが、変換と変換がはるかに少ないpdfをレンダリングする簡単な方法を教えてくれます。

Render PDF

Generate Multipage PDF -anoop

1

あなたがスクロール内部の別々のビューに入れたPDFページに追加し、PDFコンテキスト

OR

にTHTビューをレンダリングする必要がある部分正確な寸法を見つけ、CG法を使って描きます:

 UIImage *Logo=[UIImage imageNamed:@"small-logo-left-top130_133.png"]; 
    CGPoint drawingLogoOrgin = CGPointMake(5,5); 

    UIGraphicsBeginPDFContextToData(pdfData, CGRectZero, nil); 
    UIGraphicsBeginPDFPageWithInfo(pageFrame, nil); 
    CGContextRef pdfContext = UIGraphicsGetCurrentContext(); 
    [Logo drawAtPoint:drawingLogoOrgin]; 

pdfを描画するための描画方法はたくさんあります。それを使ってすべての内容を描くことができます。

1

This githubプロジェクトは間違いなくあなたを助けることができます。

- (void) renderPageAtIndex:(NSUInteger)index inContext:(CGContextRef)ctx { 
CGPDFPageRef page = CGPDFDocumentGetPage(pdf, index + 1); 
CGAffineTransform transform = aspectFit(CGPDFPageGetBoxRect(page, kCGPDFMediaBox), 
             CGContextGetClipBoundingBox(ctx)); 
CGContextConcatCTM(ctx, transform); 
CGContextDrawPDFPage(ctx, page); 

}

+0

pdfのフォントとフォントサイズをコンテキストに追加しながら変更することはできますか... ...またはpdfのフォントやフォントサイズを変更する方法は他にありますか? – iSeeker

0

これはあなたを助けるかもしれません。

- (void) renderPageAtIndex:(NSUInteger)index inContext:(CGContextRef)ctx 
{ 
CGPDFPageRef page = CGPDFDocumentGetPage(pdf, index + 1); 
CGAffineTransform transform = aspectFit(CGPDFPageGetBoxRect(page, kCGPDFMediaBox), 
            CGContextGetClipBoundingBox(ctx)); 
CGContextConcatCTM(ctx, transform); 
CGContextDrawPDFPage(ctx, page); 
} 
+1

そしてRakeshのコメントとの違いは何ですか? ? – kpower

1

個別のPDFページをレイアウトする場合は、UIScrollViewを使用することを検討してください。以下の方法は、ビュー(PDFView)内の各PDFのページをロードし、中心のやり方でスクロールビューのコンテンツに追加します。この場合、

- (void) loadPDFAtPath:(NSString *)path 
{ 
    NSURL *pdfUrl = [NSURL fileURLWithPath:path]; 
    CGPDFDocumentRef document = CGPDFDocumentCreateWithURL((__bridge CFURLRef)pdfUrl); 

    float height = 0.0; 

    for(int i = 0; i < CGPDFDocumentGetNumberOfPages(document); i++) { 
     CGPDFPageRef page = CGPDFDocumentGetPage(document, i + 1); 
     PDFView *pdfView = [[PDFView alloc] initPdfViewWithPageRef:page]; 

     CGRect pageSize = CGPDFPageGetBoxRect(page, kCGPDFCropBox); 
     pv.frame = CGRectMake((self.frame.size.width/2.0) - pageSize.size.width/2.0, height, pageSize.size.width, pageSize.size.height); 
     height += pageSize.size.height + SOME_SPACE_IN_BETWEEN_PAGES; 

     // self is a subclass of UIScrollView 
     [self addSubview:pdfView]; 
     [pdfView setNeedsDisplay]; 
    } 

    CGPDFDocumentRelease(document); 
    [self setContentSize:CGSizeMake(self.frame.size.width, height)]; 
} 

PDFViewはそののdrawRectまたはdrawLayerに単一CGPDFPageRefをレンダリングするための責任があります実装。