2016-12-28 2 views
0

Вот что я делаю в настоящее время.Как сделать что-то в PDF в Swift?

Во-первых, я получаю документ. Затем я создаю 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 

Есть ли лучший способ сделать это? Чтобы добавить морщинку, мой конечный продукт имеет странное изображение полосы прокрутки (см. Скриншот). Я попробовал добавить скроллеры auto hide & enclosingScrollView? .hasVerticalScroller = false, но ни один из них не скрывает полосу прокрутки.

Заранее благодарен!

Scroll Bar Img

ответ

1

Так что я решил свою собственную проблему. Для кого-то другого, подобного мне, вот что я сделал. Например, чтобы нарисовать окно на странице:

  1. создать CGContext (ctx) для PDFDocuments. Вы можете сделать это либо с данными, либо с URL-адресом, который вы хотите записать.
  2. создать CGPDFDocument с документом, который требуется изменить
  3. получить CGPage от CGPDF вы хотите изменить (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

Простое решение продемонстрировано в видеоролике WWDC 2017 на PDFKit. Я предполагаю, что у вас есть существующий документ, к которому вы хотите добавить рисунок. Вот что делать:

  1. Дайте документ делегату.

  2. В деле делегат реализовать classForPage, чтобы объявить класс для ваших страниц: этот класс должен быть вашим собственным подклассом PDFPage.

  3. В подклассе PDFPage реализуйте draw(with:to:). Вам предоставляется контекст; втяните в это! Обязательно вызовите super, если вы хотите, чтобы по умолчанию был выполнен рисунок.

Если PDFPage подкласс должен рисовать разные вещи на разных страницах, он может узнать, где он находится в документе, запрашивая self.document?.index(for:self).

Смежные вопросы