import os import tempfile import cv2 from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData, DateTime,TIMESTAMP from fpdf import FPDF import io import hashlib import requests import secrets from PIL import Image import matplotlib.pyplot as plt import matplotlib.image as mpimg import demo # from demo import perspective_transform def init_sqlserver(): # 创建连接引擎 engine = create_engine('postgresql://postgres:!1q2w3E*@8.134.85.73:5432/postgres') # 连接数据库 connection = engine.connect() print("Connection to PostgreSQL DB successful") # 声明表结构 metadata = MetaData() qrcode_data = Table('qrcode_data', metadata, Column('key', String), Column('circles', String), # createdate 时间类型 Column('createdate', TIMESTAMP) ) return qrcode_data def get_images(key, secret, api, count=1): images = [] urls = [] for i in range(count): random_number = ''.join([str(secrets.randbelow(9) + 1) for _ in range(16)]) parm = f"api_key={key}&cliD={random_number}&cliT=D1&return_file={secret}" params = { "api_key": key, "cliT": "D2", "cliD": random_number, "return_file": "" } # 排序 sorted_params = sorted(params.items()) concatenated_params = '&'.join(f"{key}={value}" for key, value in sorted_params) data = concatenated_params + secret hash_object = hashlib.md5(data.encode()) md5_hash = hash_object.hexdigest() url = f"{api}?api_key={key}&cliT=D2&cliD={random_number}&sign={md5_hash}&return_file=" urls.append(url) for url in urls: response = requests.get(url) images.append(response.content) return images def ndarray_to_binary(image_array): # 将numpy数组转换为PIL图像对象 img = Image.fromarray(image_array) # 创建一个字节流对象 byte_arr = io.BytesIO() # 将图像保存到字节流中,格式可以自选,如PNG img.save(byte_arr, format='PNG') # 获取二进制数据 binary_data = byte_arr.getvalue() return binary_data def create_pdf(images, fileName): # 创建 PDF 类实例 pdf = FPDF('P', 'mm', 'A4') # 添加一页 pdf.add_page() # 设置图片的尺寸 image_width = 15 # 图片宽度 30 mm image_height = 15 # 图片高度 30 mm margin = 20 # 页边距 10 mm images_per_row = 5 # 当前行的开始位置 x_offset = margin y_offset = margin # 自定义临时文件路径 custom_temp_dir = './temp' os.makedirs(custom_temp_dir, exist_ok=True) # 循环处理图片二进制数据 for i, binary_image in enumerate(images): if i % images_per_row == 0 and i != 0: # 开始新的一行 x_offset = margin y_offset += image_height + margin # # 将binary_image保存为本地文件 # with open(f"{i}.png", "wb") as f: # f.write(binary_image) # 创建一个临时文件来保存图像 with tempfile.NamedTemporaryFile(delete=False, suffix=".TIFF", dir=custom_temp_dir) as tmpfile: tmpfile.write(binary_image) tmp_filename = tmpfile.name print(tmp_filename) if os.access(tmp_filename, os.R_OK): print("File is readable.") else: print("File is not readable.") img_path = demo.exec_image_result(tmp_filename) # 将img_path返回来 tiff 格式转换 png 格式 img = Image.open(img_path) png_path = img_path.replace('.tiff', '.png') img.save(png_path, format='PNG') # 添加图片 pdf.image(png_path, x=x_offset, y=y_offset, w=image_width, h=image_height) # 更新x坐标 x_offset += image_width + margin # 删除文件 os.remove(tmp_filename) # 输出 PDF pdf.output(fileName) key = "CL8ca5c629b676d724" secret = "7a92463b491be3d0aa9704a8980e46ad" api = "https://open-api.cli.im/cli-open-platform-service/v1/labelStyle/createWithKey" # 初始化数据库 # qrcode_entity = init_sqlserver() images = get_images(key, secret, api, count=1) create_pdf(images, "qr_v2.pdf") # for i in range(10): # # 生成16位随机数字 # random_number = ''.join([str(secrets.randbelow(10)) for _ in range(16)]) # # 将随机数字每两位分为一组 # # groups = [random_number[i:i + 2] for i in range(0, len(random_number), 2)] # # print(groups)