1# 使用Web组件保存前端页面为PDF 2<!--Kit: ArkWeb--> 3<!--Subsystem: Web--> 4<!--Owner: @zhang-yinglie--> 5<!--Designer: @handyohos--> 6<!--Tester: @ghiker--> 7<!--Adviser: @HelloCrease--> 8 9从API version 14开始,支持使用Web组件的[createPdf](../reference/apis-arkweb/arkts-apis-webview-WebviewController.md#createpdf14)方法,为应用提供了保存前端页面为PDF的功能。 10 11通过[createPdf](../reference/apis-arkweb/arkts-apis-webview-WebviewController.md#createpdf14)生成实例后,调用`pdfArrayBuffer`方法获取二进制数据流,再使用`fileIo`方法将二进制数据流保存为PDF文件。用户可以将前端页面内容保存为PDF以便分享或保存。例如,生成报告、发票等,方便用户保存和传输。 12 13## 需要权限 14若涉及网络文档获取,需在module.json5中配置网络访问权限。具体添加方法请参考[在配置文件中声明权限](../security/AccessToken/declare-permissions.md#在配置文件中声明权限)。 15 16 ``` 17 "requestPermissions":[ 18 { 19 "name" : "ohos.permission.INTERNET" 20 } 21 ] 22 ``` 23 24 25## callback方式保存PDF 26通过callback方式调用`createPdf`接口,获取到的result通过`pdfArrayBuffer`接口取得PDF二进制数据流,最后使用`fileIo`方法将二进制数据流保存为PDF文件。 27```ts 28import { fileIo as fs } from '@kit.CoreFileKit'; 29import { webview } from '@kit.ArkWeb'; 30import { BusinessError } from '@kit.BasicServicesKit'; 31import { common } from '@kit.AbilityKit'; 32 33 34@Entry 35@Component 36struct Index { 37 controller: webview.WebviewController = new webview.WebviewController(); 38 pdfConfig: webview.PdfConfiguration = { 39 width: 8.27, 40 height: 11.69, 41 marginTop: 0, 42 marginBottom: 0, 43 marginRight: 0, 44 marginLeft: 0, 45 shouldPrintBackground: true 46 } 47 48 49 build() { 50 Column() { 51 Button('SavePDF') 52 .onClick(() => { 53 // 触发PDF生成,需要确保页面渲染完成,可使用onPageEnd事件监听 54 this.controller.createPdf( 55 this.pdfConfig, 56 (error, result: webview.PdfData) => { 57 try { 58 // 获取到的result通过`pdfArrayBuffer`接口取得PDF二进制数据流,最后使用`fileIo`方法将二进制数据流保存为PDF文件 59 let context = this.getUIContext().getHostContext() as common.UIAbilityContext; 60 let filePath = context.filesDir + "/test.pdf"; 61 let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE); 62 fs.write(file.fd, result.pdfArrayBuffer().buffer).then((writeLen: number) => { 63 console.info("createPDF write data to file succeed and size is:" + writeLen); 64 }).catch((err: BusinessError) => { 65 console.error("createPDF write data to file failed with error message: " + err.message + 66 ", error code: " + err.code); 67 }).finally(() => { 68 // 关闭file 69 fs.closeSync(file); 70 }); 71 } catch (resError) { 72 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 73 } 74 }); 75 }) 76 Web({ src: "www.example.com", controller: this.controller }) 77 } 78 } 79} 80``` 81 82## Promise方式保存PDF 83通过Promise方式调用`createPdf`接口,获取到的result通过`pdfArrayBuffer`接口取得PDF二进制数据流,最后使用`fileIo`方法将二进制数据流保存为PDF文件。 84```ts 85import { fileIo as fs } from '@kit.CoreFileKit'; 86import { webview } from '@kit.ArkWeb'; 87import { BusinessError } from '@kit.BasicServicesKit'; 88import { common } from '@kit.AbilityKit'; 89 90 91@Entry 92@Component 93struct Index { 94 controller: webview.WebviewController = new webview.WebviewController(); 95 pdfConfig: webview.PdfConfiguration = { 96 width: 8.27, 97 height: 11.69, 98 marginTop: 0, 99 marginBottom: 0, 100 marginRight: 0, 101 marginLeft: 0, 102 shouldPrintBackground: true 103 } 104 105 106 build() { 107 Column() { 108 Button('SavePDF') 109 .onClick(() => { 110 // 触发PDF生成,需要确保页面渲染完成,可使用onPageEnd事件监听 111 this.controller.createPdf(this.pdfConfig) 112 .then((result: webview.PdfData) => { 113 try { 114 // 获取到的result通过`pdfArrayBuffer`接口取得PDF二进制数据流,最后使用`fileIo`方法将二进制数据流保存为PDF文件 115 let context = this.getUIContext().getHostContext() as common.UIAbilityContext; 116 let filePath = context.filesDir + "/test.pdf"; 117 let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE); 118 fs.write(file.fd, result.pdfArrayBuffer().buffer).then((writeLen: number) => { 119 console.info("createPDF write data to file succeed and size is:" + writeLen); 120 }).catch((err: BusinessError) => { 121 console.error("createPDF write data to file failed with error message: " + err.message + 122 ", error code: " + err.code); 123 }).finally(() => { 124 // 关闭file 125 fs.closeSync(file); 126 }); 127 } catch (resError) { 128 console.error(`ErrorCode: ${(resError as BusinessError).code}, Message: ${(resError as BusinessError).message}`); 129 } 130 }) 131 }) 132 Web({ src: "www.example.com", controller: this.controller }) 133 } 134 } 135} 136```