2015-09-18 1 views
1

Вы можете позвонить renderInContext на слой. Есть ли что-то подобное для UIPrintPageRenderer? Я в основном хочу создать UIImage на первой странице PDF-документа UIPrintPageRenderer. У меня остальная часть кода, кроме фактического рендеринга в контексте.Есть ли эквивалент «renderInContext» для UIPrintPageRenderer

Редактировать: Я не понимаю основную базовую концепцию здесь? Если да, пожалуйста, не стесняйтесь дать мне быстрый урок.

+1

Спасибо! который ответил на мой вопрос. Мне пришлось вызвать метод drawPageAtIndex: inRect в UIPrintPageRenderer. Теперь я вижу потерю качества. Наверное, я задам для этого отдельный вопрос. Можете ли вы просто опубликовать это как ответ, чтобы я мог его выбрать. –

ответ

1

Получение большой части моей информации от Vel Генов в this post, вот что вы должны сделать:

В примере кода ниже добавляет категорию в UIPrintPageRenderer создать фактические данные в формате PDF.

@interface UIPrintPageRenderer (PDF) 
- (NSData*) createPDF; 
@end 

@implementation UIPrintPageRenderer (PDF) 
- (NSData*) createPDF 
{ 
    NSMutableData *pdfData = [NSMutableData data]; 
    UIGraphicsBeginPDFContextToData(pdfData, self.paperRect, nil); 
    [self prepareForDrawingPages: NSMakeRange(0, self.numberOfPages)]; 
    CGRect bounds = UIGraphicsGetPDFContextBounds(); 
    for (int i = 0 ; i < self.numberOfPages ; i++) 
    { 
     UIGraphicsBeginPDFPage(); 
     [self drawPageAtIndex: i inRect: bounds]; 
    } 
    UIGraphicsEndPDFContext(); 
    return pdfData; 
} 
@end 

Тогда это идет в webViewDidFinishLoad()

- (void)webViewDidFinishLoad:(UIWebView *)webViewIn { 
    NSLog(@"web view did finish loading"); 

    // webViewDidFinishLoad() could get called multiple times before 
    // the page is 100% loaded. That's why we check if the page is still loading 
    if (webViewIn.isLoading) 
     return; 

    UIPrintPageRenderer *render = [[UIPrintPageRenderer alloc] init]; 
    [render addPrintFormatter:webViewIn.viewPrintFormatter startingAtPageAtIndex:0]; 

    // Padding is desirable, but optional 
    float padding = 10.0f; 

    // Define the printableRect and paperRect 
    // If the printableRect defines the printable area of the page 
    CGRect paperRect = CGRectMake(0, 0, PDFSize.width, PDFSize.height); 
    CGRect printableRect = CGRectMake(padding, padding, PDFSize.width-(padding * 2), PDFSize.height-(padding * 2)); 

    [render setValue:[NSValue valueWithCGRect:paperRect] forKey:@"paperRect"]; 
    [render setValue:[NSValue valueWithCGRect:printableRect] forKey:@"printableRect"]; 

    // Call the printToPDF helper method that will do the actual PDF creation using values set above 
    NSData *pdfData = [render createPDF]; 

    // Save the PDF to a file, if creating one is successful 
    if (pdfData) { 
     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
     NSString *path = [paths objectAtIndex:0]; 

     NSString *pdfPath = [path stringByAppendingPathComponent:[NSString stringWithFormat:@"Purchase Order.pdf"]]; 

     [pdfData writeToFile:pdfPath atomically:YES]; 
    } 
    else 
    { 
     NSLog(@"error creating PDF"); 
    } 
} 

PDFSize определяется как постоянная, устанавливается в стандартной страницы формата А4. Он может быть отредактирован в соответствии с вашими потребностями.

#define PDFSize CGSizeMake(595.2,841.8) 

Вот что говорит Val о коде:

Когда webViewDidFinishLoad() вызывается, то точка зрения может не быть загружены на 100%. Необходима проверка, чтобы увидеть, продолжает ли просмотр. Это важно, поскольку это может быть источником вашей проблемы. Если это не так, тогда нам хорошо идти. Здесь очень важно отметить. Некоторые веб-страницы загружаются динамически (определенные на самой странице). Возьмите, к примеру, youtube.com. Страница отображается почти сразу, с экраном загрузки. Это обманет наш веб-просмотр, и его свойство isLoading будет установлено на «false», в то время как веб-страница по-прежнему загружает контент динамически. Однако это довольно редкий случай, и в общем случае это решение будет работать хорошо. Если вам нужно создать PDF-файл с такой страницы динамической загрузки, вам может потребоваться переместить фактическое поколение в другое место. Даже с веб-страницей динамической загрузки вы получите PDF-файл, показывающий экран загрузки, а не пустой файл PDF.

Другим ключевым аспектом является настройка printableRect и pageRect. Обратите внимание, что они устанавливаются отдельно. Если значение printableRect меньше, чем paperRect, вы получите некоторое дополнение к содержимому - см., Например, код. Here is a link в API API от Apple с некоторыми краткими описаниями для обоих.