从UIWebView打印PDF会产生未缩放的页面

时间:2013-05-14 18:36:04

标签: ios objective-c airprint

我正在将一个NSF的pdf文件加载到webview中:

[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;

这个so question描述了一个涉及缩放输入的方法,但我希望存在更简单的东西。

此致 戴恩

1 个答案:

答案 0 :(得分:6)

所以我也有这个问题。我使用UIWebView访问在窗口中打开PDF文档的网站链接。打印PDF时,文档在底部被裁剪并发送到下一页。这很烦人,因为现在一个两页的PDF文档打印为三页PDF文档,第三页基本上没有任何内容。我的修复很简单我做了两件事。我还没有测试过这两件事是否都是解决这个问题的必要条件,但我会发布任何内容。

在我的ViewController.m中使用此方法:

- (void) webViewDidStartLoad:(UIWebView *)webView
{
    webView.scalesPageToFit = YES;
}

然后在我的打印方法中(我有一个打印方法,因为我有多个带有webview和打印按钮的场景。

-(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;

是关键。如果将其设置为是,则XCode AirPrint会缩小分页的所有内容,并且您的边距会像我在我的webview中加载的PDF一样搞砸了。我实际上是在StackOverflow上读到这个,并且想要归功于帖子答案的作者,但我在查找帖子时遇到了一些困难。这似乎有点折衷,因为打印对话框将不再显示正在打印的文档的页面范围,但是对于简短文档,我个人认为值得权衡实现缩放文档打印的简单性与冗长的解决方法。

无论如何,我希望这适合你,如果你找到更好的东西,请告诉我们。

PS我知道格式化/渲染的代码都搞砸了,我试图找出如何在XCode中操作打印选项并且还没有删除不必要的行。