2013-05-12 4 views
4

저는 파이썬에서 PDF를 작업 중이며 PDFMiner을 사용하여 파일의 메타에 액세스 중입니다.PDF의 CreationTime을 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' 파이썬에서 읽을 수있는 형식으로 : 나는 이것을 사용하여 정보를 추출?

+0

이미 읽을 수 있습니다. 처음 6 자리 숫자는'yyyymmdd'로 표시됩니다. 'year = int (doc.info [0] [ 'CreationDate'] [2 : 6])' – sapi

+0

예, 그것은'yyyymm'이지만'dd'를위한 것이 아닙니다. 파일의 실제 날짜는'Thursday, May 02, 2013, 3:04:39 AM'입니다. – kimbebot

+0

@kimbebot 확실한가요? 어떤 시간대에? –

답변

5

"+ 01'00 '"시간대 정보입니까? 다음 계정으로 그것을 복용하지, 당신은 내가 형식이 here을 문서화 발견

>>>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

... 날짜 시간 개체를 만들 수 있습니다. 내가 처리 할 160k 문서가 있기 때문에 나는 또한 시간대에 대처해야했습니다. 내 전체 솔루션은 다음과 같습니다.

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) 
관련 문제