Подтвердить что ты не робот

PDF Кодирование шрифтов - почему я не могу копировать текст из PDF?

После преобразования PDF файла я больше не могу копировать текст из него.

Все, что я получаю, - это нечитаемые символы, которые не имеют никакого смысла.

Шрифт - французский Script MT, но кодировка является обычным (см. результат Adobe Reader > Файл > Свойства документa > Шрифт).

Здесь является PDF.

Я пробовал несколько методов... редактирование в редакторе PDF; Notepad ++; Слово; Acrobat Pro.

  • Что-то не так с исходным кодом файла PDF, что предотвращает правильное копирование текстовых элементов?

  • Может ли этот исходный код PDF быть изменен/изменен/изменен, чтобы копировать текст + вставлять текст?

4b9b3361

Ответ 1

Я просмотрел ваш файл с помощью различных инструментов:

  • qpdf (Джей Бэркенбитт) для анализа файла.
  • pdfid.py и pdf-parser.py (Дидье Стивенс), чтобы проанализировать больше.
  • PDFlib TET (инструмент извлечения текста), чтобы попытаться извлечь текст.
  • PDFlib Репортер шрифтов Плагин Acrobat {, Reader} для создания таблицы с глифами, используемыми PDF.
  • утилита командной строки Poppler pdffonts.

Даже TET не удалось извлечь текст. И TET - лучшее, что я знаю для этой задачи - часто удается, когда другие методы терпят неудачу.

Мой анализ дал мне следующие результаты:

  • pdffonts дает первый быстрый обзор. Он возвращает следующую информацию:

    $ pdffonts "so#12703387-problem.pdf" 
    
       name                      type         encoding    emb sub uni object ID
       ------------------------- ------------ ----------- --- --- --- ---------
       YLWHHJ+FrenchScriptMT     Type 1C      Custom      yes yes no      14  0
    

    Столбец uni должен содержать запись yes. no в этом столбце указывает, что в шрифте, используемом PDF, отсутствует таблица /ToUnicode. Этот шрифт встроен в подмножество под названием YLWHHJ+FrenchScriptMT. Он также использует кодировку шрифта Custom (скорее всего, используя массив /Differences). Без правильной и полной таблицы /ToUnicode будет невозможно правильно извлечь текст.

  • Создатель PDF, используемый для создания этого PDF, был PDFCreator версии 1.0.2 на основе очень старой версии Ghostscript 8.70. (Об этом свидетельствует запуск "pdfinfo so#12703387-problem.pdf".)

  • Используемый шрифт - это подмножество FrenchScriptMT, содержащее 94 разных глифа.

  • Кодировка шрифта "Пользовательская", используя массив /Differences.

  • Текстовый чертеж в PDF преимущественно использует оператор TJ, который позволяет индивидуально позиционировать глиф.

  • Все операции рисования текста широко используют функцию "индивидуального позиционирования глифа". Почти все глифы расположены индивидуально, как вы можете видеть из этого фрагмента кода (первое вхождение TJ):

    [<01>-3.18894<02>3.62397<02>3.62397<03>-2.42535<04>3.12889<05>3.88047<06>
    -14.1669<07>-3.7221<02>-4.37556<04>3.62397(\b)-4.88286(\t)3.88047<01>
    -3.18874(\n)1.29105<06>-13.6718(\b)-4.88245<0b>1.78573<02>3.1293<06>
    -21.6714<04>3.62438(\f)0.553714(\r)0.0464142<0e>-1.28494<0f>-0.448671<10>
    3.88007<06>-21.6714(\b)-4.88245<0b>1.78573<02>3.1293<06>-13.6718<11>
    0.0920142<02>-4.37515<04>3.62438(\b)2.622<06>-13.6718<03>
    -10.4245(\t)3.88007<11>0.0920142<02>3.62438<12>-6.14134(\b)3.11708<13>
    3.3858<14>0.0455999<15>-7.42628<06>-14.1669<16>2.90048(\r)0.0455999<17>
    -1.88425(\r)0.0455999<0b>1.78654(\r)]TJ
    
  • Как видно из "6.", операции рисования текста не используют "последовательность буквенных символов, заключенных в круглые скобки()", но используют "шестнадцатеричные данные, заключенные в угловые скобки", > '(см. Спецификация PDF, раздел 7.3.4.1).

  • Шестнадцатеричные значения для имен символов не соответствуют именам символов (хотя они должны быть получены из WinAnsiEncoding).

    Сначала нужно сначала найти таблицу пользовательских кодировок.

    Для этого я использовал команду pdf-parser.py -s encoding so#12703387-problem.pdf. Результат:

        <<
           /Type /Encoding
           /BaseEncoding /WinAnsiEncoding
            /Differences [
         1
            /g81 /g72
            /g71 /g86
            /g30 /g3
            /g53 /g87
            /g76 /g74
                 (... skipping some lines of output ...)
            /g32 /g170
            /g105 /g103
            /g95 ]
          >>
    
  • Теперь, когда последняя точка раскрывает суть вопроса: Таблица кодировки шрифтов не использует стандартные имена символов. Вместо этого он использует 1, /g81, /g72,... /g95 (всего 94 разных имени).

  • Мое последнее замечание о именах глифов также подтверждается результатами модуля PDFlib FontReporter:

    PDFFontReporter results

  • Нет автоматически работающего инструмента для извлечения текста (ничто из того, что я знаю, по крайней мере) может сделать головы и хвосты этого беспорядка. Человек-эксперт мог бы, но я даже не пытался (потому что это не помогло вам - см. Мое резюме для лучшей помощи).

  • Лучший способ, в общем, для автоматического извлечения текста для этого типа кодировок шрифтов - использовать OCR (оптическое распознавание символов). Однако в этом случае используемый шрифт ( "Французский Script MT" ) не будет работать с OCR.

  • В теории должно быть возможно добавить PDF-код к существующему файлу PDF, который фактически добавляет недостающую таблицу /ToUnicode. Я не знаю ни одного инструмента, который мог бы сделать это автоматически. Чтобы добавить это, необходимо:

    • переформатировать PDF файл, затем
    • запись таблицы вручную, затем
    • вставив его в нужное место PDF файла в виде объекта separte PDF, затем
    • вставка записи, указывающей на эту таблицу, в словарь объектов шрифта и, наконец,
    • обновить таблицу PDF xref с правильными смещениями байтов ко всем идентификаторам объектов, на которые повлияли изменения.

Резюме - Мой совет вам:

  • Восстановите свой PDF.
  • Если возможно, создайте PDFCreator на более поздней версии Ghostscript.
  • Измените настройку PDFCreator, чтобы он больше не создавал подмножество шрифтов. Убедитесь, что исходный шрифт полностью встроен.

Тогда, скорее всего, проблема с кодировкой шрифта исчезнет, ​​и вы сможете копировать текст из своего PDF файла.


Update:

Я создал 5 образцов PDF файлов с ручной кодировкой, которые вызывают проблему, вызванную отсутствующей или неправильной/управляемой таблицей /ToUnicode в PDF файле. Эти образцы теперь привязаны к недавно созданному хранилищу