import os import io import tempfile import json from PyPDF2 import PdfFileWriter, PdfFileReader import svgwrite import cairosvg import xml.etree.ElementTree as ET from PIL import Image import zipfile class XML2SVG(svgwrite.container.SVG): def __init__(self, xml, insert=None, size=None, **extra): self.xml = xml super().__init__(**extra) def get_xml(self): xml = self.xml for attribute, value in sorted(self.attribs.items()): # filter 'None' values if value is not None: value = self.value_to_string(value) if value: # just add not empty attributes xml.set(attribute, value) for element in self.elements: xml.append(element.get_xml()) return xml def image2byte(image): ''' 图片转byte image: 必须是PIL格式 image_bytes: 二进制 ''' # 创建一个字节流管道 img_bytes = io.BytesIO() # 将图片数据存入字节流管道, format可以按照具体文件的格式填写 image.save(img_bytes, format="PNG") # 从字节流管道中获取二进制 image_bytes = img_bytes.getvalue() return image_bytes _zipfile = zipfile.ZipFile(os.getcwd(), 'w') svg_page = None unit = svgwrite.Unit("mm") pdf_writer = PdfFileWriter() report_fd, report_path = tempfile.mkstemp(suffix='.pdf') os.close(report_fd) image = Image.open("background_image.png") byte_data = image2byte(image) print(type(byte_data)) svg_page = svgwrite.Drawing(size=(unit(297), unit(210))) image = svg_page.image("data:image/png;base64,{0}".format(str(byte_data)), (unit(5), unit(30)), (unit(95), unit(170))) svg_page.add(image) pdf_writer.addPage(PdfFileReader(io.BytesIO(cairosvg.svg2pdf(bytestring=svg_page.tostring()))).getPage(0)) with open(report_path, 'ab') as out: pdf_writer.write(out) _zipfile.write(report_path, '%s - %s.pdf' % ('test_pdf', datetime.now().strftime("%Y-%m-%d")))