2010-10-11 29 views
7

Tôi đang hiển thị một trang pdf trên CGContext sử dụng mãCGContext khía cạnh trang pdf phù hợp

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context 
{ 
    CGContextSetRGBFillColor(ctx, 1.0, 1.0, 1.0, 1.0); 
    CGContextFillRect(ctx, layer.bounds); 
    CGContextTranslateCTM(ctx, 0.0, layer.bounds.size.height); 
    CGContextScaleCTM(ctx, 1.0, -1.0); 
    CGContextConcatCTM(ctx, CGPDFPageGetDrawingTransform(myPageRef, kCGPDFBleedBox, layer.bounds, 0, true)); 
    CGContextDrawPDFPage(ctx, myPageRef); 
} 

Vấn đề là các trang pdf là nhận được vẽ trên trung tâm của trang để lại biên giới trên tất cả bốn phía. Có cách nào để làm cho trang phù hợp với màn hình không.

Trả lời

15

Để mở rộng câu trả lời của Tia; phương thức tích hợp CGPDFPageGetDrawingTransform sẽ giảm tỷ lệ nhưng không tăng lên. Nếu bạn muốn mở rộng quy mô thì bạn cần phải làm việc ra biến đổi của riêng bạn bằng cách so sánh kết quả của CGPDFGetBoxRect với khu vực nội dung của bạn. Gõ extemporaneously:

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context 
{ 
    CGContextSetRGBFillColor(ctx, 1.0, 1.0, 1.0, 1.0); 
    CGContextFillRect(ctx, layer.bounds); 
    CGContextTranslateCTM(ctx, 0.0, layer.bounds.size.height); 
    CGContextScaleCTM(ctx, 1.0, -1.0); 

    CGRect cropBox = CGPDFGetBoxRect(myPageRef, kCGPDFCropBox); 
    CGRect targetRect = layer.bounds; 
    CGFloat xScale = targetRect.size.width/cropBox.size.width; 
    CGFloat yScale = targetRect.size.height/cropBox.size.height; 
    CGFloat scaleToApply = xScale < yScale ? xScale : yScale; 
    CGContextConcatCTM(ctx, CGAffineTransformMakeScale(scaleToApply, scaleToApply));  

    CGContextDrawPDFPage(ctx, myPageRef); 
} 

Vì vậy: work out bao nhiêu bạn sẽ phải mở rộng các tài liệu bằng cách cho nó để chiếm toàn bộ chiều rộng của xem, bao nhiêu để chiếm toàn bộ chiều cao và sau đó thực sự mở rộng của ít của hai giá trị đó.

+0

bạn có thể vui lòng trả lời câu hỏi này tôi cũng đang cố gắng cùng một cách nhưng tôi không thể có được chính xác phù hợp http://stackoverflow.com/questions/3908624/cgcontext-pdf-page-aspect-fit – ajay

+0

Đó là một liên kết đến câu hỏi này; có lẽ bạn có nghĩa là http://stackoverflow.com/questions/4321681/how-to-fit-pdf-page-in-entire-view? Tôi sẽ xem xét ngay sau khi tôi có cơ hội, mặc dù tôi thật đáng buồn trên đường ra ... – Tommy

+0

Cập nhật nhỏ, CGPDFGetBoxRect có vẻ là CGPDFPageGetBoxRect nhưng cực kỳ hữu ích! Việc định cỡ này đã khiến tôi phát điên. Ngoài ra bạn có thể tìm thấy bao gồm cả dòng CGContextConcatCTM (ctx, CGPDFPageGetDrawingTransform (myPageRef, kCGPDFCropBox, layer.bounds, 0, true)); trước khi CGContextDrawPDFPage trợ giúp với bất kỳ tệp PDF nào được xoay 90 cạnh – sradforth

1

Đọc kỹ mã của bạn cho thấy việc sử dụng kCGPDFBleedBox phải được thay thế bằng một cài đặt khác, có thể là kCGPDFMediaBox. Xem here để biết thêm thông tin.

+0

fbrereto, tôi đã thử kCGPDFMediaBox và tất cả các tùy chọn khác có sẵn. Nhưng không có thay đổi nào trong màn hình. –

2

Chỉ CGPDFPageGetDrawingTransform sẽ không trả về chuyển đổi tỷ lệ nếu hình chữ nhật trang PDF nhỏ hơn tham số rect.

+0

tia, tôi đã thử cùng một trang trong một số ứng dụng đọc pdf khác và đang hiển thị đúng cách phù hợp với màn hình. Vì vậy, có cách nào khác để vẽ nó để làm cho nó phù hợp với khía cạnh. –

0

Các câu trả lời khác là chính xác rằng CGPDFPageGetDrawingTransform sẽ không mở rộng quy mô, tuy nhiên bạn có thể mở rộng hình chữ nhật xuống để chỉ chụp hộp đã chọn. Sử dụng CGPDFPageGetBoxRect() và tính toán tỷ lệ như Tommy đề xuất trong câu trả lời được chấp nhận, sau đó sử dụng để thu nhỏ hình chữ nhật chụp được chuyển vào CGPDFPageGetDrawingTransform().

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context 
{ 
    CGContextSetRGBFillColor(ctx, 1.0, 1.0, 1.0, 1.0); 
    CGContextFillRect(ctx, layer.bounds); 
    CGContextTranslateCTM(ctx, 0.0, layer.bounds.size.height); 

    CGRect box = CGPDFGetBoxRect(myPageRef, kCGPDFBleedBox); 
    CGFloat xScale = layer.bounds.size.width/cropBox.size.width; 
    CGFloat yScale = layer.bounds.size.height/cropBox.size.height; 
    CGFloat scaleToApply = xScale < yScale ? xScale : yScale; 

    CGRect captureRect = CGRectMake(0, 0, 
            layer.bounds.size.width/scaleToApply, 
            layer.bounds.size.height/scaleToApply); 

    CGAffineTransform drawXfm = CGPDFPageGetDrawingTransform(myPageRef, 
                  kCGPDFBleedBox, 
                  captureRect, 
                  0, 
                  true); 

    CGContextScaleCTM(ctx, scaleToApply, -scaleToApply); 
    CGContextConcatCTM(ctx, drawXfm); 
    CGContextDrawPDFPage(ctx, myPageRef); 
} 

Sau đó nó dễ dàng mở rộng để xử lý cảnh quan quá:

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context 
{ 
    CGContextSetRGBFillColor(ctx, 1.0, 1.0, 1.0, 1.0); 
    CGContextFillRect(ctx, layer.bounds); 
    CGContextTranslateCTM(ctx, 0.0, layer.bounds.size.height); 

    CGRect box = CGPDFGetBoxRect(myPageRef, kCGPDFBleedBox); 
    int rotate; 
    CGFloat xScale, yScale; 
    if (box.size.width > box.size.height) { 
     // landscape 
     rotate = 270; 
     xScale = layer.bounds.size.height/cropBox.size.width; 
     yScale = layer.bounds.size.width/cropBox.size.height; 
    } else { 
     // portrait 
     rotate = 0; 
     xScale = layer.bounds.size.width/cropBox.size.width; 
     yScale = layer.bounds.size.height/cropBox.size.height; 
    } 
    CGFloat scaleToApply = xScale < yScale ? xScale : yScale; 

    CGRect captureRect = CGRectMake(0, 0, 
            layer.bounds.size.width/scaleToApply, 
            layer.bounds.size.height/scaleToApply); 

    CGAffineTransform drawXfm = CGPDFPageGetDrawingTransform(myPageRef, 
               kCGPDFBleedBox, 
               captureRect, 
               rotate, 
               true); 

    CGContextScaleCTM(ctx, scaleToApply, -scaleToApply); 
    CGContextConcatCTM(ctx, drawXfm); 
    CGContextDrawPDFPage(ctx, myPageRef); 
} 
0

Đây là giải pháp của tôi, mà cũng xử lý luân chuyển. Có thể hữu ích.

// Create transformation 
int rotation = CGPDFPageGetRotationAngle(pdfPage); 
CGRect rect = CGPDFPageGetBoxRect(pdfPage, kCGPDFCropBox); 
CGRect rotatedRect = rect; 
CGRectApplyAffineTransform(rotatedRect, CGAffineTransformMakeRotation(M_PI * rotation/180.0)); 

CGFloat scale = MIN(self.bounds.size.width/rotatedRect.size.width, self.bounds.size.height/rotatedRect.size.height); 
// Scale 
CGContextConcatCTM(context, CGAffineTransformMakeScale(scale, scale)); 
// Move left bottom cornet to 0, 0 
CGContextConcatCTM(context, CGAffineTransformMakeTranslation(rotatedRect.size.width * 0.5, rotatedRect.size.height * 0.5));  
// Rotate 
CGContextConcatCTM(context, CGAffineTransformMakeRotation(-M_PI * rotation/180.0));  
// Move center into 0, 0 
CGContextConcatCTM(context, CGAffineTransformMakeTranslation(-rect.origin.x - rect.size.width * 0.5, -rect.origin.y - rect.size.height * 0.5)); 

CGContextDrawPDFPage(context, pdfPage); 
Các vấn đề liên quan