好的,这是一个更详细的答案,提供了我在第一个答案中提到的示例。我在 github 上有一个仓库:
https://github.com/jeffleus/ionic-pdf
和一个在线 github.io 示例:
https://jeffleus.github.io/ionic-pdf/www/#/。
首先,我创建了一个 ReportBuilderSvc,用于生成 pdfMake.org 使用的 JSON 格式的实际报告声明。此过程将是特定于应用程序的,因此我将其生成为单独的服务。您可以在 pdfMake.org 网站上查看我的示例代码并使用您自己的文档定义进行操作。完成报表设计后,将您自己的文档定义 JSON 放在 _generateReport 方法中。
然后,我将 pdfMake.org 库包装在一个名为 ReportSvc 的免费 Angular 服务中。这将调用 ReportBuilderSvc 的公共 generateReport() 方法来获取 reportDefinition JSON。我将生成报告的过程分解为 $q 承诺包装的内部方法,以允许服务发出进度事件,客户端可以使用这些事件来更新 UI。在较旧/较慢的 iPhone 4 设备上,我看到报告过程需要 30-45 秒。这种更新 UI 的能力非常重要,否则应用程序看起来就像冻结了一样。
包装器将过程分为:
- generateReportDef --> in: ReportBuilderSvc out: JSON rpt 对象
- generateReportDoc --> in: JSON doc def out: pdfDoc 对象
- generateReportBuffer --> in: pdfDoc object out: buffer[]
- generateReportBlob --> in: buffer[] out: Blob 对象
- saveFile --> in: Blob object out: filePath of report
在每一步,服务使用内部实用函数在 $rootScope 上广播一个事件:
function showLoading(msg) {
$rootScope.$broadcast('ReportSvc::Progress', msg);
}
这允许客户端在控制器中“订阅”或使用以下代码:
$scope.$on('ReportSvc::Progress', function(event, msg) {
_showLoading(msg);
});
最后,为了显示 pdf,我使用 iframe 并为浏览器中的在线演示设置了带有生成的 dataURI 的 src。而且,我使用 InAppBrowser 和在设备或模拟器上运行时创建的本地文件。我计划对此进行更多清理,以便可以将其作为库包含并作为 Angular 服务注入。这将使客户可以自由地参加带有安全包装的角度/离子服务的报告声明。
任何想法都会受到赞赏,因为我是节点,角度,离子世界的新手,并且绝对可以使用帮助......