SwiftHtmlPdf 1.0.4

SwiftHtmlPdf 1.0.4

Niklas Gromann 维护。



  • 作者
  • Niklas Gromann

SwiftHtmlPdf

CocoaPods compatible Platform iOS Swift 5 compatible License: MIT

通过使用模板 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")
        }
    }

在不使用预览对话框解析模板

要在不使用预览对话框的情况下解析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)