我在UIPrintPageRenderer的帮助下从html内容渲染pdf,不幸的是,当一个元素被分成不同页面上的部分时,有时会发生错误。有什么方法可以避免id吗?
我的代码和截图如下:

UIPrintPageRenderer继承以指定pdf详细信息。
public class CustomPrintPageRenderer: UIPrintPageRenderer {
fileprivate let offsetX: CGFloat = 40.0
fileprivate let offsetY: CGFloat = 12.0
fileprivate let kHeaderHeight: CGFloat = 36
fileprivate let kFooterHeight: CGFloat = 36
fileprivate let debugFrame = false
fileprivate var name: String?
fileprivate var policy: String?
init(name: String, policy: String, content: String) {
self.name = name
self.policy = policy
super.init()
// Set the page frame.
setValue(NSValue(cgRect: App.A4Rect), forKey: "paperRect")
// Set the printing area frame.
setValue(NSValue(cgRect: App.A4Rect.insetBy(dx: 0, dy: 0)), forKey: "printableRect")
headerHeight = kHeaderHeight
footerHeight = kFooterHeight
// Create formatter
let formatter = UIMarkupTextPrintFormatter(markupText: content)
formatter.perPageContentInsets = UIEdgeInsets(top: kHeaderHeight + 15, left: 36, bottom: 0, right: 36)
addPrintFormatter(formatter, startingAtPageAt: 0)
}
override public func drawHeaderForPage(at pageIndex: Int, in headerRect: CGRect) {
if let name = name as NSString?, let policy = policy as NSString? {
add(name: name, policy: policy, in: headerRect)
}
addLogo(in: headerRect)
if debugFrame {
let path = UIBezierPath(rect: headerRect)
UIColor.red.set()
path.stroke()
}
}
override public func drawFooterForPage(at pageIndex: Int, in footerRect: CGRect) {
addPageNumber(at: pageIndex, in: footerRect)
if debugFrame {
let path = UIBezierPath(rect: footerRect)
UIColor.red.set()
path.stroke()
}
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////
// MARK: -
extension CustomPrintPageRenderer {
fileprivate func addLogo(in headerRect: CGRect) {
let image = #imageLiteral(resourceName: "mss-logo")
let desiredHeight: CGFloat = 40
let newWidth = (desiredHeight * image.size.width) / image.size.height
let imageSize = CGSize(width: newWidth, height: desiredHeight)
let imageRect = CGRect(
x: headerRect.width - imageSize.width - offsetX,
y: headerRect.height - imageSize.height + offsetY,
width: imageSize.width,
height: imageSize.height)
image.draw(in: imageRect)
}
fileprivate func add(name: NSString, policy: NSString, in headerRect: CGRect) {
let text = "\(policy) - \(name)"
let font = UIFont(name: "HelveticaNeue", size: 12.0)
let textSize = getTextSize(text: text as String, font: font!)
let pointX = offsetX
let pointY = headerRect.height - textSize.height
let attributes = [NSAttributedStringKey.font: font!, NSAttributedStringKey.foregroundColor: Color.lightGray]
text.draw(at: CGPoint(x: pointX, y: pointY), withAttributes: attributes)
}
fileprivate func addPageNumber(at pageIndex: Int, in footerRect: CGRect) {
let footerText: NSString = "Page \(pageIndex + 1) of \(numberOfPages)" as NSString
let font = UIFont(name: "HelveticaNeue", size: 12.0)
let textSize = getTextSize(text: footerText as String, font: font!)
let pointX = footerRect.width - textSize.width - offsetX
let pointY = footerRect.origin.y + footerRect.height - textSize.height - 25
let attributes = [NSAttributedStringKey.font: font!]
footerText.draw(at: CGPoint(x: pointX, y: pointY), withAttributes: attributes)
}
fileprivate func getTextSize(text: String, font: UIFont!, textAttributes: [NSAttributedStringKey: AnyObject]! = nil) -> CGSize {
let testLabel = UILabel(frame: CGRect(x: 0.0, y: 0.0, width: paperRect.width, height: footerHeight))
if let attributes = textAttributes {
testLabel.attributedText = NSAttributedString(string: text, attributes: attributes)
}
else {
testLabel.text = text
testLabel.font = font!
}
testLabel.sizeToFit()
return testLabel.frame.size
}
}**提醒html **
我用来编写警报并将其添加到pdf的HTML。
<tr>
<td></td>
</tr>
<tr>
<div>
<td class="alert" colspan="2">#TEXT#</td>
</div>
</tr>
<tr>
<td></td>
</tr>**和pdf绘图**
这就是我用CustomPrintPageRenderer绘制pdf的方法。
fileprivate func drawPDFUsingPrintPageRenderer(printPageRenderer: UIPrintPageRenderer) -> NSData! {
let data = NSMutableData()
UIGraphicsBeginPDFContextToData(data, App.A4Rect, nil)
for i in 0 ..< printPageRenderer.numberOfPages {
UIGraphicsBeginPDFPage()
printPageRenderer.drawPage(at: i, in: UIGraphicsGetPDFContextBounds())
}
UIGraphicsEndPDFContext()
return data
}将非常感谢您的任何帮助!
发布于 2021-07-22 19:27:37
@media print {
.pagebreak-before:first-child { display: block; page-break-before: avoid; }
.pagebreak-before { display: block; page-break-before: always; }
button {
page-break-inside: avoid;
}
}然后,您可能会在class元素中使用它们。对图像等使用分页符。
https://stackoverflow.com/questions/65681168
复制相似问题