11

当使用 UIMarkupTextPrintFormatter 打印几行简单的 HTML 时,它首先输出一个空白页,然后是带有文本的页面。代码如下,非常简单:

- (void) printSomething;
{
    if (![UIPrintInteractionController isPrintingAvailable])
        return;

    NSString* markupText =@"<html><body>THIS IS A TEST</body></html>";

    UIMarkupTextPrintFormatter* printFormatter =[ [ [UIMarkupTextPrintFormatter alloc] initWithMarkupText:markupText] autorelease];

    UIPrintInteractionController* printInteractionController =[UIPrintInteractionController sharedPrintController];
    printInteractionController.printFormatter =printFormatter;
    printInteractionController.delegate =self;  
    //printInteractionController.showsPageRange =YES;       

    [printInteractionController presentAnimated:YES completionHandler:nil];                                 
}

现在,如果我取消注释showsPageRange =YES,将按预期打印单页,但 UIPrintInteractionController 需要几秒钟才能出现。足以让用户怀疑应用程序是否冻结。

UIMarkupTextPrintFormatter 文档的第一行声明“ UIMarkupTextPrintFormatter 类的实例为多页打印作业布置 HTML 标记文本”。如果格式化程序打印多页,不管内容如何,​​这会有点疯狂......

知道这里有什么问题吗?其他应用程序这样做没有任何问题。提前致谢。

4

4 回答 4

7

我通过拥有正确的 HTML 框架解决了这个问题:

NSString *htmlString = "<!DOCTYPE html><html><head><meta charset='UTF-8'><title>Title</title></head><body>Hello!</body></html>"
于 2014-11-27T09:08:42.847 回答
4

我在出现第二个空白页时遇到了同样的问题,并在此处printInteractionController.showsPageRange = NO;找到了 Apple 示例(第 67 页)。就这个:

- (IBAction)printContent:(id)sender {
    UIPrintInteractionController *pic = [UIPrintInteractionController
                                         sharedPrintController];
    pic.delegate = self;
    UIPrintInfo *printInfo = [UIPrintInfo printInfo];
    printInfo.outputType = UIPrintInfoOutputGeneral;
    printInfo.jobName = self.documentName;
    pic.printInfo = printInfo;
    UIMarkupTextPrintFormatter *htmlFormatter = [[UIMarkupTextPrintFormatter alloc] initWithMarkupText:self.htmlString];
    htmlFormatter.startPage = 0;
    htmlFormatter.contentInsets = UIEdgeInsetsMake(72.0, 72.0, 72.0, 72.0); // 1 inch margins
    pic.printFormatter = htmlFormatter;
    pic.showsPageRange = YES;
    void (^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) =
    ^(UIPrintInteractionController *printController, BOOL completed, NSError
      *error) {
        if (!completed && error) {
            NSLog(@"Printing could not complete because of error: %@", error);
        } };
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        [pic presentFromBarButtonItem:sender animated:YES
                    completionHandler:completionHandler];
    } else {
        [pic presentAnimated:YES completionHandler:completionHandler];
    }
}

此示例使用printInteractionController.showsPageRange = YES;, 并且工作正常,但如果将此行替换为

printInteractionController.showsPageRange = NO;,它会打印额外的第二个空白页。

所以它似乎UIMarkupTextPrintFormatter隐含地打算与 一起使用printInteractionController.showsPageRange = YES;,或者它只是一个 API 错误。

于 2013-02-01T15:36:15.573 回答
1

我遇到了同样的问题,我发现它是由 html 代码引起的

style='page-break-after:always;
于 2016-02-22T07:37:49.117 回答
0

正如@Hassy 在他的回答中提到的那样,问题可能出在 html/css 代码上。

就我而言,我的设置html, body {min-height: 100%;}可能与一些边距/填充效果不佳,但问题可能与 css 相关。
将 a 设置background-colorbody将有助于检查这是否确实是问题(如果颜色在“空白”页面上重叠,则问题出在样式上)。

于 2019-12-16T16:40:08.203 回答