Переназначить зашифрованные символы PDF в читаемый текст

У меня есть проблема из-за того, что cups-PDF создает документы PDF, в которых символы отображаются на странные символы [в Ubuntu Linux 14.04 и 16.04}. Я думаю, что это какой-то юникод, даже если Python сообщает мне его строковый тип. type(object) Python возвращается "string"

Нет разницы, если я возьму текст из PDF-файла с помощью мыши, вставьте копию из evince / Firefox или через модуль Python PDFminer. Так что это правда, что PDF содержит неработающую текстовую информацию, которая отображается правильно в самом PDF-документе. Я этого не знал, но текст и текстовая графика в PDF-документе, похоже, не связаны очень тесно.

Когда я копирую текст из такого созданного документа в формате PDF, имя "Рафаэль" превращается в "✡✍✑✒✍☛✓" поэтому каждый отдельный символ отображается на "✡=R ✍=a ✑=p ✒=h ✍=a ☛=e ✓=l"

Другой пример: "Devel" превращается в "✭☛✮☛✓"

Как я могу написать функцию на Python, которая сдвигает эту "неправильную" информацию на правильную? В PDF-документе все отлично читается.

Это как-то связано с cups-PDF, использующим postscript для создания PDF, но без добавления правильной информации о шрифте / символе в документ.

Если письмо 'l' всегда символ '✓' что эта галочка Unicode символ

Как я могу сделать переназначение символов в этом странном представлении, чтобы исправить представление в Python? Так как я могу сдвинуть или переназначить символ '✓' к письму 'l' ? Любая идея?

Зачем мне это нужно? Мне нужно найти текстовое значение в этих документах.

1 ответ

Решение

PDF, кажется, использует специальный шрифт, чтобы предотвратить копирование. Текст зашифрован, как и буквы в шрифте. Так что если a После преобразования в кодовую точку Unicode U+0061 документ PDF заменил все эти a на U+270D, а специальный шрифт заменил обычный глиф "WRITING HAND" на букву a.

Другими словами, он использует шифр замещения.

Вам придется расшифровать это, как и любой другой шифр замещения: вам нужно создать обратное отображение от зашифрованной кодовой точки к незашифрованной кодовой точке. Вы можете использовать PDF в качестве руководства; как человек, вы можете легко прочитать фактический текст, а также увидеть, как он относится к скопированным кодовым точкам Unicode.

Например, мы знаем, что U+270D отображается на U+0061:

>>> hex(ord('✍'))
'0x270d'
>>> hex(ord('a'))
'0x61'

потому что, когда вы копируете a из PDF, вы получили 270d вместо этого Просто создайте таблицу для остальной части алфавита. Это может звучать как много ручной работы, но у вас уже есть открытый текст. Представьте, что вы не знаете, что содержится в тексте (например, у вас были только те символы, которые копирует текст); затем сначала нужно выполнить полный криптоанализ (для шифра замещения принять определенный язык и подсчитать символы; каждый язык имеет типичное распределение частот для своих букв, и такое распределение часто может быть сопоставлено в зашифрованном тексте отобразить обратно на исходные буквы).

Теоретически, вы должны иметь возможность извлечь специализированный шрифт, а затем проанализировать его для создания таблицы перевода. Однако это потребует некоторой формы компьютерного зрения; компьютер не может легко знать, что растр пикселей или серии векторных линий образуют определенную букву. Приблизительно для 70 кодовых точек (прописные, строчные, цифры, знаки препинания), вероятно, будет проще создать таблицу вручную.

Когда у вас есть таблица, Python может сделать перевод для вас; Я взял ваши подсказки и создал неполную таблицу только для этих писем:

mapping = {
    0x270d: 'a',
    0x261b: 'e',
    0x2712: 'h',
    0x2713: 'l',
    0x2711: 'p',
    0x272e: 'v',

    0x272d: 'D',
    0x2721: 'R',
}

print(encrypted.translate(mapping))

Все, что вам нужно сделать, это заполнить оставшиеся отображения; str.translate() метод тогда позаботится об остальном.

Демонстрация с использованием приведенной выше частичной таблицы на образцах зашифрованного текста:

>>> print("✡✍✑✒✍☛✓".translate(mapping))
Raphael
>>> print("✭☛✮☛✓".translate(mapping))
Devel
Другие вопросы по тегам