You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS下使用Swift+PDFKit检测PDF页面方向并按需添加按钮组件

解决方案

PDFKit 中没有你代码里写的page.orientation公开属性,要判断页面是否为横屏,最稳妥的方式是对比页面裁剪框(cropBox)的宽高:宽度大于高度即为横屏模式。

修正后的实现代码

首先是调整判断逻辑后的openPDFDocument方法:

func openPDFDocument() {
    if let documentURL = Bundle.main.url(forResource: "PDF document", withExtension: "pdf"),
       let document = PDFDocument(url: documentURL),
       let page = document.page(at: 0) {
        // 将文档加载到视图、开启自动缩放、设置背景色
        pdfView?.document = document
        pdfView?.autoScales = true
        pdfView?.backgroundColor = UIColor.lightGray
        
        // 判断页面是否为横屏:宽大于高
        let pageCropBounds = page.bounds(for: .cropBox)
        if pageCropBounds.width > pageCropBounds.height {
            self.insertResetButtonInto(page)
        } else {
            // 其他逻辑
        }
    }
}

你提供的insertResetButtonInto方法本身逻辑正确,可以直接使用:

func insertResetButtonInto(_ page: PDFPage) {
    let pageBounds = page.bounds(for: .cropBox)
    let resetButtonBounds = CGRect(x: 90, y: pageBounds.size.height - 300, width: 106, height: 32)
    let resetButton = PDFAnnotation(bounds: resetButtonBounds, forType: PDFAnnotationSubtype(rawValue: PDFAnnotationSubtype.widget.rawValue), withProperties: nil)
    resetButton.widgetFieldType = PDFAnnotationWidgetSubtype(rawValue: PDFAnnotationWidgetSubtype.button.rawValue)
    resetButton.widgetControlType = .pushButtonControl
    resetButton.caption = "Reset"
    page.addAnnotation(resetButton)
    // 绑定重置表单的动作,清空表单字段
    let resetFormAction = PDFActionResetForm()         
    resetFormAction.fieldsIncludedAreCleared = false
    resetButton.action = resetFormAction
}

补充说明

  • 如果你需要给PDF所有页面都添加重置按钮,遍历document.pageCount获取所有页面对象判断即可,不需要只取第0页
  • 如果你需要基于页面原始旋转角度判断,也可以读取page.rotation属性:返回值为0/90/180/270,代表页面顺时针旋转的角度,旋转90/270度的页面通常为横屏

内容的提问来源于stack exchange,提问作者Rami Ammoun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 00:06:00