Получение большой части моей информации от 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 с некоторыми краткими описаниями для обоих.
Спасибо! который ответил на мой вопрос. Мне пришлось вызвать метод drawPageAtIndex: inRect в UIPrintPageRenderer. Теперь я вижу потерю качества. Наверное, я задам для этого отдельный вопрос. Можете ли вы просто опубликовать это как ответ, чтобы я мог его выбрать. –