有什么方法可以在Python中将字节图像添加到pdf中吗?

Nat*_*han 5 io matplotlib fpdf python-3.x pandas

我在 pandas 中生成了一些图并将其保存在 BytesIO 流中,然后我想将其添加到 pdf 页面,然后将 pdf 文件作为附件发送到电子邮件中:

import matplotlib.pyplot as plt
import io
from fpdf import FPDF

fig = plt.figure()
...
buf = io.BytesIO()
fig.savefig(buf, format='png')

pdf = FPDF()
pdf.add_page()
pdf.image(buf.getvalue(), type='PNG')
buf.close()
Run Code Online (Sandbox Code Playgroud)

但这不起作用,并报告以下错误:

Traceback (most recent call last):
  File "XXXX.py", line 166, in send_email
    pdf.image(buf.getvalue(), type='PNG')
  File "/usr/local/lib/python3.6/site-packages/fpdf/fpdf.py", line 150, in wrapper
    return fn(self, *args, **kwargs)
  File "/usr/local/lib/python3.6/site-packages/fpdf/fpdf.py", line 971, in image
    info=self._parsepng(name)
  File "/usr/local/lib/python3.6/site-packages/fpdf/fpdf.py", line 1769, in _parsepng
    if name.startswith("http://") or name.startswith("https://"):
TypeError: startswith first arg must be bytes or a tuple of bytes, not str
Run Code Online (Sandbox Code Playgroud)

我想纯粹在内存中解决这个问题,而不是在本地保存图像文件。谁能帮我这个?太感谢了。

Chr*_* K. 2

是的,您可以使用字节代替文件......

就我而言,我有一个 MSSQL 查询,其中包含二进制字符串形式的图像。我想直接使用它们,而不保存多个图像文件。所以我一直在寻找解决方案。

我们需要的:

pip install fpdf2
Run Code Online (Sandbox Code Playgroud)

然后将 IO 和 FPDF2 导入到 python 3.x 文件中:

import io
from fpdf import FPDF
Run Code Online (Sandbox Code Playgroud)

查看Github 上 fpdf2 存储库的image_parsing.py可以发现,fpdf2 也可以处理二进制对象。不需要真正的图像文件。

使用io 的 BytesIO,我们可以从字节字符串创建一个二进制对象。

我们将二进制对象命名为“图片”并将其作为图像放入 PDF 页面中。

import io
from fpdf import FPDF

# create bytes object of the image data
picture = io.BytesIO(b"some initial binary data: \x00\x01")

# set page to portrait A4 and positioning in mm
pdf = FPDF("P", "mm", "A4")

# create a page
pdf.add_page()

# insert image
# on position: x=10mm, y=10mm
# size: width=50mm hight=auto
pdf.image(picture,10,10,50)

# create PDF file
pdf.output("fpdf_test.pdf")
Run Code Online (Sandbox Code Playgroud)

我希望这对某些人有帮助。