我尝试使用pdfkit将网页转换为PDF。当使用诸如google.com这样的URL时,这很好。但是当我试图转换NextJS中的网页构建时,PDF一直在加载,没有任何响应。
我以imbd.com为例,因为他们也在使用NextJS。
import pdfkit
try:
options = {
# 'page-size': 'A4',
'encoding': 'utf-8',
'margin-top': '0cm',
'margin-bottom': '0cm',
'margin-left': '0cm',
'margin-right': '0cm',
# 'image-quality': '1000',
# 'image-dpi': '2000',
'disable-smart-shrinking': '',
'page-width': '595px',
'page-height': '842px',
'no-outline': None,
'javascript-delay': '1000',
"load-error-handling": "ignore"
}
pdfkit.from_url(
'https://www.imdb.com/', 'out.pdf', options=options, verbose=True)
except Exception as e:
raise e我想要解决的是:
当运行上面的脚本时,什么都不会发生。而且在调试时也没有错误日志记录,我可以使用。
更新
在调试过程中,我试图直接与wkhtmltopdf交互,但仍然没有得到任何输出。
我的命令:
$ wkhtmltopdf --javascript-延迟5000 -调试-javascript http://imdb.com out.pdf
输出:装载机冻结在87%,没有输出可以帮助我找出出了什么问题。
Loading pages (1/6)
[====================================================> ] 87%发布于 2022-10-01 06:24:12
在您的options对象中,在‘javascript’下,尝试将阈值提高到5000。
发布于 2022-10-02 14:20:44
您没有使用正确的包,pdfkit有利于捕获服务器端呈现的站点。像React这样的NextJs不会在服务器和服务器上呈现呈现的HTML,但是它们呈现在客户端,因此永远等待呈现。为此,您可以尝试通过使用curl获取网站的HTML来查看不同之处,您将看到大量在客户端呈现的javascript。
为此,您需要一个使用无头铬的库(例如,我建议使用pyhtml2pdf )。你需要:
pip install pyhtml2pdf
#install also chrome or chromium if is not installed
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo apt -y install ./google-chrome-stable_current_amd64.deb在您使用下面的简单代码捕获网站之后:
from pyhtml2pdf import converter
converter.convert('https://www.imdb.com', 'sample.pdf')按预期工作,并呈现网站。
发布于 2022-10-03 00:03:45
您有两个主要的问题,一个是浏览器安全,另一个打印网页为PDF。
到目前为止,最简单的打印网站的方法是使用浏览器,这样引用就没有问题了。
Chrome --headless [Disable$*] --run-all-compositor-stages-before-draw --print-to-pdf-no-header --print-to-pdf="/folder/out.pdf" https://www.imdb.com

主要的问题是,它将是完美的/准确的,就像你点击打印一个网页到pdf,而不调整任何打印设置。因此,它应该是A4肖像,因此媒体框不应该是一个问题,但是设置边距更困难,特别是因为它不是设计为命令行驱动的,因此需要一个木偶师(或者更简单地用于基本用法,例如sendkey)。
如果您需要进行商业级别的调整,那么考虑一个商业的URL2PDF SDK/API解决方案,有几个设计用于使用
https://stackoverflow.com/questions/73909705
复制相似问题