Advertisement
Guest User

Untitled

a guest
Feb 17th, 2016
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 15.98 KB | None | 0 0
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. import sys
  4. import requests
  5. import os
  6. from clint.textui import progress
  7. import glob
  8. import shutil
  9. import time
  10. import datetime
  11. import ConfigParser
  12. import urllib
  13. import logging
  14. import urllib2
  15. import os.path
  16.  
  17.  
  18. version = "1.50"
  19.  
  20.  
  21. config = ConfigParser.ConfigParser()
  22. config.read("config.ini")
  23.  
  24.  
  25. logging.basicConfig(level=logging.INFO)
  26. logger = logging.getLogger(__name__)
  27. logger.setLevel(logging.INFO)
  28.  
  29.  
  30.  
  31. ts = time.time()
  32. timestamp  = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d-%H-%M-%S')
  33.  
  34.  
  35. if not os.path.isdir("./log"):
  36.             os.mkdir("./log")
  37.  
  38.  
  39. # create a file handler
  40. log_file = './log/do_ocr_' + timestamp + '_log.txt'
  41.  
  42. handler = logging.FileHandler(log_file)
  43. handler.setLevel(logging.INFO)
  44.  
  45. # create a logging format
  46.  
  47. formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
  48. handler.setFormatter(formatter)
  49.  
  50. # add the handlers to the logger
  51.  
  52. logger.addHandler(handler)
  53.  
  54.  
  55.  
  56. latest_version =  urllib2.urlopen('https://raw.githubusercontent.com/tshrinivasan/OCR4wikisource/master/VERSION').read().strip('\n').split(' ')[1]
  57.  
  58. if not float(version) == float(latest_version):
  59.             logger.info("\n\nYour OCR4WikiSource version is " + version + ". This is old. The latest version is " + latest_version + ". Update from https://github.com/tshrinivasan/OCR4wikisource \n\n")
  60.             sys.exit()
  61.  
  62.  
  63.  
  64.  
  65. logger.info("Running do_ocr.py " + version)
  66.  
  67.  
  68. os_info = open("/etc/lsb-release")
  69. for line in os_info:
  70.     if  "DISTRIB_DESCRIPTION" in line:
  71.         os_version = line.split("=")[1]
  72.  
  73. logging.info("Operating System = " + os_version)
  74.  
  75.  
  76.  
  77.  
  78.  
  79. #Read the config file
  80.  
  81. url = config.get('settings','file_url')
  82. columns = config.get('settings','columns')
  83. wiki_username = config.get('settings','wiki_username')
  84. wiki_password = config.get('settings','wiki_password')
  85. wikisource_language_code = config.get('settings','wikisource_language_code')
  86. keep_temp_folder_in_google_drive = config.get('settings','keep_temp_folder_in_google_drive')
  87. #start_page = config.get('settings','start_page')
  88. #end_page = config.get('settings','end_page')
  89.  
  90.  
  91.  
  92. logger.info("URL = " + url )
  93. logger.info("Columns = " + columns )
  94. logger.info("Wiki Username = " + wiki_username)
  95. logger.info("Wiki Password = " + "Not logging the password")
  96. logger.info("Wiki Source Language Code = " + wikisource_language_code )
  97. logger.info("Keep Temp folder in  Google Drive = " + keep_temp_folder_in_google_drive)
  98. #logger.info("Start Page = " + str(start_page))
  99. #logger.info("End Page = " + str(end_page))
  100.  
  101.  
  102.  
  103.  
  104. original_url = urllib.unquote(url).decode('utf8')
  105.  
  106. logger.info("Original URL = " + original_url )
  107.  
  108.  
  109. filename = os.path.basename(original_url)
  110. filetype = filename.split('.')[-1].lower()
  111.  
  112. logger.info("File Name = " + filename)
  113. logger.info("File Type = " + filetype)
  114.  
  115.  
  116. temp_folder = "OCR-" + filename + '-temp-'+ timestamp
  117. logger.info("Created Temp folder " + temp_folder)
  118.  
  119. if not os.path.isdir(temp_folder):
  120.       os.mkdir(temp_folder)
  121.                            
  122.  
  123.  
  124.  
  125. if os.path.isfile(filename):
  126.             logging.info(filename + " Already Exists. Skipping the download.")
  127.  
  128. else:
  129.             print "\n\nDownloading the file " + filename + "\n\n"
  130.  
  131.             logger.info("Downloading the file " + filename )
  132.  
  133.             #Download the file
  134.  
  135.             r = requests.get(url, stream=True)
  136.             with open(filename, 'wb') as f:
  137.                         total_length = int(r.headers.get('content-length'))
  138.                         for chunk in progress.bar(r.iter_content(chunk_size=1024), expected_size=(total_length/1024) + 1):
  139.                                     if chunk:
  140.                                                 f.write(chunk)
  141.                                                 f.flush()
  142.  
  143.  
  144.             logger.info("Download Completed")
  145.  
  146.  
  147.  
  148.  
  149. # Convert djvu to PDF
  150.  
  151. if filetype.lower() == "djvu" :
  152.  
  153.             if os.path.isfile(filename.split('.')[0] + ".pdf"):
  154.                         logging.info("Found PDF version. Skipping DJVU to PDF conversion")
  155.                         filename = filename.split('.')[0] + ".pdf"
  156.                         filetype = filename.split('.')[-1].lower()
  157.                                                        
  158.             else:
  159.                        
  160.                         message  =  "Found a djvu file. Converting to PDF file. " + "\n\n"
  161.                         logger.info(message)
  162.        
  163.                         command = "ddjvu --format=pdf " +  '"' + filename +  '"' + "   " + '"' +  filename.split('.')[0] + '"' + ".pdf"
  164.                         os.system(command.encode('utf-8'))
  165.                         logger.info("Running " + command)
  166.  
  167.                         filename = filename.split('.')[0] + ".pdf"
  168.                         filetype = filename.split('.')[-1].lower()
  169.        
  170.  
  171.  
  172. if filetype.lower() == "pdf":
  173.  
  174.     # split the PDF files vertically based on the column numbers
  175.  
  176.         message =  "Aligining the Pages of PDF file. \n"
  177.         logger.info(message)
  178.         command = "mutool poster -x " + str(columns)  + " " + '"' +  filename + '"' +  "  currentfile.pdf"
  179.         logger.info("Running " + command.encode('utf-8'))
  180.        
  181.         os.system(command.encode('utf-8'))
  182.                
  183.  
  184.         message =  "Spliting the PDF into single pages. \n"
  185.         logger.info(message)
  186.         burst_command = "pdftk currentfile.pdf burst"
  187.         os.system(burst_command)
  188.         logger.info("Running " + burst_command)
  189.  
  190.        
  191.         files = []
  192.         for filename in glob.glob('pg*.pdf'):
  193.                 files.append(filename)
  194.                 files.sort()
  195.  
  196.         chunks=[files[x:x+int(columns)] for x in xrange(0, len(files), int(columns))]
  197.  
  198.         counter = 1
  199.         message =  "Joining the PDF files ...\n"
  200.         logger.info(message)
  201.  
  202.         if columns == "1":
  203.                 counter = 1
  204.                 for pdf in files:
  205.                         command = "cp " + pdf +  " page_" + str(counter).zfill(5) + ".pdf"
  206.                         logger.info("Running Command " + command)
  207.                         counter = counter + 1
  208.                         os.system(command)
  209.  
  210.  
  211.         if columns == "2":
  212.  
  213.             chunks=[files[x:x+int(columns)] for x in xrange(0, len(files), int(columns))]
  214.  
  215.             counter = 1
  216.             message =  "Joining the PDF files ...\n"
  217.             logger.info(message)
  218.            
  219.             for i in chunks:
  220.                 com =  ' '.join(i)
  221.                 command = "pdfunite " + com + " " + "page_" + str(counter).zfill(5) + ".pdf"
  222.                 logger.info("Running " + command)
  223.                 counter = counter + 1
  224.                 os.system(command)
  225.                                
  226.  
  227.        
  228.  
  229. def move_file(file):
  230.         source = file
  231.         destination = temp_folder
  232.  
  233.         if os.path.isdir(temp_folder):
  234.                 shutil.move(source,destination)
  235.         else:
  236.                 os.mkdir(temp_folder)
  237.                 shutil.move(source,destination)
  238.         message =  "Moving the file " + file + " to the folder " + temp_folder + "\n"
  239.         logger.info(message)
  240.  
  241.  
  242.  
  243.  
  244. # Create a temp folder in google drive to upload the files. You can delete this folder later.
  245.  
  246. logger.info( "\nCreating a folder in Google Drive to upload files. Folder Name : " + temp_folder + "\n\n")
  247.  
  248. create_folder_in_drive_command = "gdmkdir.py " + '"' +  temp_folder + '"'  + " | tee folder_in_google_drive.log"
  249. logger.info("Running " + create_folder_in_drive_command.encode('utf-8'))
  250. os.system(create_folder_in_drive_command.encode('utf-8'))
  251.  
  252.  
  253. resultfile = open("folder_in_google_drive.log","r").readlines()
  254.  
  255. for line in resultfile:
  256.         if "id:" in line:
  257.                 drive_folder_id = line.split(":")[1].strip()
  258.  
  259.                
  260.  
  261. files = []
  262. for filename in glob.glob('page_*.pdf'):
  263.             files.append(filename)
  264.  
  265.  
  266.  
  267.  
  268. #pages = []
  269. #if not end_page == "END" :
  270. #    for pageno in range(int(start_page), int(end_page) + 1):
  271. #         pages.append("page_" + str(pageno).zfill(5) + ".pdf")  
  272.  
  273. #if end_page == "END":
  274. #    for pageno in range(int(start_page),len(files) +1):
  275. #        pages.append("page_" + str(pageno).zfill(5) + ".pdf")
  276.        
  277.  
  278.  
  279.  
  280.  
  281.  
  282.  
  283. #Upload the PDF files to google drive and OCR
  284.  
  285. upload_counter = 1
  286.  
  287. for pdf_file in sorted(files):
  288.  
  289.  
  290.     if not os.path.isfile(pdf_file.split('.')[0] + ".upload"):                        
  291.                                                
  292.  
  293.             message= "\n\nuploading " + pdf_file + " to google Drive. "     # File " + str(upload_counter) + " of " + str(len(files)) + " \n\n"
  294.             logger.info(message)
  295.             command = "gdput.py -t ocr -f   " +  drive_folder_id + " "  + pdf_file + " | tee " + pdf_file.split('.')[0] + ".log"
  296.            
  297.             logger.info("Running " + command)
  298.             os.system(command)
  299.  
  300.                                                            
  301.  
  302.             resultfile = open(pdf_file.split('.')[0] + ".log","r").readlines()
  303.  
  304.             for line in resultfile:
  305.                         if "id:" in line:
  306.                                     fileid = line.split(":")[1].strip()
  307.                                     filename = pdf_file.split(".")[0] + ".txt"
  308.                                     get_command = "gdget.py -f txt -s " + filename + " " + fileid
  309.                                     logger.info( "\n\nDownloading the OCRed text \n\n ")
  310.                                     logger.info("Running " + command)
  311.                               #      os.system(get_command)
  312.  
  313.  
  314.                                     download_status = os.system(get_command)
  315.  
  316.                                     if download_status == 0:
  317.                                                 create_temp_file = "touch " + pdf_file.split('.')[0] + ".upload"
  318.                                                 logger.info("\n  Creating temp file " + create_temp_file + "\n")
  319.                                                 os.system(create_temp_file)
  320.                        
  321.  
  322. #           move_file(pdf_file)
  323.             logger.info( "\n\n========\n\n")
  324.             upload_counter = upload_counter + 1
  325.  
  326.  
  327.  
  328. pdf_count = len(glob.glob('page_*.pdf'))
  329. text_count = len(glob.glob('page_*.txt'))
  330.  
  331.  
  332.  
  333. if not pdf_count == text_count:
  334.  
  335.             logger.info("\n\n=========ERROR===========\n\n")
  336.            
  337.             for i in range(1,int(pdf_count)+1):
  338.                         txt_file = "page_" + str(i).zfill(5) + ".txt"
  339.                         if not os.path.isfile(txt_file):
  340.                                     logger.info( "Missing " + txt_file)
  341.                                     logger.info( "page_" + str(i).zfill(5) + ".pdf" + " should be reuploaded ")
  342.                                                                          
  343.  
  344.             logger.info(" \n\nText files are not equal to PDF files. Some PDF files not OCRed. Run this script again to complete OCR all the PDF files \n\n")
  345.             sys.exit()
  346.  
  347.            
  348.  
  349.            
  350.  
  351. files = []
  352. for filename in glob.glob('page_*.txt'):
  353.         files.append(filename)
  354.         files.sort()
  355.  
  356.  
  357. # Split the text files to sync with the original images
  358.  
  359. logger.info("Split the text files to sync with the original images")
  360.  
  361.  
  362. if int(columns)==1:
  363.         i = 1
  364.         for textfile in files:
  365.                 with open(textfile,'r') as filetosplit:
  366.                          content = filetosplit.read()
  367.                        
  368.                          if len(content)>50:
  369.                                  with open('txt_'+str(i).zfill(5)+'.txt', 'w') as towrite:
  370.                                          towrite.write(content)
  371.                                  i = i+1
  372.                          else:
  373.  
  374.                 with open('txt_'+str(i).zfill(5)+'.txt', 'w') as towrite:
  375.                                     towrite.write(' ')
  376.                                 i = i+1
  377.  
  378.                                                                                                                              
  379.  
  380.                                        
  381.  
  382. elif int(columns)==2:
  383.                                                                                                                                                
  384.     i = 1
  385.     for textfile in files:
  386.         with open(textfile,'r') as filetosplit:
  387.                 content = filetosplit.read()
  388.         if "________________" in content:
  389.                     records = content.split('________________')
  390.                     print records
  391.                     for record in records[1::2]:
  392.                                 with open('txt_'+str(i).zfill(5)+'.txt', 'w') as towrite:
  393.                                         towrite.write(record)
  394.                                 i = i+1
  395.                 else:
  396.                         for no in range(int(columns)):
  397.                                 with open('txt_'+str(i).zfill(5)+'.txt', 'w') as towrite:
  398.                                   towrite.write(' ')
  399.                                 i = i+1
  400.                                
  401.                    
  402.  
  403.  
  404. logger.info("Joining text files based on Column No")
  405.                                
  406. files = []
  407. for filename in glob.glob('txt*.txt'):
  408.         files.append(filename)
  409.         files.sort()
  410.  
  411.                                                
  412.  
  413. chunks=[files[x:x+int(columns)] for x in xrange(0, len(files), int(columns))]
  414.  
  415. counter = 1
  416.                                                
  417. for i in chunks:
  418.         com =  ' '.join(i)
  419.         command = "cat  " + com + " > " + "text_for_page_" + str(counter).zfill(5) + ".txt"
  420.         counter = counter + 1
  421.         logger.info("Running " + command)
  422.         os.system(command)
  423.  
  424.  
  425.  
  426. message =  "\nMoving all temp files to " + temp_folder + "\n"
  427. logger.info(message)
  428. command = "mv folder*.log currentfile.pdf  doc_data.txt pg*.pdf page* txt*   " + '"' +  temp_folder + '"'
  429. logger.info("Running " + command.encode('utf-8'))
  430. os.system(command.encode('utf-8'))
  431.  
  432.  
  433.  
  434.  
  435. original_filename = os.path.basename(original_url)
  436.  
  437. files = []
  438. for textfile in glob.glob('text_for_page*.txt'):
  439.             files.append(textfile)
  440.             files.sort()
  441.  
  442.            
  443. single_file = open("all_text_for_" + original_filename + ".txt" ,"w")
  444.  
  445. counter = 1
  446. for filename in files:
  447.             content = open(filename).read()
  448.             single_file.write("\n\n")
  449.             single_file.write("Page " + str(counter))
  450.             single_file.write("\n\n")
  451.             single_file.write(content)
  452.             single_file.write("\n\n")
  453.             single_file.write("xxxxxxxxxx")
  454.             counter = counter + 1
  455.  
  456. single_file.close()
  457.                                                                
  458.  
  459. logger.info("Merged all OCRed files to  all_text_for_" + original_filename + ".txt")
  460.  
  461.  
  462. if not os.path.isdir("text-for-" + original_filename):
  463.             os.mkdir("text-for-" + original_filename)
  464.  
  465. command = "cp *.txt text-for-" + original_filename
  466. logger.info("Making a copy of all text files to text-for-" + original_filename)
  467. logger.info("Running " + command.encode('utf-8'))
  468. os.system(command.encode('utf-8'))
  469.  
  470.  
  471.  
  472.  
  473. if keep_temp_folder_in_google_drive == "no":
  474.         message =  "\nDeleting the Temp folder in Google Drive " + temp_folder + "\n"
  475.         logger.info(message)
  476.         command = "gdrm.py " + drive_folder_id
  477.         logger.info("Running " + command)
  478.         os.system(command)
  479.  
  480.  
  481. message =  "\n\nDone. Check the text files start with text_for_page_ "
  482. logger.info(message)
  483.  
  484.  
  485.  
  486.  
  487. result_text_count = len(glob.glob('text_for_page_*.txt'))
  488.  
  489. if not pdf_count == result_text_count:
  490.             logger.info("\n\n=========ERROR===========\n\n")
  491.             logger.info(" \n\nText files are not equal to PDF files. Some PDF files not OCRed. Run this script again to complete OCR all the PDF     files \n\n")
  492.             sys.exit()
  493.  
  494. if  pdf_count == result_text_count:
  495.             logger.info("\n\nThe PDF files and result text files are equval. Now running the mediawiki_uploader.py script\n\n")
  496.             command = "python mediawiki_uploader.py"
  497.             os.system(command)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement