egg 生成pdf 带样式和变量如何国际化

egg 自带国际化功能,是由 egg-i18n 插件提供。

需求
  1. 变量,如何传递到 i18n 中?
  2. 标签和样式,怎么传递到 i18n 中?
  3. pdf 如何生成
实现
  • 首先,新建一个 egg 测试环境
  • 然后,配置 i18n
  • 加入变量
  • 加入标签
  • 奥利给!

搭建环境

创建文件及文件夹
mkdir egg
cd egg
npm init
mkdir pdf
mkdir app
mkdir config

cd app
mkdir controller
mkdir public
mkdir view
touch router.js

cd view
touch template.html

cd ../controller
touch user.js

cd ../../config
mkdir locale
touch config.default.js
touch plugin.js

cd locale
touch zh.js
touch en.js
目录结构
├── pdf                        // 生成的pdf的存储位置
├── app
   ├── router.js              // 定义接口
   ├── public 
   ├── view  
      ├── template.html      // 模版
   ├── controller                 
      ├── user.js            // 导出pdf的逻辑                     
├── config                                
   ├── config.default.js      // 默认的配置
   ├── plugin.js              // 启用的插件            
   ├── locale                 
      ├── zh.js
      ├── en.js
├── package.json
安装依赖
npm install egg -S
npm install egg-bin -D
npm install egg-view-nunjucks -S  
npm install puppeteer -S
npm install node-pdftk
编辑启动命令

在 package.json 中加入 egg 启动命令

 "scripts": {
    "dev": "egg-bin dev",
  },
编辑代码

router.js

module.exports = app => {
  const { router, controller } = app;
  router.get('/test_transfer', controller.user.test_transfer);
};

config.default.js

exports.keys = '1234567890';
exports.i18n = {
  defaultLocale: 'zh',
};
exports.nunjucks = {
  autoescape: false   //设置不自动转译标签
};
exports.view = {
  defaultViewEngine: 'nunjucks',
  mapping: {
    '.html': 'nunjucks',
  }
}

plugin.js

exports.nunjucks = {
  enable: true,
  package: 'egg-view-nunjucks',
};

template.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>{{title}}</title>
</head>
<body>
  <header>
    {{header}}
  </header>
  <section>
    {{section}}
  </section>
</body>
</html>

user.js

const puppeteer = require('puppeteer');
const { promises: { readFile, writeFile } } = require('fs');
const pdftk = require('node-pdftk');
const Controller = require('egg').Controller;
class User extends Controller {
  async test_transfer() {
    const {ctx} = this
    const pdfString = await ctx.renderView(`../view/template.html`, {
      title:ctx.__('title'),
      header: ctx.__('header',{h:'我是变量'}),
      section: ctx.__('section'),
    })
    const template_path = `${process.cwd()}/app/public/test.html`
    await writeFile(template_path, pdfString, 'utf8')

    const browser = await puppeteer.launch({
      args: ['--disable-dev-shm-usage', '--no-sandbox']
    });
    const page = await browser.newPage();
    await page.goto('file://' + template_path);

    const footerTemplate = `<div 
        style="width:80%;margin:0 auto;font-size:8px;border-top:1px solid #ddd;padding:10px 0;display: flex; justify-content: space-between; ">
        <span style="">页脚</span>
        <div><span class="pageNumber">
        </span> / <span class="totalPages"></span></div>
        </div>`;
    const headerTemplate = `<div
        style="width:80%;margin:0 auto;font-size:8px;border-bottom:1px solid #ddd;padding:10px 0;display: flex; justify-content: space-between;">
        <span>页眉1</span>
        <span>页眉2</span>
        </div>`
    const options = {
      format: 'A4',
      printBackground: true,
      '-webkit-print-color-adjust': 'exact',
    }
    // 封面
    const page1 = await page.pdf({
      ...options,
      pageRanges: '1'
    })
    // 规避封面因为margin:0 导致的后面 margin 失效
    await page.addStyleTag({
      content: ".cover {display:none}"
    })

    // 后面所有的内容页
    const page2 = await page.pdf({
      ...options,
      displayHeaderFooter: true,
      headerTemplate,
      footerTemplate,
      margin: {
        top: 80,
        bottom: 80
      },
    })

    const pdfs = [page1, page2];
    const buf = await pdftk.input(pdfs).output()
    await writeFile(`${process.cwd()}/pdf/canvas.pdf`, buf)
    await browser.close(); 

    ctx.body = ctx.__('code')
  }
}
module.exports = User;

en.js

module.exports = {
  code: 'success',
  title: 'title',
  header: 'these are some test code,<strong style="font-size:50px">{h}</strong>',
  section: 'section'
};

zh.js

module.exports = {
  code: '成功',
  title: '标题',
  header: '这是一段测试完文字,<strong style="font-size:50px">{h}</strong>',
  section: '章节'
};
启动程序
npm run dev
访问接口

在浏览器中输入http://127.0.0.1:7001/test_transfer,如果看到success 或者成功就证明可以了,然后打开 pdf 下的 canvas.pdf 查看生成的 pdf 即可。

PS

如果对生成pdf的内容有疑问,请访问我的另一篇博客,有详细的讲述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Egg.js 中使用 MongoDB 来生成表的过程如下: 1. 首先,确保已经在你的项目中安装了 MongoDB 相关的依赖。可以使用 npm 或者 yarn 进行安装,如下所示: ``` npm install egg-mongoose --save ``` 2. 在 Egg.js 的配置文件 (`config/config.default.js` 或者 `config/config.prod.js`) 中进行相关配置。你需要添加以下内容: ```javascript // config/config.default.js exports.mongoose = { client: { url: 'mongodb://localhost:27017/your_database_name', options: {}, }, }; ``` 注意将 `'mongodb://localhost:27017/your_database_name'` 替换为你实际的 MongoDB 连接地址和数据库名称。 3. 创建 Model 文件,在 Egg.js 中,可以使用 Mongoose 来定义模型。在 `app/model` 目录下创建一个新的 JavaScript 文件,例如 `user.js`,并编写以下代码: ```javascript // app/model/user.js module.exports = app => { const mongoose = app.mongoose; const Schema = mongoose.Schema; const UserSchema = new Schema({ name: { type: String }, age: { type: Number }, email: { type: String }, }); return mongoose.model('User', UserSchema); }; ``` 4. 使用 Model 进行增删改查操作。在 Controller 中引入 Model,并使用相应的方法来操作数据库。例如,在 `app/controller/user.js` 文件中编写以下代码: ```javascript // app/controller/user.js const Controller = require('egg').Controller; class UserController extends Controller { async create() { const { ctx } = this; const { name, age, email } = ctx.request.body; const user = new ctx.model.User({ name, age, email, }); try { await user.save(); ctx.body = 'User created successfully'; } catch (error) { ctx.body = error; } } async find() { const { ctx } = this; try { const users = await ctx.model.User.find(); ctx.body = users; } catch (error) { ctx.body = error; } } // 其他操作方法类似 } module.exports = UserController; ``` 这样,你就可以在 Egg.js 中使用 MongoDB 来生成表,并进行相应的增删改查操作了。需要注意的是,上述代码仅为示例,你可能需要根据你的实际需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值