| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- 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")))
|