2016-10-25 2 views
1

Я использую PDFView из PDFKit (быстрый язык программирования, macOS), чтобы отобразить некоторые документы PDF. Я хотел бы отображать несколько страниц одного и того же PDF-файла. Решение состоит в том, чтобы создать несколько PDFView из одного и того же PDF-документа, но таким образом мне приходится выделять несколько раз одну и ту же память, и это может быть проблемой для PDF-изображений, богатых изображениями. Есть ли какой-либо быстрый способ отображения разных страниц одного и того же PDF-файла, скажем, 4/8 разных просмотров?Несколько страниц просмотра одного и того же PDF

EDIT: драгоценные предложения по @danielv привел к этому коду

import Cocoa 
import Quartz 

class PDFPageView: NSView { 

    var pdfPage: PDFPage? 

    override func draw(_ dirtyRect: NSRect) { 
     super.draw(dirtyRect) 
     if(pdfPage != nil) { 
      let context = NSGraphicsContext.current() 
      let pdfBox = PDFDisplayBox.mediaBox   
      let pdfBounds = pdfPage?.bounds(for: pdfBox) 
      let scaleX = visibleRect.width/(pdfBounds?.width)! 
      let scaleY = visibleRect.height/(pdfBounds?.height)! 
      let scale = min(scaleX,scaleY) 
      context?.cgContext.scaleBy(x: scale, y: scale) 
      pdfPage?.draw(with: pdfBox, to: (context?.cgContext)!) 
     } 
    } 
} 
+0

Что вы подразумеваете под «несколькими страницами одного и того же pdf»? PDFView уже отображает несколько страниц с прокруткой, вы хотите отображать их по-другому? – danielv

+0

@ danielv в конечном итоге то, что я хотел бы сделать, это иметь «тройную одиночную страницу», поэтому имея три PDFView о том же PDF-файле, я не хочу дублировать используемую память. – Nisba

ответ

1

PDFView скорее всего, не будет хорошо служить для целей отображения нескольких страниц одного и того же PDF документа.

Но вы можете сделать это сами. PDFPage может нарисовать себя в любом графическом контексте. Вы можете создать подкласс NSView, чтобы нарисовать страницу или использовать другие более причудливые виды, такие как NSCollectionView, и рисовать страницы в свои строки/столбцы/сетку.

Вот примерно, как вы могли бы сделать это с NSView:

Создать подкласс NSView

class PDFPageView: NSView { 

    var pdfPage: PDFPage? 

    override func draw(_ dirtyRect: NSRect) { 
     super.draw(dirtyRect) 

     let context = NSGraphicsContext.current()! 

     pdfPage?.draw(with: .mediaBox, to: context.cgContext) 
    } 
} 

Важно: вам нужно будет преобразовать контекст вашей точки зрения, прежде чем рисовать, чтобы подогнать страницу и компенсировать любые повороты страниц. PDFPage имеет некоторые вспомогательные функции для этого.

Также отметим, что draw(with box: PDFDisplayBox, to context: CGContext) является с MacOS 10.12, чтобы поддержать предыдущие версии используют draw(with box: PDFDisplayBox)

В контроллере, загрузите документ PDF и назначить каждую страницу с точки зрения, что необходимо для его отображения.

class ViewController: NSViewController { 

    @IBOutlet weak var pdfPageView: PDFPageView? 

    var pdfDocumenet: PDFDocument? 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let url = URL(fileURLWithPath: "... pdf filename ...") 
     pdfDocumenet = PDFDocument(url: url) 

     pdfPageView?.pdfPage = pdfDocumenet?.page(at: 0) 

    } 
} 
+0

Спасибо! Можете ли вы, пожалуйста, лучше объяснить мне предложение «Важно: вы будете ... действовать для этого». Я не понял, в чем проблема. – Nisba

+0

Когда вы пытаетесь нарисовать страницу PDF в контексте NSView, рисунок страницы не учитывает границы представления. Попробуйте сами, вы поймете, что я имею в виду. Вам нужно самому масштабировать контекст, обычно, путем преобразования текущего графического контекста в нужные координаты. Найдите Руководство по рисованию _Cocoa Guide_ для получения подробной информации о контекстах и ​​преобразованиях. 'PDFPage' предоставляет некоторые вспомогательные методы, позволяющие получить исходные границы страниц и преобразование, которое страница могла использовать для поворота страницы, если это было необходимо. – danielv

+0

Я пытался с этим, но он не работает (извините за плохое форматирование) 'пусть контекст = NSGraphicsContext.current() pdfPage .draw (с: .mediaBox, на: контекст .cgContext)? вар pdfWidth = (контекст? .cgContext.width)! var pdfHeight = (context? .cgContext.height)! var scaleX = visibleRect.width/CGFloat (pdfWidth) var scaleY = visibleRect.height/CGFloat (pdfHeight) context? .cgContext.scaleBy (x: scaleX, y: scaleY) ' Я думаю, что лучший вариант (если бы код работал) заключался бы в том, чтобы нарисовать« невидимый контекст рисования »и реальный. – Nisba

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