Подробный гайд: Как узнать кодировку PDF

Полный гайд: как узнать кодировку PDF. Разбираем pdffonts, qpdf, mutool, ToUnicode, метаданные и извлечение текста в UTF-8.

2026.09.19                  


Подробный гайд: как узнать кодировку PDFПодробный гайд: как узнать кодировку PDF

Важно:

у PDF нет одной кодировки, как у .txt-файла. PDF — это бинарный контейнер.

Внутри него может быть сразу несколько кодировок:

  • кодировки шрифтов: WinAnsiEncoding, MacRomanEncoding, Identity-H, Custom и т.д.;
  • ToUnicode CMap — таблица перевода кодов символов в 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 — есть ли ToUnicode CMap:
    • 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 — если строка начинается с BOM FE 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.

Если текст извлекается «кракозябрами», проблема почти всегда в одном из трёх:

  1. у шрифта нет ToUnicode;
  2. нестандартная /Encoding + /Differences;
  3. 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. Чек-лист

  1. file -i file.pdf — убедиться, что это PDF и charset=binary.
  2. pdffonts file.pdf — посмотреть кодировки шрифтов и uni.
  3. qpdf --qdf --object-streams=disable file.pdf out.pdf — разобрать PDF.
  4. grep -a -n "/Encoding\|/ToUnicode\|/Differences" out.pdf — найти кодировки.
  5. Если есть /ToUnicode 12 0 Rqpdf --show-object=12 --filtered-stream-data file.pdf.
  6. pdftotext -enc UTF-8 file.pdf out.txt — извлечь текст в UTF-8.
  7. Для метаданных — pdfinfo -meta file.pdf и exiftool file.pdf.

Важно:

«кодировка PDF» — это не одна величина. Если вам нужен просто текст — извлекайте в UTF-8 через pdftotext. Если нужно понять, почему текст извлекается неправильно — смотрите pdffonts, /Encoding, /ToUnicode и /Differences.




Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.


Статью подготовил: Аверко Денис Сергеевич @Nymexis г. Омск (специалист по ЗИ)

Комментарии

Загрузка...
Если комментарии не загружаются, можете попробовать отключить блокировщик рекламы для этого сайта