Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Python将网页转换为PDF_Python_Html_Pdf_Qprinter - Fatal编程技术网

如何使用Python将网页转换为PDF

如何使用Python将网页转换为PDF,python,html,pdf,qprinter,Python,Html,Pdf,Qprinter,我正在寻找解决方案,使用Python将网页打印成本地文件PDF。一个很好的解决方案是使用Qt,可以在这里找到 它一开始不起作用,因为我在安装PyQt4时遇到问题,因为它给出了错误消息,例如“ImportError:没有名为PyQt4.QtCore的模块”,以及“ImportError:没有名为PyQt4.QtCore的模块” 这是因为PyQt4安装不正确。 我以前的库位于C:\Python27\Lib,但它不适用于PyQt4 事实上,它只需要从下载(记住您使用的是正确的Python版本),然后安

我正在寻找解决方案,使用Python将网页打印成本地文件PDF。一个很好的解决方案是使用Qt,可以在这里找到

它一开始不起作用,因为我在安装PyQt4时遇到问题,因为它给出了错误消息,例如“
ImportError:没有名为PyQt4.QtCore的模块
”,以及“
ImportError:没有名为PyQt4.QtCore的模块

这是因为PyQt4安装不正确。 我以前的库位于C:\Python27\Lib,但它不适用于PyQt4

事实上,它只需要从下载(记住您使用的是正确的Python版本),然后安装到C:\Python27(我的案例)。就这样


现在脚本运行良好,所以我想与大家分享。有关使用Qprinter的更多选项,请参阅。

以下是一个可用选项:

import sys 
from PyQt4.QtCore import *
from PyQt4.QtGui import * 
from PyQt4.QtWebKit import * 

app = QApplication(sys.argv)
web = QWebView()
web.load(QUrl("http://www.yahoo.com"))
printer = QPrinter()
printer.setPageSize(QPrinter.A4)
printer.setOutputFormat(QPrinter.PdfFormat)
printer.setOutputFileName("fileOK.pdf")

def convertIt():
    web.print_(printer)
    print("Pdf generated")
    QApplication.exit()

QObject.connect(web, SIGNAL("loadFinished(bool)"), convertIt)
sys.exit(app.exec_())

感谢下面的帖子,我能够在网页上添加要打印的链接地址,并在生成的PDF上显示时间,无论它有多少页

要按如下方式共享脚本:

import time
from pyPdf import PdfFileWriter, PdfFileReader
import StringIO
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
from xhtml2pdf import pisa
import sys 
from PyQt4.QtCore import *
from PyQt4.QtGui import * 
from PyQt4.QtWebKit import * 

url = 'http://www.yahoo.com'
tem_pdf = "c:\\tem_pdf.pdf"
final_file = "c:\\younameit.pdf"

app = QApplication(sys.argv)
web = QWebView()
#Read the URL given
web.load(QUrl(url))
printer = QPrinter()
#setting format
printer.setPageSize(QPrinter.A4)
printer.setOrientation(QPrinter.Landscape)
printer.setOutputFormat(QPrinter.PdfFormat)
#export file as c:\tem_pdf.pdf
printer.setOutputFileName(tem_pdf)

def convertIt():
    web.print_(printer)
    QApplication.exit()

QObject.connect(web, SIGNAL("loadFinished(bool)"), convertIt)

app.exec_()
sys.exit

# Below is to add on the weblink as text and present date&time on PDF generated

outputPDF = PdfFileWriter()
packet = StringIO.StringIO()
# create a new PDF with Reportlab
can = canvas.Canvas(packet, pagesize=letter)
can.setFont("Helvetica", 9)
# Writting the new line
oknow = time.strftime("%a, %d %b %Y %H:%M")
can.drawString(5, 2, url)
can.drawString(605, 2, oknow)
can.save()

#move to the beginning of the StringIO buffer
packet.seek(0)
new_pdf = PdfFileReader(packet)
# read your existing PDF
existing_pdf = PdfFileReader(file(tem_pdf, "rb"))
pages = existing_pdf.getNumPages()
output = PdfFileWriter()
# add the "watermark" (which is the new pdf) on the existing page
for x in range(0,pages):
    page = existing_pdf.getPage(x)
    page.mergePage(new_pdf.getPage(0))
    output.addPage(page)
# finally, write "output" to a real file
outputStream = file(final_file, "wb")
output.write(outputStream)
outputStream.close()

print final_file, 'is ready.'
您还可以使用:

用法 安装 MacOS:
brew安装Caskroom/cask/wkhtmltopdf

Debian/Ubuntu:
apt get安装wkhtmltopdf

Windows:
choco安装wkhtmltopdf


请参阅MacOS/Ubuntu/other OS的官方文档:

这里是一个使用QT的简单解决方案。我发现这是关于StackOverFlow的另一个问题的答案的一部分。我在Windows上测试了它

from PyQt4.QtGui import QTextDocument, QPrinter, QApplication

import sys
app = QApplication(sys.argv)

doc = QTextDocument()
location = "c://apython//Jim//html//notes.html"
html = open(location).read()
doc.setHtml(html)

printer = QPrinter()
printer.setOutputFileName("foo.pdf")
printer.setOutputFormat(QPrinter.PdfFormat)
printer.setPageSize(QPrinter.A4);
printer.setPageMargins (15,15,15,15,QPrinter.Millimeter);

doc.print_(printer)
print "done!"

根据回答:,建议使用。您还必须安装

如果您有本地
.html
文件,则需要使用以下命令:

pdfkit.from_file('test.html', 'out.pdf')
但是,如果尚未将wkhtmltopdf可执行文件添加到系统路径,则会引发错误。这是让我绊倒的部分,我想与大家分享

在Windows上,打开环境变量并将其添加到
系统变量
路径中,如下所示。在我的例子中,在我从exe安装wkhtmltopdf后,这些.code>exe
文件位于此处:

C:\ProgramFiles\wkhtmltopdf\bin


我用pdfkit尝试了@NorthCat答案

它需要安装wkhtmltopdf。可以从此处下载安装

安装可执行文件。然后写一行代码指出wkhtmltopdf的位置,如下所示。(参考自


如果您使用硒和铬,您不需要自己管理cookies,并且您可以从铬打印的pdf格式生成pdf页面。 你可以参考这个项目来实现它。

修改基数>

导入系统 导入json,base64 def send_devtools(驱动程序,cmd,参数={}): resource=“/session/%s/chromiu/send_command_和_get_result”%driver.session_id url=驱动程序、命令执行器、url+资源 body=json.dumps({'cmd':cmd,'params':params}) 响应=驱动程序、命令执行器、请求('POST',url,正文) 返回响应。get('value') def get_pdf_from_html(驱动程序、url、打印选项={},输出文件路径=“example.pdf”): 获取驱动程序(url) 计算的打印选项={ "风景":假,, “displayHeaderFooter”:False, “printBackground”:True, “PrefercSpageSize”:正确, } 计算的打印选项。更新(打印选项) 结果=发送工具(驱动程序,“Page.printToPDF”,计算的打印选项) data=base64.b64解码(结果['data']) 打开(输出文件路径,“wb”)作为f: f、 写入(数据) #范例 从selenium导入webdriver 从selenium.webdriver.chrome.options导入选项 url=”https://stackoverflow.com/questions/23359083/how-to-convert-webpage-into-pdf-by-using-python#" webdriver_options=options() webdriver\u选项。添加\u参数(“--no sandbox”) webdriver_选项。添加_参数('--headless') webdriver_选项。添加_参数('--disable gpu') driver=webdriver.Chrome(chromedriver,options=webdriver\u options) 从html(驱动程序、url)获取pdf driver.quit()
使用PyQt5 5.15.0版,此解决方案对我有效

import sys
from PyQt5 import QtWidgets, QtWebEngineWidgets
from PyQt5.QtCore import QUrl
from PyQt5.QtGui import QPageLayout, QPageSize
from PyQt5.QtWidgets import QApplication

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    loader = QtWebEngineWidgets.QWebEngineView()
    loader.setZoomFactor(1)
    layout = QPageLayout()
    layout.setPageSize(QPageSize(QPageSize.A4Extra))
    layout.setOrientation(QPageLayout.Portrait)
    loader.load(QUrl('https://stackoverflow.com/questions/23359083/how-to-convert-webpage-into-pdf-by-using-python'))
    loader.page().pdfPrintingFinished.connect(lambda *args: QApplication.exit())

    def emit_pdf(finished):
        loader.page().printToPdf("test.pdf", pageLayout=layout)

    loader.loadFinished.connect(emit_pdf)
    sys.exit(app.exec_())

感谢分享您的代码!对于本地pdf文件,您有什么建议吗?还是只需在“file://”前面加上前缀就可以了到url?我不太熟悉这些库。。。thanks@user2426679,你的意思是将在线PDF转换为本地PDF文件?谢谢你的回复…很抱歉我迟到了。我最终使用了wkhtmltopdf,因为它能够处理我扔给它的内容。但我问如何加载本地硬盘的PDF。Cheers@user2426679很抱歉我还是不明白你的意思。可能是因为我也是Python的新手。你的意思是阅读Python中的本地PDF文件?xhtml2pdf使用的
html5lib
存在一些问题。这个解决方案解决了这个问题:有趣的是,网页链接是以文本形式生成的,而不是生成的PDF中的链接。有人知道为什么会出现这种情况吗为我准备空白PDF?这太棒了,比摆弄reportlab或使用打印驱动器转换要容易得多。非常感谢。PDFKit需要运行的X服务器(或“虚拟”X服务器):(请参见此处:windows似乎不支持pdfkit。这是真的吗?完美!!即使下载嵌入的图像,也不用麻烦使用它!您必须
apt获得安装wkhtmltopdf
pdfkit依赖于非python包wkhtmltopdf,这反过来又需要运行X服务器。因此,尽管在某些环境中很好,但这不是一个答案这通常在python中起作用。我可以提供文件路径而不是url吗?我想我更喜欢这个项目,因为它的依赖项是python包而不是系统包。从2018年1月开始,它似乎有更频繁的更新和更好的文档。有太多的东西要安装。我在Libbango停下来,选择了pdfkit。对于系统范围的wkhtmltopdf,但weasyprint也需要一些系统范围的安装。我认为选项应该是
'wb'
,而不是
'w'
,因为
pdf
是一个
pdfkit.from_file('test.html', 'out.pdf')
import pdfkit


path_wkthmltopdf = "C:\\Folder\\where\\wkhtmltopdf.exe"
config = pdfkit.configuration(wkhtmltopdf = path_wkthmltopdf)

pdfkit.from_url("http://google.com", "out.pdf", configuration=config)
import sys
from PyQt5 import QtWidgets, QtWebEngineWidgets
from PyQt5.QtCore import QUrl
from PyQt5.QtGui import QPageLayout, QPageSize
from PyQt5.QtWidgets import QApplication

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    loader = QtWebEngineWidgets.QWebEngineView()
    loader.setZoomFactor(1)
    layout = QPageLayout()
    layout.setPageSize(QPageSize(QPageSize.A4Extra))
    layout.setOrientation(QPageLayout.Portrait)
    loader.load(QUrl('https://stackoverflow.com/questions/23359083/how-to-convert-webpage-into-pdf-by-using-python'))
    loader.page().pdfPrintingFinished.connect(lambda *args: QApplication.exit())

    def emit_pdf(finished):
        loader.page().printToPdf("test.pdf", pageLayout=layout)

    loader.loadFinished.connect(emit_pdf)
    sys.exit(app.exec_())