【问题标题】:UIPrintInteractionController not printing to full page in iPhoneUIPrintInteractionController 未在 iPhone 中打印到整页
【发布时间】:2014-01-06 06:42:38
【问题描述】:

我正在使用 Apple 打印文档示例将 pdf 从 iPhone 打印到兼容 Airprint 的打印机。但我没有从 iPhone 获得整页打印,请查看我得到的图片,我需要将 pdf 打印在全纸长度、宽度上。

下面给出了我用于打印功能的代码,它与 Apple 打印示例应用中的代码相同,

    UIPrintInteractionController *controller = [UIPrintInteractionController sharedPrintController];
    if(!controller){
        NSLog(@"Couldn't get shared UIPrintInteractionController!");
        return;
    }

    UIPrintInteractionCompletionHandler completionHandler =
    ^(UIPrintInteractionController *printController, BOOL completed, NSError *error) {
        if(!completed && error){
            NSLog(@"FAILED! due to error in domain %@ with error code %u", error.domain, error.code);
        }
    };

    controller.delegate = self;

    // Obtain a printInfo so that we can set our printing defaults.
    UIPrintInfo *printInfo = [UIPrintInfo printInfo];
    // This application produces General content that contains color.
    printInfo.outputType = UIPrintInfoOutputGeneral;
    // We'll use the URL as the job name.
    printInfo.jobName = [_filePath lastPathComponent];
    // Set duplex so that it is available if the printer supports it. We are
    // performing portrait printing so we want to duplex along the long edge.
    printInfo.duplex = UIPrintInfoDuplexLongEdge;
    // Use this printInfo for this print job.
    controller.printInfo = printInfo;
    controller.printingItem = myData;
    // Be sure the page range controls are present for documents of > 1 page.
    controller.showsPageRange = YES;

    // This code uses a custom UIPrintPageRenderer so that it can draw a header and footer.
    APLPrintPageRenderer *myRenderer = [[APLPrintPageRenderer alloc] init];
//  UIPrintPageRenderer *myRenderer = [[UIPrintPageRenderer alloc] init];
    // The APLPrintPageRenderer class provides a jobtitle that it will label each page with.
//    myRenderer.jobTitle = printInfo.jobName;
    // To draw the content of each page, a UIViewPrintFormatter is used.
    UIViewPrintFormatter *viewFormatter = [docWebView viewPrintFormatter];

#if SIMPLE_LAYOUT

    UIFont *font = [UIFont fontWithName:@"Helvetica" size:HEADER_FOOTER_TEXT_HEIGHT];
    CGSize titleSize = [myRenderer.jobTitle sizeWithFont:font];
    myRenderer.headerHeight = myRenderer.footerHeight = titleSize.height + HEADER_FOOTER_MARGIN_PADDING;
#endif
    [myRenderer addPrintFormatter:viewFormatter startingAtPageAtIndex:0];
    // Set our custom renderer as the printPageRenderer for the print job.
    controller.printPageRenderer = myRenderer;

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
    {
        [controller presentFromBarButtonItem:sender animated:YES completionHandler:completionHandler];  // iPad
    }
    else
    {
        docWebView.hidden = YES;
        [controller presentAnimated:YES completionHandler:completionHandler];  // iPhone
    }

【问题讨论】:

  • 能否发一个 PDF 文件的链接?
  • pdf文件本地保存在我手机的documents目录下。
  • 你能把它拿下来上传吗?文档的创建方式可能有问题吗?
  • 你说的是纸质版还是软版

标签: ios iphone uiprintpagerenderer uiprintformatter uiprintinteractioncntrler


【解决方案1】:

我通过绘制到 PDF 上下文来生成 PDF 以打印整页。我通过这样的调用设置它:

NSMutableData *pdfData = [NSMutableData data];
UIGraphicsBeginPDFContextToData(pdfData, CGRectZero, nil);

请注意,因为我已经在 CGRectZero 中传递了上下文的默认大小

 /*
  default pdf..
   8.5 X 11 inch
   612 x 792
   */

**这只是 72dpi,但它是默认值。我有一个技巧,可以在绘制之前缩小以提高分辨率:

for (int page = 0 : page < numberPages : page ++ ){
UIGraphicsBeginPDFPage();
CGContextRef pdfContext = UIGraphicsGetCurrentContext();
CGFloat scaleFactor = 3.0;
CGContextSaveGState(pdfContext);
CGContextScaleCTM(pdfContext, 1.0/scaleFactor, 1.0/scaleFactor);


///draw stuff
/// context size is now (612.0 * 3.0 , 792.0 * 3.0) , i.e. resolution 72.0 * 3.0 dpi..
//


CGContextRestoreGState(pdfContext);

}//page drawing loop


NSString *filePath = [[NSFileManager defaultManager] //etcetc make a path];
BOOL success = [pdfData writeToFile:filePath atomically:YES];

好的,现在我有我的 pdf,我直接打印到 UIPrintInteractionController

NSData *pdfData = [NSData dataWithContentsOfFile:[[self pdfView]filePath]];
   if ([UIPrintInteractionController canPrintData:pdfData]) {

    UIPrintInteractionController *pr = [UIPrintInteractionController sharedPrintController];

    void (^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) =
    ^(UIPrintInteractionController *pic, BOOL completed, NSError *error) {
      if (!completed && error) NSLog(@"Print error: %@", error);
    };

    pr.printingItem = pdfData;
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
      [pr presentFromRect:tool.frame inView:self.view animated:YES completionHandler:completionHandler];
    } else {
      [pr presentAnimated:YES completionHandler:completionHandler];
    } 
  }

请注意,我不会弄乱 UIPrintPageRenderer。我对那门课没有经验,我从来不需要研究它。但在我看来,如果它为页眉和页脚腾出空间,那么这些必然会缩小您的文档以腾出空间。尝试将页眉和页脚合并到文档本身中。祝你好运

【讨论】:

    【解决方案2】:
    bestPaperForPageSize:withPapersFromArray:
    

    返回 UIKit 根据给定的页面大小和特定于打印机的纸张大小-可成像区域组合确定最适合打印作业的打印纸对象。

    + (UIPrintPaper *)bestPaperForPageSize:(CGSize)pageSize withPapersFromArray:(NSArray *)paperList
    

    UIPrintInteractionController 的委托可以在其实现UIPrintInteractionControllerDelegate 协议中声明的printInteractionController:choosePaper: 方法时调用此方法。

    【讨论】:

      【解决方案3】:

      而不是 UIViewPrintFormatter *viewFormatter = [docWebView viewPrintFormatter]; 利用 viewPrintFormatter *viewFormatter = [[UIPrintFormatter alloc] init];

      pdf 和图像不需要特定的格式化程序

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-15
        • 1970-01-01
        • 2015-10-30
        • 1970-01-01
        相关资源
        最近更新 更多