3

Im trying to convert html documents into pdf file using pisa and python. It works fine for small html code. But when you pass google.com's html data through it , or in fact any big html file , it troughs this error.

here is the code that converts the html to pdf:

import ho.pisa as pisa
import sys
import os
ls =[]
for arg in sys.argv:
    ls.append(arg)
pisa.showLogging()
print ls

html_file = open(ls[1])
HTML = html_file.read()
filename = os.path.basename(str(ls[1]))
print filename
str(os.getcwd()+filename)
pdfFile =open(str(os.getcwd()+filename), "wb")
pdf = pisa.CreatePDF(HTML,pdfFile)

if not pdf.err:
    print "ds"
    pisa.startViewer(filename)

pdfFile.close()
html_file.close()

and this the error that is thrown :

ERROR [ho.pisa] C:\Python27\lib\site-packages\sx\pisa3\pisa_document.py line 223: Document error

Traceback (most recent call last):
  File "C:\Python27\lib\site-packages\sx\pisa3\pisa_document.py", line 128, in pisaDocument
    c = pisaStory(src, path, link_callback, debug, default_css, xhtml, encoding,
 c=c, xml_output=xml_output)
  File "C:\Python27\lib\site-packages\sx\pisa3\pisa_document.py", line 73, in pisaStory
    pisaParser(src, c, default_css, xhtml, encoding, xml_output)
  File "C:\Python27\lib\site-packages\sx\pisa3\pisa_parser.py", line 626, in pisaParser
    c.parseCSS()
  File "C:\Python27\lib\site-packages\sx\pisa3\pisa_context.py", line 545, in parseCSS
    self.css = self.cssParser.parse(self.cssText)
  File "C:\Python27\lib\site-packages\sx\w3c\cssParser.py", line 358, in parse
    src, stylesheet = self._parseStylesheet(src)
  File "C:\Python27\lib\site-packages\sx\w3c\cssParser.py", line 453, in _parseStylesheet
    src, atResults = self._parseAtKeyword(src)
  File "C:\Python27\lib\site-packages\sx\w3c\cssParser.py", line 577, in _parseAtKeyword
    src, result = self._parseAtIdent(src)
  File "C:\Python27\lib\site-packages\sx\w3c\cssParser.py", line 722, in _parseAtIdent
    src, stylesheet = self._parseStylesheet(src)
  File "C:\Python27\lib\site-packages\sx\w3c\cssParser.py", line 458, in _parseStylesheet
    src, ruleset = self._parseRuleset(src)
  File "C:\Python27\lib\site-packages\sx\w3c\cssParser.py", line 737, in _parseRuleset
    src, properties = self._parseDeclarationGroup(src.lstrip())
  File "C:\Python27\lib\site-packages\sx\w3c\cssParser.py", line 922, in _parseDeclarationGroup
    raise self.ParseError('Declaration group closing \'}\' not found', src, ctxsrc)
CSSParseError: Declaration group closing '}' not found:: (u'{', u'0%{opacity:0}50%{opa')
Traceback (most recent call last):
  File "trypdf.py", line 16, in <module>
    pdf = pisa.CreatePDF(HTML,pdfFile)
  File "C:\Python27\lib\site-packages\sx\pisa3\pisa_document.py", line 128, in pisaDocument
    c = pisaStory(src, path, link_callback, debug, default_css, xhtml, encoding,
 c=c, xml_output=xml_output)
  File "C:\Python27\lib\site-packages\sx\pisa3\pisa_document.py", line 73, in pisaStory
pisaParser(src, c, default_css, xhtml, encoding, xml_output)
  File "C:\Python27\lib\site-packages\sx\pisa3\pisa_parser.py", line 626, in pisaParser
    c.parseCSS()
  File "C:\Python27\lib\site-packages\sx\pisa3\pisa_context.py", line 545, in parseCSS
self.css = self.cssParser.parse(self.cssText)
  File "C:\Python27\lib\site-packages\sx\w3c\cssParser.py", line 358, in parse
src, stylesheet = self._parseStylesheet(src)
  File "C:\Python27\lib\site-packages\sx\w3c\cssParser.py", line 453, in _parseStylesheet
    src, atResults = self._parseAtKeyword(src)
  File "C:\Python27\lib\site-packages\sx\w3c\cssParser.py", line 577, in _parseAtKeyword
    src, result = self._parseAtIdent(src)
  File "C:\Python27\lib\site-packages\sx\w3c\cssParser.py", line 722, in _parseAtIdent
    src, stylesheet = self._parseStylesheet(src)
  File "C:\Python27\lib\site-packages\sx\w3c\cssParser.py", line 458, in _parseStylesheet
    src, ruleset = self._parseRuleset(src)
  File "C:\Python27\lib\site-packages\sx\w3c\cssParser.py", line 737, in _parseRuleset
    src, properties = self._parseDeclarationGroup(src.lstrip())
  File "C:\Python27\lib\site-packages\sx\w3c\cssParser.py", line 922, in _parseDeclarationGroup
    raise self.ParseError('Declaration group closing \'}\' not found', src, ctxsrc)
sx.w3c.cssParser.CSSParseError: Declaration group closing '}' not found:: (u'{', u'0%{opacity:0}50%{opa')

1 Answer 1

2

xhmlt2pdf is not going to work with all the websites. Instead, you can use pdfkit:

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

Edit: I've found another solution with PyQt (from here, thanks to Mark K):

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_())
Sign up to request clarification or add additional context in comments.

4 Comments

Does it convert HTML and CSS ?
@thecreator232 Yes, it converts.
pdfkit is awesome but be aware you might need to sudo apt-get install -y wkhtmltopdf if running in a Github action, etc.. came here after fighting xhtml2pdf and its attempts to parse minified CSS... someone who loves CSS a lot more than me should probably updated the w3c parser to match latest spec (e.g xhtml2pdf.w3c.cssParser.CSSParseError: Selector Pseudo Function closing ')' not found coming from minified bootstrap, etc)
For anyone interested in the sherlock holmesing here github.com/xhtml2pdf/xhtml2pdf/issues/363.. they say its fixed but I feel like theres more to actually do around adding support for not

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.