Как правильно декодировать / кодировать имена файлов при использовании `pdfrw` для добавления метаданных?

Я пишу сценарий, который добавит метаданные PDF в список файлов PDF.

Моя проблема связана с PDF-файлами с именами, в которых есть определенные символы - в примере, который я пробовал, в названии было написано "en dash", но я уверен в будущем (я не контролирую эти имена файлов) будут другие подобные проблемы.

я использую pdfrw и Python 2.7. В настоящее время у меня есть:

from pdfrw import PdfReader,PdfWriter
from os import listdir

def get_files(pwy):
   tr_files=listdir(pwy)
   tr_files2=[]
   for t in tr_files:
      tr_files2.append(pwy+'/'+t)
   return tr_files2

def add_keywords(filename,keywords):
   writer=PdfWriter()
   trailer=PdfReader(filename)
   trailer.Info.Keywords=keywords
   writer.trailer=trailer
   writer.write(filename)

file_list=get_files('C:/example_folder')
for f in file_list:
   add_keywords(f,'some exciting metadata!')

Это прекрасно работает для файлов без "черточки". Файлы с "en dash" показывают, что он был изменен при запуске, но когда я проверяю метаданные в Adobe Acrobat, там ничего нет.

Я почти уверен, что это какая-то проблема кодирования. Так как это показывает "ан тире" как x\96, он должен использовать cp1252. Я использую Spyder 2.3.1 и у меня # -- кодирование: utf-8 -- в верхней части моего скрипта.

Я прочитал "Абсолютный минимум каждого разработчика Softward" Абсолютно, положительно должен знать о Unicode и наборах символов и Pragmatic Unicode, и я знаю, в общем, я хочу декодировать ввод, запустить остальную часть кода (не напечатано выше, но я использую имя файла для извлечения информации из базы данных, затем отформатируйте эту информацию и хотите поместить полученную строку в метаданные), а затем закодируйте ее снова. Но я не смог понять, что работает.

Я думаю, что решение будет одним из следующих:

  1. [лучше] Правильно справиться с проблемой кодировки.

  2. Запустите некоторый пакетный файл в подпапке, переименовав файлы в то, что может обработать сценарий, затем поменяйте местами имена в конце (они должны заканчиваться исходными именами файлов).

Я ценю любую помощь! Я не смог найти ничего, что сработало.

3 ответа

Вы только что приобрели Unicode ноу-хау, не поможет вам с PDF. PDF появился еще до появления Unicode.

Вы должны найти "Приложение D (нормативное): Наборы символов и кодировки" в официальной спецификации ISO 32000_2008 PDF-1.7, опубликованной Adobe, на стр. 651.

Там вы найдете, что вы должны использовать для en-dash:

  • \263 для стандартного кодирования
  • \230 для MacEncoding
  • \226 для WinEncoding
  • \205 для PDFEncoding

Для метаданных (/Info словарь) используйте PDFEncoding.

К сожалению, у меня пока недостаточно репутации для stackru, чтобы позволить мне комментировать проблему, так что это скорее комментарий, чем реальный ответ. (Я автор pdfrw.)

"Файлы с"en dash"показывают, что он был изменен при запуске, но когда я проверяю метаданные в Adobe Acrobat, там ничего нет".

Это действительно странно. Вы уверены, что видите время изменения или время доступа (например, по какой-то причине чтение работает, а запись - нет)?

В любом случае, я хотел бы предложить (для целей отладки), чтобы вы начали с замены "writer.write(filename)" на что-то вроде "writer.write('ified_' + filename)"

Вы также можете напечатать имя файла в цикле, чтобы убедиться, что эти файлы действительно видны.

Наконец, обработка имени файла в pdfrw действительно проста, но если вам нужно по какой-то причине, вы можете открыть файлы самостоятельно и передать файловые объекты читателю и писателю.

Более подробно о вашем втором решении - можете ли вы скопировать файл в другой путь внутри add_keywordsзатем сделайте PdfWriter прочее, потом скопировать обратно? Ты можешь использовать tempfile.mkstemp() чтобы получить временное имя файла, или, если вы собираетесь делать только одно, просто выберите где-нибудь имя...

Другие вопросы по тегам