将 DOCX 字节流转换为 PDF 字节流 Python

joh*_*oia 5 python pdf io docx bytestream

我目前有一个使用 python-docx 库生成 .docx 文档的程序。

完成 .docx 文件的构建后,我将其保存到字节流中,如下所示

file_stream = io.BytesIO()
document.save(file_stream)
file_stream.seek(0)
Run Code Online (Sandbox Code Playgroud)

现在,我需要将这个word文档转换成PDF。我查看了一些不同的转换库,例如 docx2pdf,甚至使用 comtypes 手动进行转换

import sys
import os
import comtypes.client

wdFormatPDF = 17

in_file = "Input_file_path.docx"
out_file = "output_file_path.pdf"

word = comtypes.client.CreateObject('Word.Application')
doc = word.Documents.Open(in_file)
doc.SaveAs(out_file, FileFormat=wdFormatPDF)
doc.Close()
word.Quit()
Run Code Online (Sandbox Code Playgroud)

问题是,我需要在内存中进行此转换,并且无法将 DOCX 或 PDF 物理保存到机器上。我见过的每个转换器都需要机器上物理文档的文件路径,但我没有。

有没有办法可以将 DOCX 文件流转换为仅在内存中的 PDF 流?

谢谢

Mat*_*vis 5

此方法有点复杂,但它完全在内存中工作,并且您可以选择添加自定义 CSS 来设置最终文档的样式。使用mammoth
将 DOCX 字节流转换为 HTML ,并使用pdfkit将生成的 HTML 转换为 PDF 。

这是一个例子

# create a dummy docx file
from docx import Document
document = Document()
document.add_paragraph('Lorem ipsum dolor sit amet.')

# create a bytestream
import io
file_stream = io.BytesIO()
document.save(file_stream)
file_stream.seek(0)

# convert the docx to html
import mammoth
result = mammoth.convert_to_html(file_stream)

# >>> result.value
# >>> '<p>Lorem ipsum dolor sit amet.</p>'

# convert html to pdf
import pdfkit
pdf = pdfkit.from_string(result.value)
Run Code Online (Sandbox Code Playgroud)

如果你想将流输出到文件中,只需这样做

with open('test.pdf','wb') as file:
    file.write(pdf)
Run Code Online (Sandbox Code Playgroud)