Я находил решение для печати веб-страницы в локальный файл PDF с помощью Python. Одно из хороших решений - использовать Qt, который можно найти здесь, https://bharatikunal.wordpress.com/2010/01/ .
Вначале это не сработало, так как у меня возникла проблема с установкой PyQt4, потому что он выдавал сообщения об ошибках, такие как ' ImportError: No module named PyQt4.QtCore
' и ' ImportError: No module named PyQt4.QtCore
'.
Это произошло потому, что PyQt4 установлен неправильно. Раньше у меня были библиотеки, расположенные в C: \ Python27 \ Lib, но это не для PyQt4.
Фактически, его просто нужно загрузить с http://www.riverbankcomputing.com/software/pyqt/download (обратите внимание на правильную версию Python, которую вы используете) и установить в C: \ Python27 (в моем случае). Вот и все.
Теперь скрипты работают нормально, поэтому я хочу им поделиться. для получения дополнительных сведений об использовании Qprinter см. http://qt-project.org/doc/qt-4.8/qprinter.html#Orientation-enum .
apt-get install wkhtmltopdf
WeasyPrint
pip install weasyprint # No longer supports Python 2.x. python >>> import weasyprint >>> pdf = weasyprint.HTML('http://www.google.com').write_pdf() >>> len(pdf) 92059 >>> open('google.pdf', 'wb').write(pdf)
источник
'wb'
, а не'w'
потому, чтоpdf
этоbytes
объект.Благодаря сообщениям, приведенным ниже, я могу добавить адрес ссылки на веб-страницу, который будет напечатан и отображать время в созданном PDF-файле, независимо от того, сколько страниц в нем есть.
Добавить текст в существующий PDF с помощью Python
https://github.com/disflux/django-mtr/blob/master/pdfgen/doc_overlay.py
Чтобы поделиться сценарием, как показано ниже:
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.'
источник
html5lib
, который используется xhtml2pdf. Это решениевот тот, который работает нормально:
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_())
источник
Вот простое решение с использованием QT. Я нашел это как часть ответа на другой вопрос о StackOverFlow. Тестировал на винде.
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!"
источник
Я попробовал ответить @NorthCat, используя pdfkit.
Требуется установка wkhtmltopdf. Установку можно скачать отсюда. https://wkhtmltopdf.org/downloads.html
Установите исполняемый файл. Затем напишите строку, чтобы указать, где находится wkhtmltopdf, как показано ниже. (ссылка на документ Не удается создать PDF-файл с помощью Python. Ошибка PDFKIT: «Не найден исполняемый файл wkhtmltopdf:»
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)
источник
Это решение сработало для меня с использованием 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('/programming/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_())
источник
Если вы используете селен и хром, вам не нужно самостоятельно управлять файлами cookie, и вы можете сгенерировать страницу pdf из распечатки хрома в формате pdf. Вы можете направить этот проект на реализацию. https://github.com/maxvst/python-selenium-chrome-html-to-pdf-converter
измененная база> https://github.com/maxvst/python-selenium-chrome-html-to-pdf-converter/blob/master/sample/html_to_pdf_converter.py
import sys import json, base64 def send_devtools(driver, cmd, params={}): resource = "/session/%s/chromium/send_command_and_get_result" % driver.session_id url = driver.command_executor._url + resource body = json.dumps({'cmd': cmd, 'params': params}) response = driver.command_executor._request('POST', url, body) return response.get('value') def get_pdf_from_html(driver, url, print_options={}, output_file_path="example.pdf"): driver.get(url) calculated_print_options = { 'landscape': False, 'displayHeaderFooter': False, 'printBackground': True, 'preferCSSPageSize': True, } calculated_print_options.update(print_options) result = send_devtools(driver, "Page.printToPDF", calculated_print_options) data = base64.b64decode(result['data']) with open(output_file_path, "wb") as f: f.write(data) # example from selenium import webdriver from selenium.webdriver.chrome.options import Options url = "/programming/23359083/how-to-convert-webpage-into-pdf-by-using-python#" webdriver_options = Options() webdriver_options.add_argument("--no-sandbox") webdriver_options.add_argument('--headless') webdriver_options.add_argument('--disable-gpu') driver = webdriver.Chrome(chromedriver, options=webdriver_options) get_pdf_from_html(driver, url) driver.quit()
источник
default_url_fetcher
для обработки файлов cookie, но позже у меня возникла проблема при его установке в Ubuntu16. Затем я использую wkhtmltopdf, он поддерживает настройку cookie, но это вызвало многие OSERROR, такие как -15-11, при обработке какая-то страница.