首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UIPrintPageRenderer中断不同页面上的内容并跳过页面的一部分

UIPrintPageRenderer中断不同页面上的内容并跳过页面的一部分
EN

Stack Overflow用户
提问于 2021-01-12 17:29:06
回答 1查看 105关注 0票数 0

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

我的代码和截图如下:

UIPrintPageRenderer继承以指定pdf详细信息。

代码语言:javascript
复制
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。

代码语言:javascript
复制
<tr>
    <td></td>
</tr>
<tr>
    <div>
    <td class="alert" colspan="2">#TEXT#</td>
    </div>
</tr>
<tr>
    <td></td>
</tr>

**和pdf绘图**

这就是我用CustomPrintPageRenderer绘制pdf的方法。

代码语言:javascript
复制
   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
   }

将非常感谢您的任何帮助!

EN

回答 1

Stack Overflow用户

发布于 2021-07-22 19:27:37

代码语言:javascript
复制
@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元素中使用它们。对图像等使用分页符。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65681168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档