Есть ли поле, в котором PDF-файлы указывают свою кодировку?
Я понимаю, что невозможно определить кодировку символов любых данных строковой формы, просто взглянув на данные. Это не мой вопрос.
Мой вопрос: есть ли в PDF-файле поле, в котором по соглашению указывается схема кодирования (например, UTF-8)? Это было бы что-то примерно аналогично <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
в HTML.
Заранее большое спасибо, Blz
2 ответа
Беглый взгляд на спецификацию PDF позволяет предположить, что внутри PDF-файла может быть другая кодировка. Взгляните на страницу 86. Таким образом, библиотека PDF с каким-либо низкоуровневым доступом должна быть в состоянии предоставить вам кодировку, используемую для строки. Но если вы просто хотите текст и не заботитесь об используемых внутренних кодировках, я бы предложил библиотеке позаботиться о преобразованиях для вас.
PDF использует "именованные" символы в том смысле, что символ - это имя, а не числовой код. Символ "а" имеет имя "а", символ "2" имеет имя "два", а знак евро имеет имя "евро", чтобы привести несколько примеров. PDF определяет несколько "стандартных" "базовых" кодировок (называемых "WinAnsiEncoding", "MacRomanEncoding" и еще несколько, точно не помню), причем кодирование представляет собой соответствие "один к одному" между именами символов и значениями байтов (да, только от 0 до 255). Точные нормативные значения для этих предопределенных кодировок приведены в спецификации PDF. Все эти кодировки используют значения ASCII для символов US-ASCII, но они отличаются более высокими значениями байтов.
Файл PDF может определять новые кодировки, беря "базовую" кодировку (скажем, WinAnsiEncoding) и переопределяя несколько байтов, поэтому автор PDF может, например, определить новую кодировку с именем "MySuperbEncoding" как WinAnsiEncoding, но с измененным значением байта 65 означать символ "ntilde" (это определение входит в PDF-файл), а затем указывать, что некоторые строки в файле используют кодировку "MySuperbEncoding". В этом случае строка, содержащая байтовые значения 65-66-67, будет означать символы "–BC", а не "ABC". И обратите внимание, что я имею в виду символы, не имеющие ничего общего с глифами или шрифтами. Разные строки в файле PDF могут использовать разные кодировки (это позволяет использовать более 256 символов в файле PDF, даже если каждая строка определена как последовательность байтов, и один байт всегда соответствует одному символу).
Итак, ответ на ваш вопрос: символы в файле PDF могут быть закодированы внутренне в специальной кодировке, сделанной на месте для этого конкретного файла PDF. Парсеры PDF должны делать соответствующие замены при необходимости. Я не знаю PDFMiner, но я удивлен, что он (будучи анализатором PDF) дает неверные значения, поскольку в спецификации очень ясно, как это должно интерпретироваться. Можно получить всю необходимую информацию из PDF-файла, но, как сказал Маттиас, это может быть большой проект, и я думаю, что программа с именем PDFMiner должна выполнять именно такую работу.