पायथन का उपयोग करके वेबपेज को पीडीएफ में कैसे बदलें


95

मैं पायथन का उपयोग करके वेबपेज को स्थानीय फ़ाइल पीडीएफ में प्रिंट करने का हल ढूंढ रहा था। एक अच्छा समाधान 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 से डाउनलोड करने की जरूरत है (सही पायथन संस्करण का आप उपयोग कर रहे हैं), और इसे C: \ Python27 (मेरा मामला) पर इंस्टॉल करें। बस।

अब स्क्रिप्ट ठीक चलती हैं इसलिए मैं इसे साझा करना चाहता हूं। Qprinter का उपयोग करने में अधिक विकल्पों के लिए, कृपया http://qt-project.org/doc/qt-4.8/qprinter.html#Orientation-enum देखें ।

जवाबों:


157

आप pdfkit का उपयोग भी कर सकते हैं :

प्रयोग

import pdfkit
pdfkit.from_url('http://google.com', 'out.pdf')

इंस्टॉल

मैक ओ एस: brew install Caskroom/cask/wkhtmltopdf

Debian / Ubuntu: apt-get install wkhtmltopdf

खिड़कियाँ: choco install wkhtmltopdf

MacOS / Ubuntu / अन्य OS के लिए आधिकारिक दस्तावेज देखें: https://github.com/JazzCore/python-pdfkit/wiki/Installing-wkhtmltopdf


4
यह बढ़िया है, जिस तरह से रिपोर्टलैब के साथ खिलवाड़ करने या बदलने के लिए प्रिंट ड्राइव का उपयोग करने से आसान है। बहुत बहुत धन्यवाद।
डावलर्स

@NorthCat आप pdf टेबल को pdfkit में बदलने के बारे में एक और उदाहरण दे सकते हैं?
बैबेल

1
ऐसा लगता है कि विंडोज़ pdfkit का समर्थन नहीं करती है। क्या यह सच है?
केन च्यू

2
उत्तम !! यहां तक ​​कि एम्बेड की गई छवियों को डाउनलोड करें, इसका उपयोग न करें! आपको apt-get install wkhtmltopdf
टिनमारिनो

4
pdfkit गैर-अजगर पैकेज wkhtmltopdf पर निर्भर करता है, जिसके बदले में एक रनिंग एक्स सर्वर की आवश्यकता होती है। कुछ वातावरण में अच्छा है, तो यह एक उत्तर नहीं है जो आमतौर पर अजगर में काम करता है।
रासमस काज

47

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)

5
क्या मैं url के बजाय फ़ाइल पथ प्रदान कर सकता हूँ?
पीयूष एस। वानरे सिप

12
मुझे लगता है कि मैं इस परियोजना को पसंद करूंगा क्योंकि यह निर्भरता है कि सिस्टम पैकेज के बजाय अजगर पैकेज हैं। जनवरी 2018 तक ऐसा लगता है कि अधिक लगातार अपडेट और बेहतर प्रलेखन है।
stv

4
इंस्टॉल करने के लिए बहुत सी चीजें हैं। मैं libpango पर रुक गया और pdfkit के लिए चला गया। सिस्टम वाइड wttmltopdf के लिए गंदा, लेकिन वीसिप्रिंट को भी कुछ सिस्टम वाइड इंस्टाल की आवश्यकता होती है।
विस्फ़ोटक

1
मेरा मानना ​​है कि विकल्प होना चाहिए 'wb', नहीं 'w', क्योंकि pdfएक bytesवस्तु है।
अनातोली शेरेबाकोव

1
मेरे लिए यह केवल पहला पृष्ठ डाउनलोड करता है और बाकी को अनदेखा करता है
फैबियो

24

नीचे दिए गए पोस्ट के लिए धन्यवाद, और मैं वेबपेज लिंक पते पर मुद्रित करने और पीडीएफ जेनरेट किए गए समय पर जोड़ने में सक्षम हूं, चाहे इसके कितने भी पृष्ठ हों।

पायथन का उपयोग करके मौजूदा पीडीएफ में पाठ जोड़ें

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.'

अपना कोड साझा करने के लिए धन्यवाद! स्थानीय पीडीएफ फाइलों के लिए यह काम करने के लिए कोई सलाह? या यह यूआरएल के रूप में "फ़ाइल: ///" को तैयार करने के रूप में आसान है? मैं इन पुस्तकालयों से बहुत परिचित नहीं हूँ ... धन्यवाद
user2426679

@ user2426679, आपका मतलब है ऑनलाइन पीडीएफ को स्थानीय पीडीएफ फाइलों में बदलना?
मार्क के

आपके उत्तर के लिए धन्यवाद ... मेरी मर्यादा के लिए क्षमा करें। मैं wkhtmltopdf का उपयोग करके समाप्त हुआ क्योंकि यह जो मैं इसे फेंक रहा था उसे संभालने में सक्षम था। लेकिन मैं पूछ रहा था कि एक पीडीएफ को कैसे लोड किया जाए जो मेरे एचडीडी के लिए स्थानीय था। चीयर्स
user2426679

@ user2426679 क्षमा करें, मुझे अभी भी आप नहीं मिले। शायद इसलिए कि मैं अजगर के लिए भी नौसिखिया हूं। आपने पायथन में स्थानीय पीडीएफ फाइलों को पढ़ा है?
मार्क K

इसके साथ कुछ समस्याएँ थीं html5lib, जिनका उपयोग xhtml2pdf द्वारा किया जाता है। इस समाधान ने समस्या को निर्धारित किया: github.com/xhtml2pdf/xhtml2pdf/issues/318
Blairg23

14

यहाँ एक काम ठीक है:

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_())

दिलचस्प है, वेब पेज लिंक उत्पन्न पीडीएफ में लिंक के बजाय पाठ के रूप में उत्पन्न होते हैं।
नागर

1
किसी को पता है कि यह मेरे लिए खाली pdfs क्यों पैदा होगा?
बोसोन

11

यहाँ क्यूटी का उपयोग कर एक सरल समाधान है। मैंने इसे 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!"

4

मैंने pdfkit का उपयोग करके @NorthCat उत्तर देने का प्रयास किया।

इसे स्थापित करने के लिए wkhtmltopdf की आवश्यकता होती है। इंस्टॉल को यहां से डाउनलोड किया जा सकता है। https://wkhtmltopdf.org/downloads.html

निष्पादन योग्य फ़ाइल स्थापित करें। तब यह बताने के लिए एक पंक्ति लिखें कि नीचे wkhtmltopdf कहाँ है। ( अजगर से संदर्भित पीडीएफ नहीं बना सकते हैं पीडीएफ 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)

2

इस समाधान ने मेरे लिए 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_())

1

यदि आप सेलेनियम और क्रोमियम का उपयोग करते हैं, तो आपको स्वयं द्वारा कुकीज़ का प्रबंधन करने की आवश्यकता नहीं है, और आप क्रोमियम के प्रिंट से पीडीएफ पेज को पीडीएफ के रूप में उत्पन्न कर सकते हैं। इसे साकार करने के लिए आप इस परियोजना का उल्लेख कर सकते हैं। 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()

1
सबसे पहले मैं weasyprint का उपयोग करता हूं, लेकिन यह कुकीज़ का समर्थन नहीं करता है यहां तक ​​कि आप कुकीज़ default_url_fetcherको संभालने के लिए अपना खुद का लिख सकते हैं, लेकिन बाद में मैं इसे Ubuntu16 में स्थापित करता हूं। फिर मैं wkhtmltopdf का उपयोग करता हूं यह कुकी सेटिंग को सुपरपॉट करता है, लेकिन जब -15 -11 जैसे कई OSRROR का उपयोग किया कुछ पेज।
युआनमेंग जिओ

श्री @Yuanmeng जिओ साझा करने के लिए धन्यवाद।
मार्क के
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.