Есть ли эквивалент "renderInContext" для UIPrintPageRenderer

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

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

1 ответ

Решение

Получив большую часть моей информации от Вела Генова в этом посте, вот что вы должны сделать:

Пример кода ниже добавляет категорию к 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 определяется как константа со стандартным размером страницы A4. Его можно редактировать в соответствии с вашими потребностями.

#define PDFSize CGSizeMake(595.2,841.8)

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

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

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

Другие вопросы по тегам