gpt4 book ai didi

ios - Swift iOS - 使用 PDFKit 和 UI 将文本叠加到 PDF 上

转载 作者:行者123 更新时间:2023-12-05 02:04:22 25 4
gpt4 key购买 nike

我在 Swift 5 和 iOS 上工作。我正在尝试将文本叠加到我当前拥有的 PDF 上。我实际上是在移植我从 macOS 应用程序制作的代码。这是 Mac 版本的代码:

func executeContext(at srcURL: URL, to dstURL: URL) {

// Confirm there is a document there
if let doc: PDFDocument = PDFDocument(url: srcURL) {

// Create a document, get the first page, and set the size of the page
let page: PDFPage = doc.page(at: 0)!
var mediaBox: CGRect = CGRect(x: 0, y: 0, width: 792, height: 612)

// This is where the magic happens. Create the drawing context on the PDF
let context = CGContext(dstURL as CFURL, mediaBox: &mediaBox, nil)
let graphicsContext = NSGraphicsContext(cgContext: context!, flipped: false)
NSGraphicsContext.current = graphicsContext

context!.beginPDFPage(nil)

// Draws the PDF into the context
page.draw(with: .mediaBox, to: context!)

// Parse and Draw Text on the context
//drawText()

let attributes = [
NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 72)
]
let text = "I'm a PDF!"
text.draw(at: CGPoint(x: 0, y: 0), withAttributes: attributes)

context!.saveGState()

context!.restoreGState()

context!.endPDFPage()
NSGraphicsContext.current = nil
context?.closePDF()
}
}

drawText() 函数完成了大部分所需的文本叠加,但我在其下方放置了另一个“draw”方法来对其进行测试。

我收到错误 Cannot find 'NSGraphicsContext' in scope 是可以理解的,因为 NSGraphicsContext 在 iOS 上不存在。我尝试使用 UIGraphicsPDFRenderer 或 UIGraphicsBeginPDFContextToData 找到等效的翻译,并使用了 Ray Wenderlich tutorial 中的一些代码,我能够创建一个新的 PDF 并使用以下代码在其上放置文本:

func createDocument(url: URL) -> Data {

//let pdfData = try? Data.init(contentsOf: url)

// 1
let pdfMetaData = [
kCGPDFContextCreator: "Timecard App",
kCGPDFContextAuthor: "Timecard App"
]
let format = UIGraphicsPDFRendererFormat()
format.documentInfo = pdfMetaData as [String: Any]

// 2
let pageWidth = 8.5 * 72.0
let pageHeight = 11 * 72.0
let pageRect = CGRect(x: 0, y: 0, width: pageWidth, height: pageHeight)

// 3
let renderer = UIGraphicsPDFRenderer(bounds: pageRect, format: format)

// 4
let data = renderer.pdfData { (context) in
// 5
context.beginPage()
// 6
let attributes = [
NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 72)
]
let text = "I'm a PDF!"
text.draw(at: CGPoint(x: 0, y: 0), withAttributes: attributes)
}

return data
}

...但我找不到将当前 PDF“数据”加载到渲染器然后从那里绘制的方法。有人对执行此操作的正确方法有任何建议吗?

最佳答案

这是可能的解决方案——实际上您只需要直接使用 CoreGraphics 上下文进行操作,设置电流,翻转变换等(保留原始代码的样式和约定)。

使用 Xcode 12/iOS 14 测试。

demo

func executeContext(at srcURL: URL, to dstURL: URL) {

// Confirm there is a document there
if let doc: PDFDocument = PDFDocument(url: srcURL) {

// Create a document, get the first page, and set the size of the page
let page: PDFPage = doc.page(at: 0)!
var mediaBox: CGRect = page.bounds(for: .mediaBox)

// This is where the magic happens. Create the drawing context on the PDF
let context = CGContext(dstURL as CFURL, mediaBox: &mediaBox, nil)

UIGraphicsPushContext(context!)
context!.beginPDFPage(nil)

// Draws the PDF into the context
page.draw(with: .mediaBox, to: context!)

let flipVertical: CGAffineTransform = CGAffineTransform(a: 1, b: 0, c: 0, d: -1, tx: 0, ty: mediaBox.size.height)
context!.concatenate(flipVertical)

let attributes = [
NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 72)
]
let text = "I'm a PDF!"
text.draw(at: CGPoint(x: 0, y: 0), withAttributes: attributes)

context!.endPDFPage()
context?.closePDF()

UIGraphicsPopContext()
}
}

关于ios - Swift iOS - 使用 PDFKit 和 UI 将文本叠加到 PDF 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64376645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com