UIMarkupTextPrintFormatter
は、HTML img
タグをサポートしていないようです。 Appleのマニュアルはあまり有益ではありません。初期設定パラメータは"印刷フォーマッタのHTMLマークアップテキスト"です。印刷フォーマッタによってサポートされているタグが正確に示されていません。
多くのテストの結果、私が描くことができる唯一の結論は、UIMarkupTextPrintFormatter
はになります。イメージの表示がサポートされています。
ここで、HTMLコンテンツからPDFを作成する利便性を望む人はいますか?
この作業を行うために私が見つけた唯一の方法は、HTMLコンテンツを読み込んでからWebビューのUIViewPrintFormatter
を使用する非表示のWebビューを使用することです。これは動作しますが、実際にハックのように感じます。
それはあなたのPDF文書に画像を埋め込みますが、もし私がCoreTextとQuartz 2Dを使用すると、私はそれが私が理解できると言っているように、あなたのHTMLコンテンツのサイズや複雑さはわかりません。実施例のように
...
セットアップ
私はちょうど私が使用したい画像のファイル名を渡すことができるようにベースURLを定義することが有用でした。ベースURLは、画像が配置されているアプリバンドル内のディレクトリにマップされます。独自の場所も定義できます。
Bundle.main.resourceURL + "www/"

それから私は、ドキュメント関連機能を処理するためのプロトコルを作成しました。デフォルトの実装は、以下のコードで見られるように、拡張によって提供されます。
protocol DocumentOperations {
// Takes your image tags and the base url and generates a html string
func generateHTMLString(imageTags: [String], baseURL: String) -> String
// Uses UIViewPrintFormatter to generate pdf and returns pdf location
func createPDF(html: String, formmatter: UIViewPrintFormatter, filename: String) -> String
// Wraps your image filename in a HTML img tag
func imageTags(filenames: [String]) -> [String]
}
extension DocumentOperations {
func imageTags(filenames: [String]) -> [String] {
let tags = filenames.map { "<img src=\"\($0)\">" }
return tags
}
func generateHTMLString(imageTags: [String], baseURL: String) -> String {
// Example: just using the first element in the array
var string = "<!DOCTYPE html><head><base href=\"\(baseURL)\"></head>\n<html>\n<body>\n"
string = string + "\t<h2>PDF Document With Image</h2>\n"
string = string + "\t\(imageTags[0])\n"
string = string + "</body>\n</html>\n"
return string
}
func createPDF(html: String, formmatter: UIViewPrintFormatter, filename: String) -> String {
// From: https://gist.github.com/nyg/b8cd742250826cb1471f
print("createPDF: \(html)")
// 2. Assign print formatter to UIPrintPageRenderer
let render = UIPrintPageRenderer()
render.addPrintFormatter(formmatter, startingAtPageAt: 0)
// 3. Assign paperRect and printableRect
let page = CGRect(x: 0, y: 0, width: 595.2, height: 841.8) // A4, 72 dpi
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
let path = "\(NSTemporaryDirectory())\(filename).pdf"
pdfData.write(toFile: path, atomically: true)
print("open \(path)")
return path
}
}
次に、このプロトコルをビューコントローラで採用しました。この作業を行うための鍵はここにあり、あなたのView ControllerはUIWebViewDelegate
を採用し、 func webViewDidFinishLoad(_ webView: UIWebView)
にはpdfが作成されているのがわかります。彼の答えfragilecat、私は3 viewcontrollersと一緒にサンプルプロジェクトを入れているから部品を使用して
class ViewController: UIViewController, DocumentOperations {
@IBOutlet private var webView: UIWebView!
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
webView.delegate = self
webView.alpha = 0
if let html = prepareHTML() {
print("html document:\(html)")
webView.loadHTMLString(html, baseURL: nil)
}
}
fileprivate func prepareHTML() -> String? {
// Create Your Image tags here
let tags = imageTags(filenames: ["PJH_144.png"])
var html: String?
// html
if let url = Bundle.main.resourceURL {
// Images are stored in the app bundle under the 'www' directory
html = generateHTMLString(imageTags: tags, baseURL: url.absoluteString + "www/")
}
return html
}
}
extension ViewController: UIWebViewDelegate {
func webViewDidFinishLoad(_ webView: UIWebView) {
if let content = prepareHTML() {
let path = createPDF(html: content, formmatter: webView.viewPrintFormatter(), filename: "MyPDFDocument")
print("PDF location: \(path)")
}
}
}
私にはいくつか質問があります。画像はローカルであるか、html文書のURL参照ですか?あなたはあなたの作成のPDF文書に画像を追加したいですか?あなたはあなたの現在のpdfの出力をあなたの望むものと比べて投稿/モックアップできますか? –
@fragilecat画像は電話機のファイルです。私は