为 UIPrintPageRenderer / UIPrintInteractionController 设置要打印的页面

Setting pages to be printed for UIPrintPageRenderer / UIPrintInteractionController

我的 iOS 应用程序中有一个要使用 AirPrint 打印的 HTML 字符串。但是,该字符串是可自定义的,允许用户设置 margin/paddings、font/font 大小、方向等

因此,有时输出可能超过 2 页,其中第二页为空白。在那里我想设置要打印的页面范围。实际上,无论输出结果如何,我只想打印第一页。

这是打印交互控制器对话框,您可以看到没有设置范围并且输出超过一页:

这是我的代码:

// create an html output text
let markupText = "<div style='width: 100%; text-align: center;'><div style='display: inline-block; margin-top: 35mm; margin-left: 45mm;'>Hello, printer.</div></div>"

// initialize print formatter
let formatter = UIMarkupTextPrintFormatter(markupText: markupText)
formatter.contentInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
formatter.startPage = 0

// initialize print renderer and set its formatter
let printRenderer = UIPrintPageRenderer()
printRenderer.addPrintFormatter(formatter, startingAtPageAtIndex: 0)
printRenderer.prepareForDrawingPages(NSMakeRange(0, 1))

// initialize print controller to present print dialog
let printController = UIPrintInteractionController.sharedPrintController()
printController.printPageRenderer = printRenderer
printController.presentAnimated(true, completionHandler: nil)

我找不到有关设置范围的足够信息,但我认为 prepareForDrawingPages 方法可以解决问题。关于实现这个的任何想法?

如果您想使用 UIPrintPageRenderer 的自定义子类,您还可以重写 numberOfPages 方法来计算页数。但是,我相信您可能只是忘记将 UIPrintInteractionController 属性 showsPageRange 设置为 YES.

我通过将 html 写入 PDF (NSData) 并将 printingItem 属性 设置为该项目来解决此问题。我的代码在objective-c,但同样的原则也适用。

printingItem documentation

Generating PDF content