会計帳簿の帳票を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