2016-12-28 73 views
0

這是我目前正在做的。如何在Swift上繪製PDF文件?

首先,我得到的文件。接下來,我創建一個PDF視圖並將文檔分配給視圖。然後我創建一個視圖並在視圖中進行繪製,然後將視圖添加到PDFView中作爲子視圖。然後我將PDFView轉換爲數據,然後轉換爲PDF文檔。由於我在PDF的第一頁上執行繪圖,因此我從原始PDF中刪除第一頁,插入新的第一頁並返回文檔。

guard let document = PDFDocument(url: url) else { return nil } 
guard let page = document.page(at: 0) else { return nil } 
let pageBounds = page.bounds(for: .mediaBox) 

let pdfView = PDFView(frame: pageBounds) 
pdfView.document = document 
pdfView.enclosingScrollView?.autohidesScrollers = true 

let view = /// code for subview that I am drawing on 
pdfView.addSubview(view) 

let data = pdfView.dataWithPDF(inside: pageBounds) 
guard let pdf = PDFDocument(data: data) else { return nil } 

document.removePage(at: 0) 
document.insert(pdf.page(at: 0)!, at: 0) 
return document 

有沒有更好的方法來做到這一點?要添加皺紋,我的最終產品有一個奇怪的滾動條圖像(請參閱屏幕截圖)。我嘗試添加自動隱藏滾動條& enclosingScrollView?.hasVerticalScroller = false,但都沒有隱藏滾動條。

提前致謝!

Scroll Bar Img

回答

1

所以我解決了我自己的問題。對於像我這樣卡住的其他人,這是我所做的。例如,要在頁面上繪製一個框:

  1. 爲PDFDocuments創建一個CGContext(ctx)。您可以使用數據或者想要寫入的URL來做到這一點。
  2. 創建要編輯
  3. 得到你想要編輯的CGPDF的CGPage的文檔CGPDFDocument(cgPage)

和:

ctx?.beginPDFPage(nil) 
ctx?.drawPDFPage(cgPage) 
ctx?.beginPath() 
let path = CGPath(roundedRect: box as CGRect, cornerWidth: 5, cornerHeight: 5, transform: nil) 
ctx?.setStrokeColor(CGColor.black) 
ctx?.setFillColor(color.cgColor) 
ctx?.setLineWidth(10.0) 
ctx?.addPath(path) 
ctx?.strokePath() 
ctx?.addPath(path) 
ctx?.fillPath() 
ctx?.endPDFPage() 
ctx?.closePDF() 

(如果你創建的上下文有一個URL,關閉會寫入磁盤,否則你必須對PDF數據做些什麼。)

0

一個簡單的解決方案在2017年WWDC視頻中展示了PDFKit。我假設你有一個你想要添加繪圖的現有文檔。這是做什麼:

  1. 給文件一個委託。

  2. 在委託中,實現classForPage爲您的頁面聲明一個類:該類應該是您自己的PDFPage子類。

  3. 在您的PDFPage子類中,實現draw(with:to:)。給你一個背景;吸取它!如果您想要使用默認繪圖,請務必致電super

如果您PDFPage子類需要不同的頁面上畫出不同的東西,它可以找出它在文檔中通過詢問self.document?.index(for:self)