找回密码
 立即注册

QQ登录

只需一步,快速开始

Lenka.Guo 讲师达人认证 悬赏达人认证
超级版主   /  发表于:2021-3-1 15:25  /   查看:3124  /  回复:2
应用场景:
客户在创建前后端分离的应用时,前端只用于做一些基本的数据展示,如果涉及大量的数据或报表生成,建议放在服务器端展示,本文主要分享如何在服务器端使用ActiveReportsJS 实现报表导出PDF功能

Demo下载


运行Demo
  1. npm install
  2. node index.js
复制代码


环境准备:
node.js v14.15.0+Headless 无头浏览器

操作步骤:
1. 添加资源文件


2. 配置资源和文件
  1. const puppeteer = require('puppeteer');
  2. const fs = require('fs');
  3. var static = require('node-static');
  4. var http = require('http');

  5. var file = new(static.Server)(__dirname + '/resources');

  6. http.createServer(function (req, res) {
  7.   file.serve(req, res);
  8. }).listen(9999);

  9. const fonts = [
  10.     {
  11.         name: 'Montserrat',
  12.         source: 'Montserrat-Regular.ttf'
  13.     },
  14.     {
  15.         name: 'Montserrat',
  16.         source: 'Montserrat-Medium.ttf',
  17.         weight: 500
  18.     }
  19. ];
复制代码
3. 调用浏览器并初始化 调用ARJS 导出PDF文件
  1. (async () => {
  2.     const browser = await puppeteer.launch({headless: true});
  3.     const page = await browser.newPage();
  4.     await page.goto(`http://localhost:9999/host.html`);
  5.     //await page.goto(`${__dirname}/resources/host.html`);
  6.     const pdfString =await page.evaluate(({reportUrl, fonts}) =>        
  7.         new Promise(async (resolve, reject) => {
  8.             // await GC.ActiveReports.Core.FontStore.registerFonts(fonts);
  9.             const report = new GC.ActiveReports.Core.PageReport();
  10.             await report.load(reportUrl);
  11.             const doc = await report.run();
  12.             const result = await GC.ActiveReports.PdfExport.exportDocument(doc, {fonts: fonts, info: {author: 'GrapeCity'}});
  13.             const reader = new FileReader();
  14.             reader.readAsBinaryString(result.data);
  15.             reader.onload = () => resolve(reader.result);
  16.             reader.onerror = () => reject('Error occurred while reading binary string');
  17.         }), {reportUrl: 'SimpleTable.rdlx-json', fonts: fonts});

  18.     const pdfData = Buffer.from(pdfString, 'binary');
  19.     fs.writeFileSync(`${__dirname}/out115.pdf`, pdfData);
  20.     console.log('done');   
  21.     process.exit(0);
  22. })();
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

2 个回复

倒序浏览
zhlb
初级会员   /  发表于:2024-9-26 09:47:32
沙发
我的业务场景确实需要在服务器打开 arjs,这个帖子是 2021 年的,目前有没有最新的解决方案,或者说依然可以参考这个帖子
回复 使用道具 举报
Eden.SunWyn认证
超级版主   /  发表于:2024-9-26 10:51:33
板凳
zhlb 发表于 2024-9-26 09:47
我的业务场景确实需要在服务器打开 arjs,这个帖子是 2021 年的,目前有没有最新的解决方案,或者说依然可 ...

方案应该是通用的,不过能能不同版本的ARJS的写法有所变化,得根据具体的使用进行调整。

您可以先试试,有什么问题,咱们在具体解决。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部