Подробный гайд: как узнать кодировку PDF
Важно:
у PDF нет одной кодировки, как у .txt-файла. PDF — это бинарный контейнер.
Внутри него может быть сразу несколько кодировок:
- кодировки шрифтов:
WinAnsiEncoding,MacRomanEncoding,Identity-H,Customи т.д.; ToUnicodeCMap — таблица перевода кодов символов в Unicode;- кодировка метаданных:
PDFDocEncoding,UTF-16BE,UTF-8для XMP; - кодировка уже извлечённого текста: обычно
UTF-8, но это результат конвертации, а не «кодировка PDF».
Поэтому команда file -i file.pdf почти всегда покажет:
application/pdf; charset=binary
Это нормально. Ниже — как посмотреть, что именно внутри.
0. Какие инструменты понадобятся
Linux / WSL:
sudo apt update
sudo apt install poppler-utils qpdf mupdf-tools libimage-exiftool-perl
macOS:
brew install poppler qpdf mupdf exiftool
Windows:
- удобнее всего через WSL;
- либо через Chocolatey:
choco install poppler qpdf mupdf exiftool
Основные команды:
pdffonts— показывает шрифты и их кодировки;qpdf— разбирает PDF на объекты, распаковывает потоки;mutool— просмотр объектов PDF;pdftotext— извлекает текст в нужной кодировке;pdfinfo,exiftool— метаданные;xxd,Format-Hex— hex-просмотр.
1. Проверить «кодировку файла» на уровне ОС
Linux / macOS:
file file.pdf
file -i file.pdf
file --mime-encoding file.pdf
xxd -l 16 file.pdf
Пример:
file.pdf: PDF document, version 1.7
file.pdf: application/pdf; charset=binary
00000000: 25 50 44 46 2d 31 2e 37 ... %PDF-1.7
Windows PowerShell:
Format-Hex -Path .\file.pdf -Count 16
Вывод:
PDF — бинарный файл. «Кодировки» в привычном смысле у него нет. Дальше смотрим кодировки внутри.
2. Самый быстрый способ: pdffonts
pdffonts file.pdf
Пример вывода:
name type encoding emb sub uni object ID
------------------------------------ ----------------- ---------------- --- --- --- ---------
ABCDEE+Calibri TrueType WinAnsi yes yes yes 5 0
F1 Type0 Identity-H yes no yes 10 0
Что смотреть:
- encoding — кодировка шрифта:
WinAnsi— Windows-1252-подобная;MacRoman— MacRoman;Identity-H/Identity-V— составной шрифт, обычно 2-байтовые CID;Custom— нестандартная, надо смотреть/Encodingи/Differences.
- uni — есть ли
ToUnicodeCMap:yes— текст можно корректно извлечь в Unicode;no— извлечение может быть с ошибками.
Если нужен конкретный диапазон страниц:
pdffonts -f 1 -l 1 file.pdf
3. Разобрать PDF на объекты через qpdf
Это лучший способ увидеть /Encoding, /ToUnicode, /Differences, /CMapName.
qpdf --qdf --object-streams=disable input.pdf output.qdf.pdf
Теперь output.qdf.pdf — человекочитаемый PDF. Ищем нужные ключи.
Linux / macOS:
grep -a -n "/Encoding" output.qdf.pdf
grep -a -n "/ToUnicode" output.qdf.pdf
grep -a -n "/BaseFont" output.qdf.pdf
grep -a -n "/Differences" output.qdf.pdf
grep -a -n "/CMapName" output.qdf.pdf
Windows PowerShell:
Select-String -Path .\output.qdf.pdf -Pattern '/Encoding','/ToUnicode','/BaseFont','/Differences','/CMapName'
Что можно увидеть:
<< /Type /Font
/Subtype /TrueType
/BaseFont /ABCDEE+Calibri
/Encoding /WinAnsiEncoding
/ToUnicode 12 0 R >>
или:
/Encoding << /Type /Encoding
/BaseEncoding /WinAnsiEncoding
/Differences [ 128 /Euro 130 /quotesinglbase ... ] >>
Или для составного шрифта:
<< /Type /Font
/Subtype /Type0
/BaseFont /ABCDEE+SomeFont
/Encoding /Identity-H
/DescendantFonts [ ... ]
/ToUnicode 20 0 R >>
Если найден /ToUnicode 12 0 R, можно посмотреть объект 12:
qpdf --show-object=12 --filtered-stream-data input.pdf
Это покажет CMap — таблицу соответствия кодов символам Unicode.
4. Просмотр объектов через mutool
Полезно, если не хочется делать QDF-копию.
mutool show file.pdf trailer
mutool show file.pdf pages
mutool show file.pdf 5
Где 5 — номер объекта. Номера объектов видны в pdffonts в колонке object ID.
Если потоки сжаты, можно распаковать:
mutool clean -d input.pdf output-decompressed.pdf
После этого искать /Encoding и /ToUnicode в output-decompressed.pdf.
5. Кодировка метаданных
Метаданные PDF — это Title, Author, Subject, Keywords и XMP.
pdfinfo file.pdf
pdfinfo -meta file.pdf
exiftool -a -G1 -s file.pdf
Внутри PDF строки метаданных могут быть:
PDFDocEncoding— по умолчанию;UTF-16BE— если строка начинается с BOMFE FF;UTF-8— обычно внутри XMP-метаданных.
Посмотреть сырые строки:
grep -a -n "/Title\|/Author\|/Subject\|/Keywords" output.qdf.pdf
Если рядом видите FE FF — это UTF-16BE. Если BOM нет — скорее всего PDFDocEncoding.
6. Извлечь текст в нужной кодировке
Важно:
Это не кодировка самого PDF, а кодировка выходного текстового файла.
pdftotext -enc UTF-8 file.pdf out.txt
pdftotext -enc Latin1 file.pdf out-latin1.txt
Проверить результат:
file -i out.txt
Обычно для дальнейшей работы нужен именно UTF-8.
Если текст извлекается «кракозябрами», проблема почти всегда в одном из трёх:
- у шрифта нет
ToUnicode; - нестандартная
/Encoding+/Differences; - PDF отсканирован, текста внутри нет — только картинка. Тогда нужен OCR.
7. Через Python
pypdf
pip install pypdf
from pypdf import PdfReader
r = PdfReader("file.pdf")
print(r.metadata)
for i, page in enumerate(r.pages, 1):
print(f"--- page {i} ---")
print(page.extract_text())
PyMuPDF
pip install pymupdf
import fitz
doc = fitz.open("file.pdf")
for i, page in enumerate(doc, 1):
print(f"--- page {i} fonts ---")
for f in page.get_fonts(full=True):
print(f) # среди полей есть encoding
print(page.get_text())
В page.get_fonts(full=True) одно из полей — encoding шрифта.
8. GUI-варианты
- Notepad++: откройте
output.qdf.pdfи ищите/Encoding,/ToUnicode,/Differences. - HxD / 010 Editor: hex-просмотр, если нужно увидеть BOM
FE FF. - Adobe Acrobat Pro:
File > Properties > Fontsпокажет шрифты; для глубокого анализа — Preflight. - pdf-parser.py от Didier Stevens:
pdf-parser.py -s /Encoding file.pdf
pdf-parser.py -s /ToUnicode file.pdf
pdf-parser.py -o 12 -f file.pdf
9. Как трактовать результаты
| Что видно | Что это значит |
|---|---|
WinAnsiEncoding |
Похоже на Windows-1252. Часто текст извлекается нормально. |
MacRomanEncoding |
MacRoman. |
Identity-H / Identity-V |
Составной шрифт, коды не равны Unicode. Нужен ToUnicode. |
Custom |
Смотрите /Differences и /BaseEncoding. |
uni yes в pdffonts |
Есть ToUnicode, текст можно извлечь в Unicode. |
uni no |
Unicode-маппинга нет, извлечение может быть некорректным. |
FE FF в начале строки |
UTF-16BE. |
| Нет BOM в метаданных | Обычно PDFDocEncoding. |
| XMP-метаданные | Обычно UTF-8. |
file -i пишет binary |
Это нормально для PDF. |
10. Чек-лист
file -i file.pdf— убедиться, что это PDF иcharset=binary.pdffonts file.pdf— посмотреть кодировки шрифтов иuni.qpdf --qdf --object-streams=disable file.pdf out.pdf— разобрать PDF.grep -a -n "/Encoding\|/ToUnicode\|/Differences" out.pdf— найти кодировки.- Если есть
/ToUnicode 12 0 R—qpdf --show-object=12 --filtered-stream-data file.pdf. pdftotext -enc UTF-8 file.pdf out.txt— извлечь текст в UTF-8.- Для метаданных —
pdfinfo -meta file.pdfиexiftool file.pdf.
Важно:
«кодировка PDF» — это не одна величина. Если вам нужен просто текст — извлекайте в UTF-8 через pdftotext. Если нужно понять, почему текст извлекается неправильно — смотрите pdffonts, /Encoding, /ToUnicode и /Differences.
Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.