我正在编写一个 python 脚本,它从一些图像和 svg 文件中生成一个 html 文件,稍后应将其转换为 pdf 文件。 对于转换,我使用 weasyprint,但由于某种原因,它不渲染图像,仅渲染相应的替代文本。 这是在 Chrome 中渲染的 html 文件的屏幕截图:
但是生成的pdf看起来像这样:
这是生成 pdf 的代码:
html = HTML(filename="path/to/file")
html.write_pdf("path/to/output/file")
这是相应的 html 文件:
<img src="C:/Users/jonas/Documents/Dev/PythonLabel/bin/LABEL_SVG.svg" alt="SVG of Label" />
<div class="sn-number">3253343345</div>
<img class="qr-code" src="C:/Users/jonas/Documents/Dev/PythonLabel/bin/qrcode.png" alt="qrcode" />
我不知道是什么原因导致了这个问题,但 Firefox 也无法渲染图像,但 Chrome 和 Brave 可以做到。也许这两个问题都有相似的原因。
所以我设法让它工作,但这不是一个很好的解决方案。 我发现 weasyprint 能够从 stackoverflow 等实际网页获取图像和 SVG。所以我制作了一个小 Flask 应用程序,它只提供一个 html 文件,在创建 PDF 后,我只是停止了 Flask 服务器。
from flask import Flask
from multiprocessing import Process
app = Flask(
__name__, static_folder=path/to/static/folder)
@app.route("/")
def home():
with open(path/to/html, "r") as f:
html = "".join(f.readlines())
return html
def start_server():
app.run()
if __name__ == "__main__":
server = Process(target=start_server)
server.start()
sleep(4)
print("Generating PDF...")
html = HTML(
"http://localhost:5000").write_pdf(path/to/output/file)
server.terminate()
server.join()
我今天遇到了同样的问题。通过在图像路径前面添加“file://”协议使其正常工作。
<img src="file:///path/to/my_file.svg" />