2013-05-12 3 views
4

Я работаю над PDF на Python, и я обращаюсь к метафайлу файла, используя PDFMiner. Я извлечь данные с помощью этого:Преобразование CreationTime PDF в читаемый формат в Python

from pdfminer.pdfparser import PDFParser, PDFDocument  
fp = open('diveintopython.pdf', 'rb') 
parser = PDFParser(fp) 
doc = PDFDocument() 
parser.set_document(doc) 
doc.set_parser(parser) 
doc.initialize() 

print doc.info[0]['CreationDate'] 
# And return this value "D:20130501200439+01'00'" 

Как я могу конвертировать D:20130501200439+01'00' в читаемом формате в Python?

+0

Это выглядит уже читаемым? Первые шесть цифр кажутся «yyyymmdd», конечно. Просто разрежьте его и преобразуйте в целое число, например 'year = int (doc.info [0] ['CreationDate'] [2: 6])' – sapi

+0

Да, это 'yyyymm', но не для' dd'. Фактическая дата файла - 'Четверг, 02 мая 2013 года, 3:04:39 AM'. – kimbebot

+0

@kimbebot Вы уверены в этом? в какой часовой зоне? –

ответ

5

Есть ли «+ 01'00» информация о часовом поясе? Не принимая во внимание, что вы можете создать объект типа DateTime следующим образом ...

>>>from time import mktime, strptime 
>>>from datetime import datetime 
... 
>>>datestring = doc.info[0]['CreationDate'][2:-7] 
>>>ts = strptime(datestring, "%Y%m%d%H%M%S") 
>>>dt = datetime.fromtimestamp(mktime(ts)) 
datetime(2013, 5, 1, 20, 4, 30) 
+0

Хороший, я пробовал это с другими файлами PDF и получил yyyymmdd точный, но не время, не нужно время в любом случае. – kimbebot

+0

Все ли метки времени 24 часа? – Enrico

2

Я нашел формат документально here. Мне тоже нужно было справляться с часовыми поясами, потому что у меня есть 160-килограммовые документы со всего мира. Вот мое полное решение:

import datetime 
import re 
from dateutil.tz import tzutc, tzoffset 


pdf_date_pattern = re.compile(''.join([ 
    r"(D:)?", 
    r"(?P<year>\d\d\d\d)", 
    r"(?P<month>\d\d)", 
    r"(?P<day>\d\d)", 
    r"(?P<hour>\d\d)", 
    r"(?P<minute>\d\d)", 
    r"(?P<second>\d\d)", 
    r"(?P<tz_offset>[+-zZ])?", 
    r"(?P<tz_hour>\d\d)?", 
    r"'?(?P<tz_minute>\d\d)?'?"])) 


def transform_date(date_str): 
    """ 
    Convert a pdf date such as "D:20120321183444+07'00'" into a usable datetime 
    http://www.verypdf.com/pdfinfoeditor/pdf-date-format.htm 
    (D:YYYYMMDDHHmmSSOHH'mm') 
    :param date_str: pdf date string 
    :return: datetime object 
    """ 
    global pdf_date_pattern 
    match = re.match(pdf_date_pattern, date_str) 
    if match: 
     date_info = match.groupdict() 

     for k, v in date_info.iteritems(): # transform values 
      if v is None: 
       pass 
      elif k == 'tz_offset': 
       date_info[k] = v.lower() # so we can treat Z as z 
      else: 
       date_info[k] = int(v) 

     if date_info['tz_offset'] in ('z', None): # UTC 
      date_info['tzinfo'] = tzutc() 
     else: 
      multiplier = 1 if date_info['tz_offset'] == '+' else -1 
      date_info['tzinfo'] = tzoffset(None, multiplier*(3600 * date_info['tz_hour'] + 60 * date_info['tz_minute'])) 

     for k in ('tz_offset', 'tz_hour', 'tz_minute'): # no longer needed 
      del date_info[k] 

     return datetime.datetime(**date_info) 
Смежные вопросы