2010-02-13 111 views
5

我正在嘗試使用下面的代碼繪製PDF頁面。一些PDF的渲染是正確的,但其他的只是顯示爲完全黑色的圖像,或者部分渲染而其餘部分爲黑色。在比較發生的事情時,那些顯示OK的人似乎總是在其中有一些「常規」文本以及一些圖形(圖表等),而出現黑色的那些文本通常是所有圖形(如一頁紙音樂,例如)。任何人都可以在正確的方向指向我嗎? 我在新的3.2 SDK上構建它。iphone某些PDFs呈現爲黑色圖像

謝謝!

// PDF page drawing expects a Lower-Left coordinate system, so we flip the coordinate system 
// before we start drawing. 
CGContextTranslateCTM(context, 0.0, self.bounds.size.height); 
CGContextScaleCTM(context, 1.0, -1.0); 

// Grab the first PDF page 
CGPDFPageRef page = CGPDFDocumentGetPage(myPDF, pageNo); 
// We're about to modify the context CTM to draw the PDF page where we want it, so save  the graphics state in case we want to do more drawing 
CGContextSaveGState(context); 
// CGPDFPageGetDrawingTransform provides an easy way to get the transform for a PDF page. It will scale down to fit, including any 
// base rotations necessary to display the PDF page correctly. 
CGAffineTransform pdfTransform = CGPDFPageGetDrawingTransform(page, kCGPDFCropBox, self.bounds, 0, true); 
// And apply the transform. 
CGContextConcatCTM(context, pdfTransform); 
// Finally, we draw the page and restore the graphics state for further manipulations! 
CGContextDrawPDFPage(context, page); 
CGContextRestoreGState(context); 
+0

試試這個http://www.random-ideas.net/posts/42 – 2010-05-04 13:42:56

回答

4

CGPDFDocumentRef MyGetPDFDocumentRef(const char * filename){0} {0} {0} {0} CFStringRef path; CFURLRef url; CGPDFDocumentRef文件; path = CFStringCreateWithCString(NULL,filename,kCFStringEncodingUTF8); url = CFURLCreateWithFileSystemPath(NULL,path,kCFURLPOSIXPathStyle,0); CFRelease(path); document = CGPDFDocumentCreateWithURL(url); // 2 CFRelease(url); (count)= CGPDFDocumentGetNumberOfPages(document); // 0 if(count == 0) return NULL; } return document; }

void MyDisplayPDFPage (CGContextRef myContext,size_t pageNumber,const char *filename) { 
    CGPDFDocumentRef document; 
    CGPDFPageRef page; 
    document = MyGetPDFDocumentRef (filename);// 1 
    page = CGPDFDocumentGetPage (document, pageNumber);// 2 
    CGContextDrawPDFPage (myContext, page);// 3 
    CGContextTranslateCTM(myContext, 0, 20); 
    CGContextScaleCTM(myContext, 1.0, -1.0); 
    CGPDFDocumentRelease (document);// 4 
} 



#import "DashBoard.h" 

#import <QuartzCore/QuartzCore.h> 

@interface UIImage (WBImage) 
// rotate UIImage to any angle 
-(UIImage*)rotate:(UIImageOrientation)orient; 
@end 

@implementation UIImage (WBImage) 


static inline CGFloat degreesToRadians(CGFloat degrees) 
{ 
    return M_PI * (degrees/180.0); 
} 

static inline CGSize swapWidthAndHeight(CGSize size) 
{ 
    CGFloat swap = size.width; 

    size.width = size.height; 
    size.height = swap; 

    return size; 
} 


-(UIImage*)rotate:(UIImageOrientation)orient 
{ 
    CGRect    bnds = CGRectZero; 
    UIImage*   copy = nil; 
    CGContextRef  ctxt = nil; 
    CGRect    rect = CGRectZero; 
    CGAffineTransform tran = CGAffineTransformIdentity; 

    bnds.size = self.size; 
    rect.size = self.size; 

    switch (orient) 
    { 
     case UIImageOrientationUp: 
      return self; 

     case UIImageOrientationUpMirrored: 
      tran = CGAffineTransformMakeTranslation(rect.size.width, 0.0); 
      tran = CGAffineTransformScale(tran, -1.0, 1.0); 
      break; 

     case UIImageOrientationDown: 
      tran = CGAffineTransformMakeTranslation(rect.size.width, 
                rect.size.height); 
      tran = CGAffineTransformRotate(tran, degreesToRadians(180.0)); 
      break; 

     case UIImageOrientationDownMirrored: 
      tran = CGAffineTransformMakeTranslation(0.0, rect.size.height); 
      tran = CGAffineTransformScale(tran, 1.0, -1.0); 
      break; 

     case UIImageOrientationLeft: 
      bnds.size = swapWidthAndHeight(bnds.size); 
      tran = CGAffineTransformMakeTranslation(0.0, rect.size.width); 
      tran = CGAffineTransformRotate(tran, degreesToRadians(-90.0)); 
      break; 

     case UIImageOrientationLeftMirrored: 
      bnds.size = swapWidthAndHeight(bnds.size); 
      tran = CGAffineTransformMakeTranslation(rect.size.height, 
                rect.size.width); 
      tran = CGAffineTransformScale(tran, -1.0, 1.0); 
      tran = CGAffineTransformRotate(tran, degreesToRadians(-90.0)); 
      break; 

     case UIImageOrientationRight: 
      bnds.size = swapWidthAndHeight(bnds.size); 
      tran = CGAffineTransformMakeTranslation(rect.size.height, 0.0); 
      tran = CGAffineTransformRotate(tran, degreesToRadians(90.0)); 
      break; 

     case UIImageOrientationRightMirrored: 
      bnds.size = swapWidthAndHeight(bnds.size); 
      tran = CGAffineTransformMakeScale(-1.0, 1.0); 
      tran = CGAffineTransformRotate(tran, degreesToRadians(90.0)); 
      break; 

     default: 
      // orientation value supplied is invalid 
      assert(false); 
      return nil; 
    } 

    UIGraphicsBeginImageContext(bnds.size); 
    ctxt = UIGraphicsGetCurrentContext(); 

    switch (orient) 
    { 
     case UIImageOrientationLeft: 
     case UIImageOrientationLeftMirrored: 
     case UIImageOrientationRight: 
     case UIImageOrientationRightMirrored: 
      CGContextScaleCTM(ctxt, -1.0, 1.0); 
      CGContextTranslateCTM(ctxt, -rect.size.height, 0.0); 
      break; 

     default: 
      CGContextScaleCTM(ctxt, 1.0, -1.0); 
      CGContextTranslateCTM(ctxt, 0.0, -rect.size.height); 
      break; 
    } 

    CGContextConcatCTM(ctxt, tran); 
    CGContextDrawImage(ctxt, rect, self.CGImage); 

    copy = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return copy; 
} 


@end 




@implementation DashBoard 

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    filePath=[[NSString alloc] initWithString:[[NSBundle mainBundle] pathForResource:@"roadie" ofType:@"pdf"]]; 

    // an IBOutlet UIScrollView 
    [scrMain setContentSize:CGSizeMake(720, 720)]; 
    // an IBOutlet UIImageView 
    [imgV setFrame:CGRectMake(0, 0, 720, 720)]; 
    UIGraphicsBeginImageContext(CGSizeMake(720, 720)); 
    // initial page is an size_t variable 
    initialPage=1; 
    MyDisplayPDFPage(UIGraphicsGetCurrentContext(), initialPage, [filePath UTF8String],myTable,mainString); 
    imgV.image=UIGraphicsGetImageFromCurrentImageContext(); 
    imgV.image=[imgV.image rotate:UIImageOrientationDownMirrored]; 
} 

只需複製粘貼&上面的代碼。它會爲你工作。

+0

謝謝薩加爾....真棒 – skantner 2010-05-04 17:35:07

3

問題是背景顏色 - 具體來說,我有麻煩的pdf沒有白色背景。用一個白色矩形填充視圖,我的問題就解決了。