Печать PDF из UIWebView дает немасштабированные страницы
Я загружаю файл PDF, который является NSData в веб-просмотр как таковой:
[webView loadData:pdf MIMEType:@"application/pdf" textEncodingName:@"utf-8" baseURL:nil];
Он прекрасно отображается в UIWebView и правильно показывает количество страниц в формате PDF.
Однако, когда я пытаюсь распечатать, я получаю целую страницу, а затем оставленную страницу, заполненную, может быть, последней десятой или около того одной страницы PDF. Другими словами, у меня нет переписки на одну страницу. Кажется, это не уменьшает объем контента.
Как мне масштабировать вывод на печать? Я печатаю, используя этот фрагмент:
UIPrintInteractionController *pic =
[UIPrintInteractionController sharedPrintController];
UIPrintInfo *printInfo = [UIPrintInfo printInfo];
printInfo.outputType = UIPrintInfoOutputGeneral;
printInfo.jobName = printName;
printInfo.duplex = UIPrintInfoDuplexNone;
pic.printInfo = printInfo;
pic.printFormatter = [webView viewPrintFormatter];
pic.showsPageRange = YES;
Этот вопрос описывает метод, который включает масштабирование входных данных, но я надеюсь, что существует нечто более простое.
С уважением, датчанин
1 ответ
Так что у меня тоже была эта проблема. Я использовал UIWebView для доступа к ссылке на сайт, который открыл PDF-документ в окне. Когда PDF печатался, документ обрезался внизу и отправлялся на следующую страницу. Это было досадно, потому что теперь двухстраничный PDF-документ печатался как трехстраничный PDF-документ, на третьей странице практически ничего не было. Мое решение было простым, я сделал две вещи. Я не проверял, необходимы ли обе эти вещи для решения этой проблемы, однако я опубликую обе.
В этом методе в моем ViewController.m:
- (void) webViewDidStartLoad:(UIWebView *)webView
{
webView.scalesPageToFit = YES;
}
а затем в моем методе печати (у меня есть метод для печати, так как у меня есть несколько сцен с веб-просмотрами и кнопками печати.
-(void) printWebView:(UIWebView *)webView {
UIPrintInfo *pi = [UIPrintInfo printInfo];
pi.outputType = UIPrintInfoOutputGeneral;
pi.jobName = webView.request.URL.absoluteString;
pi.orientation = UIPrintInfoOrientationPortrait;
UIPrintInteractionController *pic = [UIPrintInteractionController sharedPrintController];
pic.printInfo = pi;
pic.showsPageRange= NO;
UIPrintPageRenderer *renderer = [[UIPrintPageRenderer alloc] init];
webView.viewPrintFormatter.printPageRenderer.headerHeight = 30.0f;
webView.viewPrintFormatter.printPageRenderer.footerHeight = 30.0f;
webView.viewPrintFormatter.contentInsets = UIEdgeInsetsMake(0.0f, 30.0f, 0.0f, 30.0f);
webView.viewPrintFormatter.startPage = 0;
[renderer addPrintFormatter:webView.viewPrintFormatter startingAtPageAtIndex:0];
pic.printPageRenderer = renderer;
[pic presentAnimated:YES completionHandler:^(UIPrintInteractionController *pic2, BOOL completed, NSError *error) {
// indicate done or error
}];
}
Теперь я не знаю, все ли это необходимо для вашего приложения, но строки, которые я добавил, помогли мне решить проблему масштабирования:
webView.scalesPageToFit = YES;
и pic.showsPageRange= NO;
Это может показаться немного странным, но из того, что я прочитал,
pic.showsPageRange= NO;
здесь ключ Если бы для этого параметра было установлено значение yes, XCode AirPrint масштабировал бы всю страницу винт, и ваши поля были бы испорчены, как у меня с моим PDF, загруженным внутри моего веб-просмотра. Я действительно прочитал это на Stackru и хотел бы отметить автора ответа на пост, но у меня возникли некоторые трудности с поиском его поста. Это кажется чем-то вроде компромисса, поскольку в диалоговом окне печати больше не будет отображаться диапазон страниц для печатаемого документа, однако для коротких документов я лично считаю, что стоит компромисса за простоту реализации масштабированной печати документа по сравнению с длительный обходной путь.
В любом случае, я надеюсь, что это сработает для вас, и если вы найдете что-то лучшее, дайте нам знать.
PS Я знаю, что мой код для форматирования / рендеринга все испортил, я пытался выяснить, как я мог манипулировать параметрами печати в XCode и еще не удалил ненужные строки.