test_svg_background_image 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import os
  2. import io
  3. import tempfile
  4. import json
  5. from PyPDF2 import PdfFileWriter, PdfFileReader
  6. import svgwrite
  7. import cairosvg
  8. import xml.etree.ElementTree as ET
  9. from PIL import Image
  10. import zipfile
  11. class XML2SVG(svgwrite.container.SVG):
  12. def __init__(self, xml, insert=None, size=None, **extra):
  13. self.xml = xml
  14. super().__init__(**extra)
  15. def get_xml(self):
  16. xml = self.xml
  17. for attribute, value in sorted(self.attribs.items()):
  18. # filter 'None' values
  19. if value is not None:
  20. value = self.value_to_string(value)
  21. if value: # just add not empty attributes
  22. xml.set(attribute, value)
  23. for element in self.elements:
  24. xml.append(element.get_xml())
  25. return xml
  26. def image2byte(image):
  27. '''
  28. 图片转byte
  29. image: 必须是PIL格式
  30. image_bytes: 二进制
  31. '''
  32. # 创建一个字节流管道
  33. img_bytes = io.BytesIO()
  34. # 将图片数据存入字节流管道, format可以按照具体文件的格式填写
  35. image.save(img_bytes, format="PNG")
  36. # 从字节流管道中获取二进制
  37. image_bytes = img_bytes.getvalue()
  38. return image_bytes
  39. _zipfile = zipfile.ZipFile(os.getcwd(), 'w')
  40. svg_page = None
  41. unit = svgwrite.Unit("mm")
  42. pdf_writer = PdfFileWriter()
  43. report_fd, report_path = tempfile.mkstemp(suffix='.pdf')
  44. os.close(report_fd)
  45. image = Image.open("background_image.png")
  46. byte_data = image2byte(image)
  47. print(type(byte_data))
  48. svg_page = svgwrite.Drawing(size=(unit(297), unit(210)))
  49. image = svg_page.image("data:image/png;base64,{0}".format(str(byte_data)), (unit(5), unit(30)), (unit(95), unit(170)))
  50. svg_page.add(image)
  51. pdf_writer.addPage(PdfFileReader(io.BytesIO(cairosvg.svg2pdf(bytestring=svg_page.tostring()))).getPage(0))
  52. with open(report_path, 'ab') as out:
  53. pdf_writer.write(out)
  54. _zipfile.write(report_path, '%s - %s.pdf' % ('test_pdf', datetime.now().strftime("%Y-%m-%d")))