Advertisement
Guest User

Untitled

a guest
Jan 20th, 2018
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 13.40 KB | None | 0 0
  1. import os
  2. import time
  3. from watchdog.observers import Observer
  4. from watchdog.events import PatternMatchingEventHandler
  5. from reportlab.pdfgen.canvas import Canvas
  6. from reportlab.lib import units
  7. import reportlab.lib.pagesizes
  8. import sys
  9.  
  10. class Margins(object):
  11.     def __init__(self, right, left, top, bottom):
  12.         self._right = right
  13.         self._left = left
  14.         self._top = top
  15.         self._bottom = bottom
  16.  
  17.     @property
  18.     def right(self):
  19.         return self._right * units.cm
  20.  
  21.     @property
  22.     def left(self):
  23.         return self._left * units.cm
  24.  
  25.     @property
  26.     def top(self):
  27.         return self._top * units.cm
  28.  
  29.     @property
  30.     def bottom(self):
  31.         return self._bottom * units.cm
  32.  
  33.     def adjustLeft(self, width):
  34.         self._left -= width / units.cm
  35.  
  36.  
  37. class PDFCreator(object):
  38.  
  39.     appName = "txt2pdf (version 1.0)"
  40.  
  41.     def __init__(self, margins, num_lines, output_filename, tmp_filename):
  42.         print 'Start of pdf creation...\n'
  43.         num_lines
  44.         page_width = 210.24
  45.         page_height = 419.52771
  46.         output = 'C:\\Users\\user\\Desktop\\Projects\\Micros PDF Retreiver Project\\test-journal\\PDF\\' + output_filename
  47.         file = 'C:\\Users\\user\\Desktop\\Projects\\Micros PDF Retreiver Project\\test-journal\\PDF\\' + tmp_filename
  48.         print output + '\n'
  49.         print file + '\n'
  50.         one_line_pt = 9.64
  51.  
  52.         if num_lines > 39:
  53.             extra_lines = num_lines - 39
  54.             page_height = page_height + (one_line_pt * extra_lines)
  55.         elif num_lines < 39:
  56.             extra_lines = 39 - num_lines
  57.             page_height = page_height - (one_line_pt * extra_lines)
  58.         else:
  59.             page_height = 419.52771
  60.         print 'Setting up dimentions...\n'
  61.         pageWidth, pageHeight = reportlab.lib.pagesizes.__dict__['A4']
  62.         self.author = 'name'
  63.         self.title = 'Receipt'
  64.         self.canvas = Canvas(output, pagesize=(page_width, page_height))
  65.         self.canvas.setCreator(self.appName)
  66.         self.fontSize = 8.0
  67.         self.font = 'Courier'
  68.         self.kerning = 0.0
  69.         self.margins = margins
  70.         extra_vertical_space = 0.0
  71.         self.leading = (extra_vertical_space + 1.2) * self.fontSize
  72.         self.linesPerPage = int(
  73.             (self.leading + pageHeight
  74.              - margins.top - margins.bottom - self.fontSize) / self.leading)
  75.         self.lppLen = len(str(self.linesPerPage))
  76.         fontWidth = self.canvas.stringWidth(
  77.             ".", fontName=self.font, fontSize=self.fontSize)
  78.         self.lineNumbering = False
  79.         if self.lineNumbering:
  80.             margins.adjustLeft(fontWidth * (self.lppLen + 2))
  81.         contentWidth = pageWidth - margins.left - margins.right
  82.         self.charsPerLine = int(
  83.             (contentWidth + self.kerning) / (fontWidth + self.kerning))
  84.         self.top = pageHeight - margins.top - self.fontSize
  85.         self.filename = file
  86.         self.verbose = True
  87.         self.breakOnBlanks = False
  88.         self.encoding = 'utf8'
  89.         self.pageNumbering = False
  90.         if self.pageNumbering:
  91.             self.pageNumberPlacement = \
  92.                 (pageWidth / 2, margins.bottom / 2)
  93.  
  94.     def _process(self, data):
  95.         flen = os.fstat(data.fileno()).st_size
  96.         lineno = 0
  97.         read = 0
  98.         for line in data:
  99.             lineno += 1
  100.             if sys.version_info.major == 2:
  101.                 read += len(line)
  102.                 yield flen == \
  103.                       read, lineno, line.decode(self.encoding).rstrip('\r\n')
  104.             else:
  105.                 read += len(line.encode(self.encoding))
  106.                 yield flen == read, lineno, line.rstrip('\r\n')
  107.  
  108.     def _readDocument(self):
  109.         with open(self.filename, 'r') as data:
  110.             for done, lineno, line in self._process(data):
  111.                 if len(line) > self.charsPerLine:
  112.                     while len(line) > self.charsPerLine:
  113.                         yield done, line[:self.charsPerLine]
  114.                         line = line[self.charsPerLine:]
  115.                 yield done, line
  116.  
  117.     def _newpage(self):
  118.         textobject = self.canvas.beginText()
  119.         textobject.setFont(self.font, self.fontSize, leading=self.leading)
  120.         textobject.setTextOrigin(self.margins.left, self.top)
  121.         textobject.setCharSpace(self.kerning)
  122.         if self.pageNumbering:
  123.             self.canvas.drawString(
  124.                 self.pageNumberPlacement[0],
  125.                 self.pageNumberPlacement[1],
  126.                 str(self.canvas.getPageNumber()))
  127.         return textobject
  128.  
  129.     def _scribble(self, text):
  130.         if self.verbose:
  131.             sys.stderr.write(text + os.linesep)
  132.  
  133.     def generate(self):
  134.         print 'Inside the generating function...\n'
  135.         if self.breakOnBlanks:
  136.             pageno = self._generateBob(self._readDocument())
  137.         else:
  138.             pageno = self._generatePlain(self._readDocument())
  139.  
  140.     def _generatePlain(self, data):
  141.         pageno = 1
  142.         lineno = 0
  143.         page = self._newpage()
  144.         for _, line in data:
  145.             page.textLine(line)
  146.             lineno += 1
  147.             if lineno == self.linesPerPage:
  148.                 self.canvas.drawText(page)
  149.                 self.canvas.showPage()
  150.                 lineno = 0
  151.                 pageno += 1
  152.                 page = self._newpage()
  153.         if lineno > 0:
  154.             self.canvas.drawText(page)
  155.         else:
  156.             pageno -= 1
  157.         self.canvas.save()
  158.         return pageno
  159.  
  160.     def _writeChunk(self, page, chunk, lineno):
  161.         if self.lineNumbering:
  162.             formatstr = '%%%dd: %%s' % self.lppLen
  163.             for index, line in enumerate(chunk):
  164.                 page.textLine(
  165.                     formatstr % (lineno - len(chunk) + index + 1, line))
  166.         else:
  167.             for line in chunk:
  168.                 page.textLine(line)
  169.  
  170.     def _generateBob(self, data):
  171.         pageno = 1
  172.         lineno = 0
  173.         page = self._newpage()
  174.         chunk = list()
  175.         for last, line in data:
  176.             if lineno == self.linesPerPage:
  177.                 self.canvas.drawText(page)
  178.                 self.canvas.showPage()
  179.                 lineno = len(chunk)
  180.                 pageno += 1
  181.                 page = self._newpage()
  182.             lineno += 1
  183.             chunk.append(line)
  184.             if last or len(line.strip()) == 0:
  185.                 self._writeChunk(page, chunk, lineno)
  186.                 chunk = list()
  187.         if lineno > 0:
  188.             self.canvas.drawText(page)
  189.             self.canvas.showPage()
  190.         else:
  191.             pageno -= 1
  192.         if len(chunk) > 0:
  193.             page = self._newpage()
  194.             self.canvas.drawText(page)
  195.             self.canvas.showPage()
  196.             pageno += 1
  197.         self.canvas.save()
  198.         return pageno
  199.  
  200. def parse_generate_PDF(file_path):
  201.  
  202.     from time import gmtime, strftime
  203.    
  204.     time_seconds = strftime("%S", gmtime())
  205.    
  206.  
  207.     def getSize(files_name):
  208.         st = os.stat(files_name)
  209.         return int(st.st_size)
  210.  
  211.  
  212.     bigger = False
  213.    
  214.     print "File path before size: " + file_path + "\n"
  215.     filesize = getSize(file_path)
  216.     print 'File size is: ' + str(filesize) + '\n'
  217.     if filesize < 2500:
  218.         SEEK_OFFSET = -filesize
  219.     else:
  220.         SEEK_OFFSET = -2500
  221.         bigger = True
  222.  
  223.     last_receipt = ''
  224.     print 'File path is: ' + file_path + '\n'
  225.     with open(file_path) as f:
  226.         f.seek(SEEK_OFFSET, 2)
  227.         FILE_OFFSET = f.tell()
  228.         lines = f.read()
  229.         receipts = lines.split("================================")
  230.         if bigger is False or (bigger is True and len(receipts) > 2):
  231.             last_receipt = receipts[len(receipts) - 2]
  232.         elif bigger is True and len(receipts) == 2:
  233.             num_of_elements = 2
  234.             while num_of_elements == 2:
  235.                 if FILE_OFFSET <= 200:
  236.                     SEEK_OFFSET = 0
  237.                     f.seek(SEEK_OFFSET)
  238.                     lines = f.read()
  239.                     receipts = lines.split("================================")
  240.                     last_receipt = receipts[len(receipts) - 2]
  241.                     break
  242.                 elif FILE_OFFSET > 200:
  243.                     SEEK_OFFSET = FILE_OFFSET - 200
  244.                     f.seek(SEEK_OFFSET)
  245.                     FILE_OFFSET = f.tell()
  246.                     lines = f.read()
  247.                     receipts = lines.split("================================")
  248.                     num_of_elements = len(receipts)
  249.                     if num_of_elements > 2:
  250.                         last_receipt = receipts[len(receipts) - 2]
  251.                         break
  252.  
  253.     lines = last_receipt.split("\n")
  254.     match = False
  255.     match_index = -1
  256.     for index, line in enumerate(lines):
  257.         if 'Chk ' in line:
  258.             match = True
  259.             match_index = index
  260.  
  261.     if match == False:
  262.         quit()
  263.     else:
  264.         header = "           store name\n" \
  265.                  "        company name\n" \
  266.                  "         Tel#: +000-1123456\n" \
  267.                  "         VAT NUM: 1111 - 222\n\n"
  268.  
  269.         line1 = lines[match_index + 1].split(' ')
  270.         line1_tmp = ''
  271.         for element_index, element in enumerate(line1):
  272.             if element_index == len(line1) - 2 and element != ' ':
  273.                 break
  274.             elif element_index == len(line1) - 2:
  275.                 break
  276.             else:
  277.                 line1_tmp = line1_tmp + ' ' + element
  278.         line1 = str(line1_tmp)
  279.         line1 = line1 + "\n----------------------------------------\n"
  280.         line2 = lines[match_index] + "            " + lines[match_index + 3][-14:] + "\n"
  281.         line3 = "----------------------------------------\n"
  282.         linerest = ""
  283.         for item in range(match_index + 5, len(lines), 1):
  284.             linerest += lines[item] + "\n"
  285.         all_lines = line1 + line2 + line3 + linerest
  286.  
  287.         spaces = ' ' * 4
  288.         footer = spaces + "Thank You. Please visit us again\n" \
  289.                  + spaces + "================================\n" \
  290.                  + spaces + "You can use your some Card\n" \
  291.                  + spaces + "here. If for any reason you are\n" \
  292.                  + spaces + "no satisfied with your\n" \
  293.                  + spaces + "merchandise, exchange of goods\n" \
  294.                  + spaces + "is permitted within 14 days.\n" \
  295.                  + spaces + "Refund permitted with 7\n" \
  296.                  + spaces + "days on an some Card. No\n" \
  297.                  + spaces + "cash refunds. Ask in store for\n" \
  298.                  + spaces + "full details of our Exchange\n" \
  299.                  + spaces + "and refund policy."
  300.  
  301.         full_receipt = header + all_lines + footer
  302.         print full_receipt
  303.         tmp_datetime = lines[match_index + 3][-14:].split(" ")
  304.         date = tmp_datetime[0].replace("'", "")
  305.         time = tmp_datetime[1].replace(":", "-")
  306.         datetime = date + "_" + time
  307.         chk_num = lines[match_index].strip().replace(" ", "")
  308.         output_filename = chk_num + "-" + datetime + "-" + time_seconds + ".pdf"
  309.         tmp_filename = chk_num + "_" + datetime + "_" + time_seconds + ".tmp"
  310.         print "output filename: " + output_filename + "\n"
  311.         print "tmp_filename: " + tmp_filename + "\n"
  312.         temp_file = open('C:\\Users\\user\\Desktop\\Projects\\Micros PDF Retreiver Project\\test-journal\\PDF\\' + tmp_filename, "w+")
  313.         temp_file.write(full_receipt)
  314.         temp_file.close()
  315.         split_lines = full_receipt.split("\n")
  316.         num_lines = len(split_lines)
  317.        
  318.         print "Num of lines: " + str(num_lines)
  319.        
  320.         one_line_cm = 0.34
  321.         top_margin = 15.8
  322.  
  323.         if num_lines > 39:
  324.             extra_lines = num_lines - 39
  325.             top_margin = top_margin - (extra_lines * one_line_cm)
  326.         elif num_lines < 39:
  327.             extra_lines = 39 - num_lines
  328.             top_margin = top_margin + (extra_lines * one_line_cm)
  329.  
  330.         PDFCreator(Margins(0.25, 0.25, top_margin, 0.41), num_lines, output_filename, tmp_filename).generate()
  331.         os.remove('C:\\Users\\user\\Desktop\\Projects\\Micros PDF Retreiver Project\\test-journal\\PDF\\' + tmp_filename)
  332.        
  333.  
  334. class MyHandler(PatternMatchingEventHandler):
  335.    
  336.     patterns = ["*.jnl", "*.txt"]
  337.  
  338.     def process(self, event):
  339.         print 'generating pdf for ',event.src_path
  340.         parse_generate_PDF(event.src_path)
  341.        
  342.     def on_modified(self, event):
  343.         self.process(event)
  344.  
  345.  
  346. if __name__ == '__main__':
  347.     print "starting watchdog...\n"
  348.     observer = Observer()
  349.     observer.schedule(MyHandler(), path=r"C:\Users\user\Desktop\Projects\Micros PDF Retreiver Project\test-journal")
  350.     print "Monitoring directory...\n"
  351.     observer.daemon = True
  352.     observer.start()
  353.     print "watchdog started...\n"
  354.    
  355.     try:
  356.         while True:
  357.             time.sleep(1)
  358.     except KeyboardInterrupt:
  359.         observer.stop()
  360.  
  361.     observer.join()
  362.  
  363. '''
  364. -PDF files are not getting generated.
  365. -On line 215 filesize is printed as 0 I am not sure why. Running this function separately shows correct size
  366. -On line 341 seem to run twice since I see two files sometimes...
  367. -Weird behaviour....It runs normally when in debug mode inside PyCharm... WHen running normally though it sometimes runs only the first two creating two instances of the PDF file and then when modifying a file it captures the event but never creates a file, after that any modification is not even captured ....
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement