2016-10-25 20 views
1

いくつかのPDF文書を表示するには、PDFKit(swift programming language、macOS)からPDFViewを使用しています。 同じPDFの複数のページを表示したいと思います。 解決策は、同じPDFから複数のPDFViewを作成することですが、このように複数の時間に同じメモリを割り当てる必要があり、これは画像が豊富なPDFの問題になる可能性があります。 同じPDFの異なるページを、たとえば4/8の異なる表示ですばやく表示する方法はありますか。複数のページから同じPDFファイルを見る

EDIT:@danielvの 貴重な提案は、最も可能性の高い、同じPDF文書の複数のページを表示する目的のためにうまく機能しないだろう、このコードに

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最終的に私がやりたいことは、「3倍の1ページ」を持つことです.3枚のPDFViewを同じPDFについて作成していますが、使用するメモリを3倍にしたくありません。 – Nisba

答えて

1

PDFViewをもたらしました。

しかし、あなたはそれを自分で行うことができます。 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)を使用してサポートしてPDFドキュメントをロードし、それを表示する必要があるビューに各ページを割り当てるには、draw(with box: PDFDisplayBox, to context: CGContext)はMacOSの10.12以降であることに注意してください。

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

NSViewのコンテキストでPDFページを描画しようとすると、ページ描画はビューの境界を尊重しません。自分で試してみると、私の言いたいことが分かります。現在のグラフィックスコンテキストを目的の座標に変換することによって、コンテキストのスケーリングを自分で行う必要があります。コンテキストと変換の詳細については、_Cocoa Drawing Guide_を検索してください。 'PDFPage'は元のページ境界と、ページが必要であればページを回転させるために使用したかもしれない変換を得るためのいくつかのヘルパーメソッドを提供します。 ? VAR 'コンテキスト= NSGraphicsContext.current() pdfPage .draw(::.mediaBox、へ!コンテキスト.cgContext付き)を聞かせて – danielv

+0

私はこれを試してみましたが、それは(悪いフォーマットのため申し訳ありませんが)動作しません。 pdfWidth =(context?.cgContext.width)! var pdfHeight =(context?.cgContext.height)! var scaleX = visibleRect.width/CGFloat(pdfWidth) var scaleY = visibleRect.height/CGFloat(pdfHeight) コンテキスト?.cgContext。 私はより良い選択肢(コードが働いていれば)は、 "見えない描画コンテキスト"と実際の描画コンテキストを描くことだと思います。 – Nisba

関連する問題