SwiftHtmlPdf
通过使用模板 html 文件和填充它们的数据来生成 HTML 和 PDF 文档。
此库允许您使用 HTML 模板文件生成 HTML 和 PDF。试试我们的 示例项目!
要求
- iOS 10 +
安装
您可以使用 Cocoa Pods 来安装 SwiftHtmlPdf。
将 SwiftHtmlPdf 添加到项目的 Podfile
文件中。
target 'MyApp' do
pod 'SwiftHtmlPdf', '~> 1.0'
end
然后运行以下命令:
$ pod install
用法
建立html模板资源并将其保存在您的项目中
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta content="text/html; charset=utf-8" http-equiv="content-type">
...
</style>
</head>
<body>
<h1>PDF Example</h1>
<ul>
<item name="MyListItem"/>
</ul>
</body>
</html>
<region name="MyListItem">
<li>
<field name="Name"/>
</li>
</region>
注意以下HTML标签
<item name="MyListItem"/>
- 这是对MyListItem区域的引用。
<region name="MyListItem">...</region>
- 这是MyListItem实例的蓝图。
<field name="Name"/>
- 这是一个将被变量替换的域。
在模板中填充数据
首先创建您的模型并实现PDFComposerDelegate
import SwiftHtmlPdf
...
class MyListItem: PDFComposerDelegate {
var name: String
init(_ name: String) {
self.name = name
}
func valueForParameter(parameter: String, index: Int) -> String {
switch parameter {
case "Name":
return name
default:
print("Unhandled PDF Key \(parameter) in MyListItem")
return parameter
}
}
func itemsForParameter(parameter: String, index: Int) -> [PDFComposerDelegate] {
return []
}
}
现在在根对象中实现该代理。在本例中,根对象是ViewController。
extension ViewController: PDFComposerDelegate {
var myListItems = [MyListItem("Hello"), MyListItem("World")]
func valueForParameter(parameter: String, index: Int) -> String {
return ""
}
func itemsForParameter(parameter: String, index: Int) -> [PDFComposerDelegate] {
return myListItems
}
注意以下代理函数
valueForParameter(parameter: String, index: Int)
- 此函数将对模板中的每个
<field name="{parameter}"/>
进行调用
- 此函数将对模板中的每个
func itemsForParameter(parameter: String, index: Int) -> [PDFComposerDelegate]
- 此函数将对当前模板区域中的每个
<item name="{parameter}"/>
进行调用 - 返回一个处理该区域的孩子对象数组。
- 对于每个返回的对象,将实例化一个新的区域:
<region name="{parameter}">...</region>
- 此函数将对当前模板区域中的每个
在您的应用中显示预览对话框
func showPdfPreview() {
let preview = PDFPreviewController.instantiate()
do {
let resourceName = "planbuildpro-baukosten-template"
let delegate = self
try preview.loadPreviewFromHtmlTemplateResource(templateResource: resourceName, delegate: delegate)
present(preview, animated: true, completion: nil)
} catch {
print("Could not open pdf preview")
}
}
- resourceName是模板html的文件名。不包含后缀(.html)
- delegate是视图控制器(根对象)
在不使用预览对话框解析模板
要在不使用预览对话框的情况下解析html模板,可以调用以下函数
let htmlContent = PDFComposer.renderHtmlFromResource(templateResource: templateResource, delegate: delegate)
此函数的功能与预览对话框类似,但返回解析过的html。
接下来,您可以转换html内容为PDF
let pdfData = PDFComposer.exportHTMLContentToPDF(HTMLContent: htmlContent)
或者您可以使用以下函数创建一个PDF文件:
let pdfData = PDFComposer.exportHTMLContentToPDFFile(HTMLContent: htmlContent, path: path)
现在您可以使用 UIActivityViewController
来分享PDF文件。
let activityVC = UIActivityViewController(activityItems: [pdfData], applicationActivities: nil)
self.present(activityVC, animated: true, completion: nil)