增加向pdf中添加二维码的功能

This commit is contained in:
胡尧
2025-04-15 16:57:32 +08:00
parent 085e6359ce
commit 6ff8395916
2 changed files with 128 additions and 68 deletions

View File

@@ -3,12 +3,9 @@ import logging
import os
import json
import base64
from qrcode.main import QRCode
import PyPDF2
from odoo import http, fields, models
from odoo.http import request
from odoo.addons.sf_base.controllers.controllers import MultiInheritController
import qrcode
@@ -96,13 +93,12 @@ class Sf_Mrs_Connect(http.Controller, MultiInheritController):
if file_extension.lower() == '.pdf':
panel_file_path = os.path.join(program_path_tmp_panel, file)
logging.info('panel_file_path:%s' % panel_file_path)
request.env['printing.utils'].add_qr_code_to_pdf(panel_file_path, model_id, "扫码获取工单")
cnc_workorder.write({'cnc_worksheet': base64.b64encode(open(panel_file_path, 'rb').read())})
pre_workorder = productions.workorder_ids.filtered(
lambda ap: ap.routing_type in ['装夹预调', '人工线下加工'] and ap.state not in ['done', 'rework'
'cancel'] and ap.processing_panel == panel)
if pre_workorder:
self._add_qr_code_to_pdf(panel_file_path, model_id)
pre_workorder.write(
{'processing_drawing': base64.b64encode(open(panel_file_path, 'rb').read())})
productions.write({'programming_state': '已编程', 'work_state': '已编程'})
@@ -279,66 +275,4 @@ class Sf_Mrs_Connect(http.Controller, MultiInheritController):
return json.JSONEncoder().encode(res)
def _add_qr_code_to_pdf(self, panel_file_path, model_id):
if not os.path.exists(panel_file_path):
logging.warning(f'文件不存在: {panel_file_path}')
return False
# 生成二维码
qr = qrcode.QRCode(version=1, box_size=10, border=5)
qr.add_data(str(model_id))
qr.make(fit=True)
qr_img = qr.make_image(fill_color="black", back_color="white")
# 保存二维码为临时文件
qr_temp_path = '/tmp/qr_temp.png'
qr_img.save(qr_temp_path)
# 创建一个临时PDF文件路径
output_temp_path = '/tmp/output_temp.pdf'
# 使用reportlab创建一个新的PDF
from reportlab.pdfgen import canvas
from reportlab.lib.units import inch
from PyPDF2 import PdfFileReader, PdfFileWriter
# 读取原始PDF
existing_pdf = PdfFileReader(open(panel_file_path, "rb"))
output = PdfFileWriter()
# 处理第一页
page = existing_pdf.getPage(0)
# 获取页面尺寸
page_width = float(page.mediaBox.getWidth())
page_height = float(page.mediaBox.getHeight())
# 创建一个新的PDF页面用于放置二维码
c = canvas.Canvas(output_temp_path, pagesize=(page_width, page_height))
# 在右下角绘制二维码,预留边距
qr_size = 1 * inch # 二维码大小为1英寸
margin = 0.4 * inch # 边距为0.4英寸
c.drawImage(qr_temp_path, page_width - qr_size - margin, margin, width=qr_size, height=qr_size)
c.save()
# 读取带有二维码的临时PDF
qr_pdf = PdfFileReader(open(output_temp_path, "rb"))
qr_page = qr_pdf.getPage(0)
# 合并原始页面和二维码页面
page.mergePage(qr_page)
output.addPage(page)
# 添加剩余的页面
for i in range(1, existing_pdf.getNumPages()):
output.addPage(existing_pdf.getPage(i))
# 保存最终的PDF
with open(panel_file_path, "wb") as output_file:
output.write(output_file)
# 清理临时文件
qr_pdf.close()
os.remove(qr_temp_path)
os.remove(output_temp_path)
return True