LoginSignup
1
2

More than 1 year has passed since last update.

【Swift】HTMLからPDFを生成する

Posted at

会計帳簿の帳票をHTMLでデザインしてPDFで出力する

  • 帳票ページのコーディングしてHTML文字列を用意する
  • PDFファイルをHTMLの文字列から生成
  • 作成されたPDFデータを一時ファイルに保存

HTML文字列からPDFファイルを作成

ここでは UIPrintPageRenderer , UIMarkupTextPrintFormatter, UIGraphics を使います

    /*
     この関数はHTML文字列を受け取り、PDFファイルを表す `NSData` オブジェクトを返します。
     */
    func getPDF(fromHTML: String) -> NSData {
        let renderer = UIPrintPageRenderer()
	    // まずレンダラーの設定を行い、希望の紙のサイズを指定します
        let paperFrame = CGRect(origin: .zero, size: paperSize)
        
        renderer.setValue(paperFrame, forKey: "paperRect")
        renderer.setValue(paperFrame, forKey: "printableRect")
        // HTML文字列をフォーマッターに入力します
        let formatter = UIMarkupTextPrintFormatter(markupText: fromHTML)
        renderer.addPrintFormatter(formatter, startingAtPageAt: 0)
        
        let pdfData = NSMutableData()
        // UIGraphics を使ってHTML文字列をPDFに変換します
        UIGraphicsBeginPDFContextToData(pdfData, paperFrame, [:])
        for pageI in 0..<renderer.numberOfPages {
            UIGraphicsBeginPDFPage()
            print(UIGraphicsGetPDFContextBounds())
            renderer.drawPage(at: pageI, in:paperFrame)
        }
        UIGraphicsEndPDFContext()
        return pdfData
    }

作成されたPDFデータを一時ファイルに保存

データをアプリの一時ストレージに保存する

    /*
     この関数は、特定の `data` をアプリのストレージに保存します。さらに、そのファイルが存在する場所のパスを返します。
     */
    func saveToTempDirectory(data: NSData) -> URL? {
        guard let documentDirectory = try? FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false) else { return nil }
        let pDFsDirectory = documentDirectory.appendingPathComponent("PDFs", isDirectory: true)
        do {
            try FileManager.default.createDirectory(at: pDFsDirectory, withIntermediateDirectories: true, attributes: nil)
        }
        catch {
            print("失敗した")
        }
        let filePath = pDFsDirectory.appendingPathComponent("receipt-" + UUID().uuidString + ".pdf")
        do {
            try data.write(to: filePath)
            print(filePath)
            return filePath
        } catch {
            print(error.localizedDescription)
            return nil
        }
    }

参考

iOSアプリのHTMLテンプレートに基づいてPDFを作成します(例えばレシート)
https://qiita.com/MaShunzhe/items/c64c510b7ed44157026a

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2