পাইথন ব্যবহার করে কীভাবে ওয়েবপৃষ্ঠাটিকে পিডিএফে রূপান্তর করতে হয়


97

পাইথন ব্যবহার করে আমি স্থানীয় ফাইলে পিডিএফ-তে ওয়েবপৃষ্ঠাগুলি মুদ্রণের সমাধান সন্ধান করছিলাম। এর সেরা সমাধানগুলির মধ্যে একটি হ'ল কিউটিটি ব্যবহার করা, এটি এখানে পাওয়া যায় https://bharatikunal.wordpress.com/2010/01/

পাইকিউটি 4 ইনস্টল করতে আমার সমস্যা হওয়ায় এটি শুরুতে কাজ করেনি কারণ এটি ' ImportError: No module named PyQt4.QtCore', এবং ' ImportError: No module named PyQt4.QtCore' এর মতো ত্রুটি বার্তা দিয়েছে ।

এটি ছিল কারণ পাইকিউটি 4 সঠিকভাবে ইনস্টল করা নেই। আমি লাইব্রেরিগুলিতে সি: \ পাইথন 27 \ লিব অবস্থিত তবে এটি পাইকিউটি 4 এর জন্য নয়।

প্রকৃতপক্ষে, এটি কেবলমাত্র http://www.riverbankcomputing.com/software/pyqt/download থেকে ডাউনলোড করতে হবে (আপনি যে সঠিক পাইথন সংস্করণটি ব্যবহার করছেন তা মনে রাখবেন) এবং এটি সি: \ পাইথন 27 (আমার ক্ষেত্রে) এ ইনস্টল করুন। এটাই.

এখন স্ক্রিপ্টগুলি দুর্দান্ত চলছে তাই আমি এটি ভাগ করতে চাই। কিউপ্রিন্টার ব্যবহারের আরও বিকল্পগুলির জন্য, দয়া করে http://qt-project.org/doc/qt-4.8/qprinter.html#Orientation-enum দেখুন

উত্তর:


159

আপনি পিডিএফকিট ব্যবহার করতে পারেন :

ব্যবহার

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

ইনস্টল করুন

ম্যাক অপারেটিং সিস্টেম: brew install Caskroom/cask/wkhtmltopdf

দেবিয়ান / উবুন্টু: apt-get install wkhtmltopdf

উইন্ডোজ: choco install wkhtmltopdf

ম্যাকস / উবুন্টু / অন্যান্য ওএসের জন্য অফিসিয়াল ডকুমেন্টেশন দেখুন: https://github.com/JazzCore/python-pdfkit/wiki/Installing-wkhtmltopdf


4
এটি দুর্দান্ত, প্রতিবেদনের সাথে ঘোরাঘুরি বা রূপান্তর করতে একটি মুদ্রণ ড্রাইভ ব্যবহার করার চেয়ে সহজ উপায়। অনেক ধন্যবাদ.
ডোলাররা

@ উত্তরথ্যাটিক্স আপনি পিডিএফকিট দিয়ে এইচটিএমএল টেবিলগুলিকে রূপান্তর সম্পর্কে আরও একটি উদাহরণ দিতে পারেন?
বাবেল

4
দেখে মনে হচ্ছে উইন্ডোজ পিডিএফকিট সমর্থন করে না। এটা কি সত্যি?
কেনে চিউ

4
পারফেক্ট !! এমনকি এম্বেড করা চিত্রগুলি ডাউনলোড করুন, এটি ব্যবহার করতে বিরক্ত করবেন না! আপনাকে করতে হবেapt-get install wkhtmltopdf
টিনমারিনো

4
পিডিএফকিট অ পাইথন প্যাকেজ wkhtmltopdf এর উপর নির্ভর করে, যার জন্য চলমান এক্স সার্ভারের প্রয়োজন হয়। সুতরাং কিছু পরিবেশে দুর্দান্ত থাকাকালীন, এটি একটি উত্তর নয় যা সাধারণত পাইথনে কাজ করে।
রাসমুস কাজ

47

দুর্বলতা

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)

4
আমি কি url এর পরিবর্তে ফাইলের পথ সরবরাহ করতে পারি?
পীযূষ এস ওয়ানারে

12
আমি মনে করি যে আমি এই প্রকল্পটিকে প্রাধান্য দেব কারণ এটির নির্ভরতাগুলি সিস্টেম প্যাকেজের চেয়ে অজগর প্যাকেজ are জানুয়ারী 2018 এর মতো আরও ঘন ঘন আপডেট এবং আরও ভাল ডকুমেন্টেশন রয়েছে বলে মনে হয়।
stv

4
ইনস্টল করার জন্য অনেকগুলি জিনিস রয়েছে। আমি লিবপ্যাঙ্গোতে থামলাম এবং পিডিএফকিটের জন্য গেলাম। সিস্টেম ওয়াইড wkhtmltopdf এর জন্য বাজে কিন্তু ওয়েসপ্রিন্টের জন্য কিছু সিস্টেম ওয়াইড ইনস্টলসের প্রয়োজন।
ভিজোফট

4
আমি বিশ্বাস করব বিকল্পটি হওয়া উচিত 'wb', না 'w', কারণ pdfএটি একটি bytesবস্তু।
আনাতোলি শেহেরবাকভ

4
আমার জন্য এটি কেবল প্রথম পৃষ্ঠাটি ডাউনলোড করে
বাকীগুলি

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

আপনার কোড ভাগ করে নেওয়ার জন্য ধন্যবাদ! স্থানীয় পিডিএফ ফাইলগুলির জন্য এই কাজটি করার জন্য কোনও পরামর্শ? বা ইউআরএল থেকে "ফাইল: ///" প্রিপেন্ড করার মতোই সহজ? আমি এই লাইব্রেরিগুলির সাথে খুব বেশি পরিচিত নই ... ধন্যবাদ
ব্যবহারকারী 2426679

@ ব্যবহারকারী 2426679, আপনি অনলাইন পিডিএফকে স্থানীয় পিডিএফ ফাইলগুলিতে রূপান্তর করতে চান?
কে

আপনার জবাবের জন্য ধন্যবাদ ... আমার ক্লান্তি জন্য দুঃখিত আমি ডাব্লুএইচটিএমলেটপডিএফ ব্যবহার করে শেষ করেছি যেহেতু এটি আমি যেটা ফেলে দিচ্ছিলাম তা হ্যান্ডেল করতে সক্ষম হয়েছিল। তবে আমি জিজ্ঞাসা করছিলাম যে কীভাবে পিডিএফ লোড করবেন যা আমার এইচডিডির স্থানীয়। চিয়ার্স
ব্যবহারকারী 2426679

@ ব্যবহারকারী 2426679 দুঃখিত আমি এখনও আপনাকে পাইনি। সম্ভবত আমি পাইথনেরও নবাগত because আপনি পাইথনের স্থানীয় পিডিএফ ফাইলগুলি পড়তে চেয়েছিলেন?
কে

এর সাথে কিছু সমস্যা ছিল html5lib, যা এক্সএইচটিএমএল 2 পিডিএফ ব্যবহার করে। এই সমাধানটি সমস্যার সমাধান করেছে: github.com/xhtml2pdf/xhtML2pdf/issues/318
ব্লেয়ারজ 23

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

মজার বিষয় হচ্ছে, ওয়েব পৃষ্ঠাগুলির লিঙ্কগুলি উত্পন্ন পিডিএফের লিঙ্কগুলির পরিবর্তে পাঠ্য হিসাবে উত্পন্ন হয়।
আমেরিকান

4
যে কেউ জানেন কেন এটি আমার জন্য ফাঁকা পিডিএফ তৈরি করবে?
বোসন

11

কিউটি ব্যবহার করে এখানে একটি সহজ সমাধান। আমি এটি স্ট্যাকওভারফ্লোতে একটি পৃথক প্রশ্নের উত্তরের অংশ হিসাবে পেয়েছি। আমি এটি উইন্ডোজে পরীক্ষা করেছি।

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

আমি পিডিএফকিট ব্যবহার করে @ উত্তরগেট উত্তরটি চেষ্টা করেছি

এটি ইনস্টল করার জন্য wkhtmltopdf প্রয়োজন। ইনস্টলটি এখান থেকে ডাউনলোড করা যায়। https://wkhtmltopdf.org/downloads.html

এক্সিকিউটেবল ফাইল ইনস্টল করুন। তারপরে নীচের মতো ডাব্লুএইচটিএমলেটপডিএফ কোথায় রয়েছে তা নির্দেশ করার জন্য একটি লাইন লিখুন। ( পাইথন ব্যবহার করে পিডিএফ তৈরি করতে পারছেন না পিডিএফকেআইটি ত্রুটি: "কোনও ডাব্লুএইচটিএমল্টপডিএফ কার্যকর করা যায় নি:"

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)

আমি .deb ক্লিক করে এবং সফ্টওয়্যার কেন্দ্রে ইনস্টল করার পরে কোথায় গেল?
ওয়েবনুব 13

2

এই সমাধানটি পাইকিউটি 5 সংস্করণ 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()

4
প্রথমত আমি ওয়েসপ্রিন্ট ব্যবহার করি তবে এটি কুকিজ সমর্থন করে না এমনকি আপনি default_url_fetcherকুকিগুলি পরিচালনা করতে নিজের লিখতে পারেন তবে পরে আমি উবুন্টু 16 এ ইনস্টল করার সময় সমস্যাটি উপস্থিত হয় hen তখন আমি wkhtmltopdf ব্যবহার করি এটি কুকি সেটিংটি সাপোর্ট করে তবে হ্যান্ডেল করার সময় এটি অনেক OSERROR এর কারণ হতে পারে -১১ -১১ কিছু পৃষ্ঠা
ইউয়ানমেং জিয়াও

মিঃ ইউয়ানমেং জিয়াও ভাগ করে নেওয়ার জন্য আপনাকে ধন্যবাদ।
মার্ক কে কে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.