Our Feeds

Friday 3 April 2015

AJITH KP

Save Web Pages as PDF

          Internet is vast repository of data. The data are stored in web are as webpages. But to access these data we need working internet connection. If you want access webpages offline, you need to store the webpage in local computer storage. The better way to store webpages is store webpages as PDF document. I would like to provide Python source code of application to save webpages as PDF. If you like the program please share with your friends. Your support is our fuel...

          The program is coded in Python and uses PyQt4 toolkit to create GUI. So you need to install PyQt4 to run the application(^).

          Project Homepage: https://github.com/ajithkp560/url2pdf




          Source Code

import sys
from os.path import expanduser
from PyQt4.QtCore import *
from PyQt4.QtGui import * 
from PyQt4.QtWebKit import * 
from urlparse import urlparse
import urllib2
print """
    [][][]
    [][][]   Coded By Ajith Kp [ajithkp560]
    [][][]   Visit: http://www.terminalcoders.blogspot.de
    [][][]
"""
url = ''
fName = ''
typeFormat = ['A0 (841 x 1189 mm)', 'A1 (594 x 841 mm)', 'A2 (420 x 594 mm)', 'A3 (297 x 420 mm)', 'A4 (210 x 297 mm, 8.26 x 11.69 inches)', 'A5 (148 x 210 mm)', 'A6 (105 x 148 mm)', 'A7 (74 x 105 mm)', 'A8 (52 x 74 mm)', 'A9 (37 x 52 mm)','B0 (1000 x 1414 mm)', 'B1 (707 x 1000 mm)', 'B2 (500 x 707 mm)', 'B3 (353 x 500 mm)', 'B4 (250 x 353 mm)', 'B5 (176 x 250 mm, 6.93 x 9.84 inches)', 'B6 (125 x 176 mm)', 'B7 (88 x 125 mm)', 'B8 (62 x 88 mm)', 'B9 (33 x 62 mm)', 'B10 (31 x 44 mm)', 'C5E (163 x 229 mm)', 'Comm10E (105 x 241 mm, U.S. Common 10 Envelope)', 'DLE (110 x 220 mm)', 'Executive (7.5 x 10 inches, 190.5 x 254 mm)', 'Folio (210 x 330 mm)', 'Ledger (431.8 x 279.4 mm)', 'Legal (8.5 x 14 inches, 215.9 x 355.6 mm)', 'Letter (8.5 x 11 inches, 215.9 x 279.4 mm)', 'Tabloid (279.4 x 431.8 mm)']
typeOrient = ['Portrait', 'Landscape']
typeFormatObject = [QPrinter.A0, QPrinter.A1, QPrinter.A2, QPrinter.A3, QPrinter.A4, QPrinter.A5, QPrinter.A6, QPrinter.A7, QPrinter.A8, QPrinter.A9, QPrinter.B0, QPrinter.B1, QPrinter.B2, QPrinter.B3, QPrinter.B4, QPrinter.B5, QPrinter.B6, QPrinter.B7, QPrinter.B8, QPrinter.B9, QPrinter.B10, QPrinter.C5E, QPrinter.Comm10E, QPrinter.DLE, QPrinter.Executive, QPrinter.Folio, QPrinter.Ledger, QPrinter.Legal, QPrinter.Letter, QPrinter.Tabloid]
OrientedFormatObject = [QPrinter.Portrait, QPrinter.Landscape]

class Window(QWidget):
    Tindex = 4
    Oindex = 0
    url = ''
    fName = ''
    printer = None
    web = None
    tObj = None
    oObj = None
    lbl = None
    home = None    
    def __init__(self):
        super(Window, self).__init__()
        self.initUI()     
    def initUI(self):     
        self.urlFld = QLineEdit('URL', self)
        self.urlFld.setGeometry(QRect(10, 10, 690, 31))
        self.urlFld.setFont(QFont('SansSerif', 10))
        self.urlFld.setToolTip('Enter URL of document')
        
        sBtn = QPushButton('Save as PDF', self)
        sBtn.setGeometry(QRect(10, 180, 690, 31))
        sBtn.clicked.connect(self.btnClicked)
        
        typeLbl = QLabel('Paper Size: ', self)      
        typeLbl.setGeometry(QRect(10, 50, 300, 31))
        typeLbl.setFont(QFont('SansSerif', 10, QFont.Bold))
        
        typeCbx = QComboBox(self)
        typeCbx.addItems(typeFormat)
        typeCbx.setGeometry(QRect(310, 50, 300, 31))
        typeCbx.setCurrentIndex(4)
        typeCbx.connect(typeCbx,SIGNAL("currentIndexChanged(int)"), self, SLOT("TindexChanged(int)"))
        
        oriLbl = QLabel('Qrientation: ', self)
        oriLbl.setGeometry(QRect(10, 100, 300, 31))
        oriLbl.setFont(QFont('SansSerif', 10, QFont.Bold))
        
        oriCbx = QComboBox(self)
        oriCbx.addItems(typeOrient)
        oriCbx.setGeometry(QRect(310, 100, 300, 31))
        oriCbx.connect(oriCbx, SIGNAL("currentIndexChanged(int)"), self, SLOT("OindexChanged(int)"))
        
        self.lbl = QLabel('Coded by Ajith Kp [ajithkp560]',self);
        self.lbl.setGeometry(QRect(10, 140, 600, 31))
        self.lbl.setFont(QFont('SansSerif', 10, QFont.Bold))
        col = QPalette()
        col.setColor(QPalette.Foreground,Qt.red)
        self.lbl.setPalette(col)
        
        self.setGeometry(100, 100, 710, 220)
        self.setFixedSize(710, 220)
        self.setWindowTitle('PDF Parser')    
        self.show()
    @pyqtSlot(int)
    def TindexChanged(self, index):
        self.lbl.setText('Type Changed: '+typeFormat[index])
        self.Tindex = index
    @pyqtSlot(int)
    def OindexChanged(self, index):
        self.lbl.setText('Type Changed: '+typeOrient[index])
        self.Oindex = index
        print self.Oindex
    def btnClicked(self):
        try:    
            url = str(self.urlFld.text())
            tObj = typeFormatObject[self.Tindex]
            oObj = OrientedFormatObject[self.Oindex]
            parse = urlparse(url)
            scheme = parse.scheme
            if scheme=='':
                scheme = 'http://'
                url = scheme+url
            print 'Scehme: ',scheme
            fName = parse.netloc+'_'+parse.path+'.pdf'
            fName = fName.replace('/', '_')

            ul = urllib2.urlopen(url)
            u = ul.geturl()
            url = u      
            print 'Target: ', url  
            self.lbl.setText('Target: '+url) 
        except Exception, e:
            print e.args
            m = QMessageBox()
            m.setText('error: '+e.message)
            m.exec_()   
            print e
        try:
            self.setVal(url, fName, tObj, oObj, self.lbl)  
            self.convert()
        except Exception, e:
            print e
            m = QMessageBox()
            m.setText('error: '+e.message)
            m.exec_()   
            
        #setTarget(url, fName, tObj, oObj, self.lbl)
    def closeEvent(self, event):        
        r = QMessageBox.question(self, 'Message', "Are you sure to quit?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
        if r == QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()   
            
    def setVal(self, url, fName, tObj, oObj, lbl):
        self.url = url
        self.fName = fName
        self.tObj = tObj
        self.oObj = oObj
        self.lbl = lbl
        self.home = expanduser("~")
        print 'Home directory: '+self.home
    
    def convert(self):
        #app = QApplication(sys.argv)
        self.web = QWebView()
        self.web.load(QUrl(self.url))
        self.printer = QPrinter(QPrinterInfo.defaultPrinter(),QPrinter.HighResolution)
        self.printer.setPageSize(self.tObj)
        self.printer.setFullPage(True)
        self.printer.setOutputFormat(QPrinter.PdfFormat)
        self.printer.setOrientation(self.oObj)
        self.printer.setOutputFileName(self.home+'/'+self.fName)
        self.web.loadFinished.connect(self.converter)
        self.web.loadProgress.connect(self.print_perc)
        print 'started...'
    def print_perc(self, perc):
        sys.stdout.write('\rPercentage: %d%%'%perc)
        sys.stdout.flush()        
        self.lbl.setText('Percentage: '+str(perc))
    def converter(self):
        self.web.print_(self.printer)
        msgBox = QMessageBox()
        msgBox.setText('Successfully generated file: <b>'+self.fName+'</b> in home directory')
        msgBox.exec_()        
        self.lbl.setText('Successfully generated file: <b>'+self.fName+'</b> in home directory')
        print '\n\nSuccessfully generated file: '+self.fName+' in home directory'    
def main():
    app = QApplication(sys.argv)
    w = Window()
    sys.exit(app.exec_())   
    main()
if __name__ == '__main__':
    main()