如何实现一个批量打印表单的脚本?

如何实现一个批量打印表单的脚本?

阅读 654
avatarAI BotBETA

答案:
使用Python的PDF处理库(如ReportLab或PyPDF2)结合系统打印命令实现。以下是通用实现步骤:

# 示例:使用ReportLab生成PDF并打印
from reportlab.pdfgen import canvas
import os

def generate_form(data, filename):
    c = canvas.Canvas(filename)
    c.drawString(100, 750, f"Name: {data['name']}")
    c.drawString(100, 730, f"Date: {data['date']}")
    c.save()

def batch_print_forms(data_list):
    for i, data in enumerate(data_list):
        filename = f"form_{i}.pdf"
        generate_form(data, filename)
        # Windows系统打印命令示例
        os.startfile(filename, "print")

# 测试数据
data = [
    {"name": "Alice", "date": "2023-10-01"},
    {"name": "Bob", "date": "2023-10-02"}
]

batch_print_forms(data)

关键点解释:

  1. 依赖库选择

    • ReportLab:适合动态生成PDF表单
    • PyPDF2/pdfrw:适合修改已有PDF模板
    • 安装:pip install reportlab pypdf2
  2. 打印控制

    • Windows:os.startfile(filepath, "print")
    • Linux:调用lpr命令,如os.system(f"lpr {filename}")
    • 跨平台方案:使用subprocess调用系统默认打印机
  3. 高级需求扩展

    • 模板引擎:用Jinja2生成HTML表单后转PDF(配合weasyprint)
    • 异步处理:对大量文件使用线程池(concurrent.futures
    • 错误处理:捕获打印机无响应异常

注意事项

  • 确保默认打印机已配置静默模式(无需用户确认)
  • 批量生成时建议添加延迟(避免打印机队列堵塞)
  • 敏感数据建议生成后自动删除临时文件
1 个回答
✓ 已被采纳

可以基于Nest.js + puppeteer实现,puppeteer是一个无头浏览器,通过puppeteer.launch打开一个无头浏览器,page.goto打开表单页面,通过page.screenshot进行截图

创建浏览器连接池

import { globalService } from './global.service';
const puppeteer = require('puppeteer');

export class creatBrowser {
  constructor() {
    const WSE_LIST = []; //存储browserWSEndpoint列表
    let browserWSEndpoint = null; //浏览器对象
    (async () => {
      for (let i = 0; i < globalService.MAX_WSE; i++) {
        const browser = await puppeteer.launch({
          headless: true,
          args: [
            '--disable-gpu',
            '--disable-dev-shm-usage',
            '--disable-setuid-sandbox',
            '--no-first-run',
            '--no-sandbox',
            '--no-zygote',
            '--single-process',
          ],
        });
        browserWSEndpoint = await browser.wsEndpoint();
        WSE_LIST[i] = browserWSEndpoint;
      }
      globalService.WSE_LIST = WSE_LIST;
      console.log('创建浏览器成功:' + WSE_LIST);
      console.log('端口号:' + globalService.ENV);
    })();
  }
}

global.service

export class globalService {
  static WSE_LIST: any; //存储browserWSEndpoint列表
  static MAX_WSE: number; //启动几个浏览器
  static ENV: any; //端口号
}

截图相关逻辑

// 随机取一个浏览器
const tmp = Math.floor(Math.random() * globalService.MAX_WSE);
const browserWSEndpoint = globalService.WSE_LIST[tmp];

//连接浏览器
const browser = await puppeteer.connect({ browserWSEndpoint });

// 打开浏览器页面tab
const page = await browser.newPage();

// 打开页面
await page.goto(tourl);

//等待页面元素加载完成
await page.waitForSelector(``);

// 开始截图
const base64Str = await page.screenshot({
  type: 'webp',
  quality: 80,
  encoding: 'base64',
  fullPage: true
});

// 关闭页面
await page.close();
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题