Saya menemukan solusi untuk mencetak halaman web menjadi PDF file lokal, menggunakan Python. salah satu solusi yang baik adalah dengan menggunakan Qt, ditemukan di sini, https://bharatikunal.wordpress.com/2010/01/ .
Itu tidak berfungsi pada awalnya karena saya mengalami masalah dengan instalasi PyQt4 karena memberikan pesan kesalahan seperti ' ImportError: No module named PyQt4.QtCore
', dan ' ImportError: No module named PyQt4.QtCore
'.
Itu karena PyQt4 tidak diinstal dengan benar. Saya dulu memiliki perpustakaan yang terletak di C: \ Python27 \ Lib namun bukan untuk PyQt4.
Bahkan, itu hanya perlu mengunduh dari http://www.riverbankcomputing.com/software/pyqt/download (ingat versi Python yang benar yang Anda gunakan), dan instal ke C: \ Python27 (kasus saya). Itu dia.
Sekarang skripnya berjalan dengan baik jadi saya ingin membagikannya. untuk opsi lainnya dalam menggunakan Qprinter, silakan lihat 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)
sumber
'wb'
, bukan'w'
, karenapdf
itubytes
objek.terima kasih untuk posting di bawah ini, dan saya dapat menambahkan alamat tautan halaman web untuk dicetak dan sekarang pada PDF yang dihasilkan, tidak peduli berapa banyak halaman yang dimilikinya.
Tambahkan teks ke PDF yang Ada menggunakan Python
https://github.com/disflux/django-mtr/blob/master/pdfgen/doc_overlay.py
Untuk membagikan script seperti di bawah ini:
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.'
sumber
html5lib
, yang digunakan oleh xhtml2pdf. Solusi ini memperbaiki masalah: github.com/xhtml2pdf/xhtml2pdf/issues/318ini yang berfungsi dengan baik:
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_())
sumber
Berikut adalah solusi sederhana menggunakan QT. Saya menemukan ini sebagai bagian dari jawaban untuk pertanyaan berbeda di StackOverFlow. Saya mengujinya di 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!"
sumber
Saya mencoba jawaban @NorthCat menggunakan pdfkit.
Diperlukan wkhtmltopdf untuk diinstal. Penginstalan dapat diunduh dari sini. https://wkhtmltopdf.org/downloads.html
Instal file yang dapat dieksekusi. Kemudian tulis sebuah baris untuk menunjukkan dimana wkhtmltopdf, seperti di bawah ini. (direferensikan dari Tidak dapat membuat pdf menggunakan python PDFKIT Kesalahan: "Tidak ditemukan wkhtmltopdf yang dapat dieksekusi:"
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)
sumber
Solusi ini berfungsi untuk saya menggunakan PyQt5 versi 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_())
sumber
Jika Anda menggunakan selenium dan chromium, Anda tidak perlu mengelola cookie sendiri, dan Anda dapat membuat halaman pdf dari cetakan chromium sebagai pdf. Anda dapat merujuk proyek ini untuk merealisasikannya. https://github.com/maxvst/python-selenium-chrome-html-to-pdf-converter
dasar yang dimodifikasi> 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()
sumber
default_url_fetcher
untuk menangani cookie tetapi kemudian saya terjadi masalah ketika menginstalnya di Ubuntu16. Kemudian saya menggunakan wkhtmltopdf itu mendukung pengaturan cookie tetapi itu menyebabkan banyak OSERROR seperti -15 -11 saat menangani beberapa halaman.