2016-08-15 7 views
6

Xcode 7.3.2、Swift 2、Cocoa(Mac)。Swift with Cocoa(Mac)でPDFを作成する方法

私のアプリには、テキストを入力するユーザーが関わっており、PDFに書き出すことができます。私のアプリのiOSのバージョンで

、私はCoreTextフレームワークと、比較的簡単にPDFを作成することができます。

let html = "<font face=\'Futura\' color=\"SlateGray\"><h2>\(title)</h2></font><font face=\"Avenir\" color=\"SlateGray\"><h4>\(string)</h4></font>" 

    let fmt = UIMarkupTextPrintFormatter(markupText: html) 

    // 2. Assign print formatter to UIPrintPageRenderer 

    let render = UIPrintPageRenderer() 
    render.addPrintFormatter(fmt, startingAtPageAt: 0) 

    // 3. Assign paperRect and printableRect 

    let page = CGRect(x: 10, y: 10, width: 595.2, height: 841.8) // A4, 72 dpi, margin of 10 from top and left. 
    let printable = page.insetBy(dx: 0, dy: 0) 

    render.setValue(NSValue(cgRect: page), forKey: "paperRect") 
    render.setValue(NSValue(cgRect: printable), forKey: "printableRect") 

    // 4. Create PDF context and draw 

    let pdfData = NSMutableData() 
    UIGraphicsBeginPDFContextToData(pdfData, CGRect.zero, nil) 

    for i in 1...render.numberOfPages { 

     UIGraphicsBeginPDFPage(); 
     let bounds = UIGraphicsGetPDFContextBounds() 
     render.drawPage(at: i - 1, in: bounds) 
    } 

    UIGraphicsEndPDFContext(); 

    // 5. Save PDF file 

    path = "\(NSTemporaryDirectory())\(title).pdf" 
    pdfData.write(toFile: path, atomically: true) 

をしかし、UIMarkupTextPrintFormatterUIPrintPageRendererUIGraphicsBeginPDFContextToData、そしてUIGraphicsEndPDFContextすべてがどのようにOS X上では存在しません。私はこのiOSコード(いくつかのHTMLから基本的なPDFを作成し、それを特定のファイルパスにページ区切りPDFとして書き込む)とMacとCocoaを使って同じことをすることはできますか?

編集:この質問に対する回答はCreate a paginated PDF—Mac OS Xです。

+3

https://developer.apple.com/library/mac/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_pdf/dq_pdf.html#//apple_ref/doc/uid/TP30001066-CH214-CJBHHJCB「PDFの作成」を参照してください。ファイル "を開始点として選択する。あなたはNSAttributedStringをHTMLから作り、それを描くことができます。 – zneak

+0

私のコンピュータの前にはいませんが、NSGraphicsContextでどのようにCGContextRefを設定すれば、NSAttributedStringの描画メソッドを使うことができるでしょうか。 – zneak

+0

より具体的な問題が発生した場合は、質問を編集してください。私は仕事中のWindowsマシン上にいる。 – zneak

答えて

4

純粋なHTMLからPDFを生成する関数です。何が起こっている

func makePDF(markup: String) { 
    let directoryURL = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0] 
    let printOpts: [NSPrintInfo.AttributeKey: Any] = [NSPrintInfo.AttributeKey.jobDisposition: NSPrintInfo.JobDisposition.save, NSPrintInfo.AttributeKey.jobSavingURL: directoryURL] 
    let printInfo = NSPrintInfo(dictionary: printOpts) 
    printInfo.horizontalPagination = NSPrintingPaginationMode.AutoPagination 
    printInfo.verticalPagination = NSPrintingPaginationMode.AutoPagination 
    printInfo.topMargin = 20.0 
    printInfo.leftMargin = 20.0 
    printInfo.rightMargin = 20.0 
    printInfo.bottomMargin = 20.0 

    let view = NSView(frame: NSRect(x: 0, y: 0, width: 570, height: 740)) 

    if let htmlData = markup.dataUsingEncoding(NSUTF8StringEncoding) { 
     if let attrStr = NSAttributedString(HTML: htmlData, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil) { 
      let frameRect = NSRect(x: 0, y: 0, width: 570, height: 740) 
      let textField = NSTextField(frame: frameRect) 
      textField.attributedStringValue = attrStr 
      view.addSubview(textField) 

      let printOperation = NSPrintOperation(view: view, printInfo: printInfo) 
      printOperation.showsPrintPanel = false 
      printOperation.showsProgressPanel = false 
      printOperation.run() 
     } 
    } 
} 

  1. NSAttributedStringにHTMLを入れてください。
  2. NSAttributedStringをNSTextFieldにレンダリングします。
  3. NSTextFieldをNSViewにレンダリングします。
  4. NSViewを使用してNSPrintOperationを作成します。
  5. 印刷パラメータをPDFとして保存するように設定します。
  6. 印刷操作を実行します(実際にはPDFを保存するダイアログが開きます)
  7. 誰もが満足しています。

これは完璧な解決策ではありません。ハードコーディングされた整数値に注意してください。

+0

本当にあなたの答えをありがとう、それは本当に非常に近いです!残念ながら、1ページしか生成されず、オーバーフローテキストが途切れてしまいます。テキストを新しいページに移動させるにはどうすればよいですか? –

+0

多分HTMLのページの高さを決めるためにJavaScriptを使わなければならないかもしれません...毎回PDFと同じHTMLのピクセルの高さを調整するならidk – quemeful

+0

Huh。その物を改ページする簡単な方法はありませんか? [このコードの要点](https://gist.github.com/nyg/b8cd742250826cb1471f)では、簡単な自動ページ設定を使用してiOSでHTML-> PDFを行うことができます.iOSコードのページ区切り部分を変更する方法はありますかOS X上で動作するものに? –

関連する問題