【问题标题】:CGPDF drawPDFPage with rotation support支持旋转的 CGPDF drawPDFPage
【发布时间】:2017-05-18 00:58:18
【问题描述】:

我在 iOS 10 下使用 CGPDF 保存 PDF 文件。为此,我加载现有的 PDF 页面,并将其写入具有上下文的新文件。这样做时,旋转信息会丢失,并且生成的 PDF 文件的所有页面都重新排列在 0°。

let writeContext: CGContext = CGContext(finalPDFURL, mediaBox: nil, nil)!

// Loop through all pages
let page: CGPDFPage = ...
var mediaBox = page.getBoxRect(.mediaBox)
writeContext.beginPage(mediaBox: &mediaBox)
writeContext.drawPDFPage(page)
writeContext.endPage()
// Loop finished

writeContext.closePDF()

然后我想出了这段代码,它可以很好地处理旋转,但似乎在绘制内容时有轻微的偏移。将它与具有文本或其他任何接近页边距的 PDF 一起使用会导致内容被截断。后来尝试在 pageInfo 字典上设置 x、y 等,但我想我在这里误解了一些东西,请参阅下面的第二个问题。

let page: CGPDFPage = ...

// Set the rotation
var pageDict = [String: Int32]()
pageDict["Rotate"] = CGFloat.init(page.rotationAngle)

writeContext.beginPDFPage(pageDict as CFDictionary?)
writeContext.drawPDFPage(page)
writeContext.endPDFPage()

所以我的问题,

1) 如何使用第一种方法但支持旋转?还是第二个,但没有裁剪内容?

2) 在哪里可以找到此方法的所有可用 pageInfo 键值对的完整列表? https://developer.apple.com/reference/coregraphics/cgcontext/1456578-beginpdfpage

谢谢!

【问题讨论】:

    标签: ios pdf pdf-generation core-graphics cgpdf


    【解决方案1】:

    问题很旧,但希望以下答案对将来的某人有用。它将保留原始PDF页面的旋转信息

    1. 如何使用第一种方法但支持旋转?
    let writeContext: CGContext = CGContext(finalPDFURL, mediaBox: nil, nil)!
    
    // Loop through all pages
    let page: CGPDFPage = ...
    var mediaBox = page.getBoxRect(.mediaBox)
    writeContext.beginPage(mediaBox: &mediaBox)
    
    let m = page.getDrawingTransform(.mediaBox, rect: mediaBox, rotate: 0, preserveAspectRatio: true)
    
    // Following 3 lines makes the rotations so that the page look in the right direction
    writeContext.translateBy(x: 0.0, y: mediaBox.size.height)
    writeContext.scaleBy(x: 1, y: -1)
    writeContext.concatenate(m)
    
    writeContext.drawPDFPage(page)
    writeContext.endPage()
    // Loop finished
    
    writeContext.closePDF()
    

    【讨论】:

      【解决方案2】:

      我从一位 iOS 程序员那里得到反馈,他建议遵循以下原则:

      这三个步骤应该允许您在目标页面重新创建原始页面,同时保持页面旋转字段:(1)通过页面字典在目标页面中设置源页面旋转,(2)设置该旋转(或可能是您正在绘制的 CGContext 中的旋转 * -1?),最后 (3) 将目标中的媒体框显式设置为与源相同(无旋转)。

      【讨论】:

      • 如前所述,我只收到反馈,没有代码示例,我仍然认为这些指针有一天可能会对某人有所帮助,这就是我添加它们的原因。与此同时,我切换到 Apple 更新的 PDFKit,使用起来更加愉快
      猜你喜欢
      • 1970-01-01
      • 2013-01-13
      • 2020-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-27
      • 2014-10-12
      • 2015-03-07
      相关资源
      最近更新 更多