1

我有一个 iPad 应用程序,它使用 WebViews 来显示 URL 列表。我希望能够一次打印所有 WebView,而无需使用 PrintInteractionController 多次提示用户。问题是 PrintInteractionController 似乎没有这样做的能力。您不能分配多个 viewFormatter,并且 WebViews 不会被识别为 printItems。我也找不到只打印项目而不显示 PrintInteractionController 的方法。

有谁知道这样做的方法?

干杯。

4

2 回答 2

2

这是一个老问题,但我花了几天时间寻找答案,并遵循 Apple 文档和示例代码中的一些误导性评论。所以,我把它贴在这里是为了拯救下一个我浪费的日子。

具体问题是:如何编写一个UIPrintPageRenderer可以UIWebViews在给 UIPrintInteractionController 的单个打印作业中打印多个?

您可以在不涉及首先使用以下 Apple 示例代码将所有内容转换为 PDF 的解决方案上取得进展:PrintWebView。此文档也将有所帮助:UIPrintPageRenderer。问题是示例应用程序和文档UPPrintPageRenderer建议如果您UIPrintFormatter通过此属性添加多个:

@property(nonatomic,copy) NSArray <UIPrintFormatter *> *printFormatters

-(NSInteger)numberOfPagesApple 为在PrintWebView中覆盖的方法提供的示例代码将正常工作并计算出正确的页数......不!

您需要做的是printFormatters通过下面显示的方法以非显而易见的方式添加,然后更正它们各自的 startPage 属性并共同使用这些属性来计算出正确的 pageCount 以供 UIPrintPageRenderer 返回。相反,使用这个:

-(void)addPrintFormatter:(UIPrintFormatter *)formatter startingAtPageAtIndex:(NSInteger)pageIndex

为什么这个有效而另一个无效?不知道,可能是一个错误....我应该提交一个雷达:) 但是感谢@Mustafa和其他Stackoverflow 答案的提示

以下是在一个打印作业中打印多个 UIWebView 的步骤:

  1. 按照上面引用的PrintWebView示例中的 Apple 大纲,编写您的内容以在您提供给它的webView.viewPrintFormattersUIPrintPageRenderer上设置您想要的属性。
  2. 通过以下方式添加 printFormatters:[addPrintFormatter:startingAtPageAtIndex:]
  3. 在您的UIPrintPageRenderer -(NSInteger)numberOfPages方法中,从每个格式化程序获取 pageCount,并使用它来更新 startPage 和总页数值。

这是要遵循的基本代码大纲(仅供参考:此解决方案适用于使用iOS 9.0部署目标构建的应用程序):

像这样定义您的 UIPrintPageRenderer 类(您实际上并不需要该init方法,但在我的用例中,我在那里设置值,我总是希望这样):

@interface MyPrintPageRenderer : UIPrintPageRenderer
@end

@implementation MyPrintPageRenderer
-(id)init
{
    self = [super init];
    if(self) {
        self.headerHeight = 0;
        self.footerHeight = 0;
    }
    return self;
}

// 
// Set whatever header, footer and insets you want. It is
// important to set these values to something, so that the print
// formatters can figure out their own pageCounts for whatever
// they contain. Look at the Apple sample App for PrintWebView for
// for more details about these values.
//
-(NSInteger)numberOfPages
{
    __block NSUInteger startPage = 0;
    for(UIPrintFormatter *pf in self.printFormatters) {
        pf.contentInsets = UIEdgeInsetsZero;
        pf.maximumContentWidth = self.printableRect.size.width;
        pf.maximumContentHeight = self.printableRect.size.height;

        dispatch_async(dispatch_get_main_queue(), ^{
            pf.startPage = startPage;
            startPage = pf.startPage + pf.pageCount;
        });
    }
    return [super numberOfPages];
}
@end

在处理要打印的 UIWebViews 的打印操作的控制器中,执行以下操作:

-(void)printWebViews
{
    MyPrintPageRenderer *pr = [MyPrintPageRenderer new];
    //
    // Add the printFormatters at sequential startingPageIndexes,
    // your renderer will set them to the correct values later based
    // on the various page metrics and their content.
    //
    [pr addPrintFormatter:_webView1.viewPrintFormatter startingAtPageAtIndex:0];
    [pr addPrintFormatter:_webView2.viewPrintFormatter startingAtPageAtIndex:1];      
    [pr addPrintFormatter:_webView3.viewPrintFormatter startingAtPageAtIndex:2];

    // Set whatever values needed for these as per Apple docs
    UIPrintInfo *pi = [UIPrintInfo printInfo];
    pi.outputType = UIPrintInfoOutputGeneral;

    UIPrintInteractionController *pic = [UIPrintInteractionController sharedPrintController];
    pic.printInfo = pi;
    pic.printPageRenderer = pr;
    [pic presentAnimated:NO completionHandler:nil];
}

瞧!现在......它只是工作;)

于 2016-03-03T10:23:38.843 回答
1

使用printPageRendererUIPrintIterationController 对象的属性。您可以在 UIPrintPageRenderer 子类对象中设置多个 UIPrintFormatter 子类。

于 2011-02-21T00:19:02.807 回答