Я пытаюсь получить дату модификации для нескольких PDF-файлов с помощью pdfminer.
import os
import re
from datetime import datetime
from pdfminer3.pdfparser import PDFParser
from pdfminer3.pdfdocument import PDFDocument
# This function convers the date string to a datetime object
def get_pdf_date(pd):
dtformat = "%Y%m%d%H%M%S"
clean = pd.decode("utf-8").replace("D:", "").split('+')[0]
return datetime.strptime(re.sub('[^0-9]', '', clean), dtformat)
path = "C:\\Users\\asus\\Desktop\\storage"
for file in os.listdir(path):
try:
fp = open(os.path.join(path, file), "rb")
parser = PDFParser(fp)
doc = PDFDocument(parser)
pdf_creation_date = doc.info[0]["CreationDate"]
print(str(pdf_creation_date) + ", " + str(get_pdf_date(pdf_creation_date)))
except Exception as e:
print(str(e) + " => " + str(pdf_creation_date))
Это вывод, который я получаю:
б"D:20151004081456+01'00'", 2015-10-04 08:14:56
б'Д:20161029124239', 2016-10-29 12:42:39
б"Д:20160727173724+05'30'", 27.07.2016 17:37:24
б"D:20170526150059+05'30'", 2017-05-26 15:00:59
б'Д:20190218122459', 2019-02-18 12:24:59
остаются непреобразованные данные: 0600 => b"D:20151017020552-06'00'"
б"D:20180302120823+00'00'", 2018-03-02 12:08:23
б"Д:20150317171945+05'30'", 2015-03-17 17:19:45
б"Д:20140405150714+01'00'", 2014-04-05 15:07:14
b'D:20190313161243Z', 2019-03-13 16:12:43
б'Д:20160523204913', 2016-05-23 20:49:13
б"D:20150716000009+05'30'", 2015-07-16 00:00:09
б"Д:20150923145114+05'30'", 23.09.2015 14:51:14 б"D:20150703193510+05'30'", 2015-07-03 19:35:10
б"Д:20170907220317+16'33'", 2017-09-07 22:03:17
остаются непреобразованные данные: 1200 => b"D:20160407192544-12'00'"
Как видите, функция синтаксического анализа, которую я использовал, работает не всегда, и это потому, что каждый PDF-файл имеет свой собственный синтаксис даты. Однако я заметил, что Foxit Reader всегда правильно получает метаданные, как показано на рисунке ниже.
Поэтому мне интересно, как я могу реализовать такую вещь






Неудачные даты имеют знак минус для смещения часового пояса:
D:20160407192544-12'00'
Эта строка в вашем коде ожидает только знак плюс (или, неявно, без смещения часового пояса):
clean = pd.decode("utf-8").replace("D:", "").split('+')[0]
Ваш код должен обрабатывать как положительные, так и отрицательные смещения часовых поясов.