Прежде чем передать задачу по переводу PDF, сначала проверьте шрифт, а не спешите его менять.

Длина списка шрифтов по умолчанию отличается от длины кортежа, возвращаемого функцией full=True. Затем прочитайте первые шесть элементов, а затем проверьте, являются ли байты шрифта, возвращаемые экстрактом_font, пустыми. Ссылка на шрифт Base14 не означает, что шрифт встроен в программу; и подмножество шрифтов не должно считаться ошибкой.

Основные положения этой статьи

— Длина списка шрифтов по умолчанию отличается от длины кортежа, возвращаемого функцией full=True, и при чтении следует использовать первые шесть элементов.

  • Перед переводом необходимо провести инвентаризацию шрифтов. Нецелесообразно напрямую заменять их на Siyuan Heibo или Arial по всему миру.
  • Ссылка на шрифт Base14 не означает, что программа шрифтов встроена. Также необходимо проверить, пусты ли извлеченные байты.

— Подмножества шрифтов не следует рассматривать как ошибки. Идентификатор шрифта должен быть сохранен и не может быть прямо оценен как поврежденный.

  • Скрипт может сообщать только о статусе внедрения, а проблемы с глифами и лицензиями целевого языка необходимо решать вручную.

Когда многие люди получают перевод PDF-файла, первое, о чем они думают, — это напрямую изменить его на Siyuan Heibo или Arial. Из-за этого часто возникают проблемы при доставке: математические символы становятся квадратами, номера таблиц смещаются или перевод не открывается в некоторых читалках. Эта статья написана для разработчиков и владельцев документов, которым необходимо взять на себя задачу перевода PDF-файлов. Прочитав, вы узнаете, как использовать PyMuPDF для инвентаризации шрифтов, как интерпретировать возвращаемые результаты и какие выводы нельзя сделать на основе только вывода кода.

Целью инвентаризации шрифтов является подтверждение технической возможности редактирования и стабильности рендеринга, а не проведение аудита на соответствие законодательству. Список шрифтов по умолчанию отличается от длины кортежа, возвращаемого full=True. При чтении необходимо взять первые шесть элементов, а затем проверить, пусты ли байты шрифта, возвращаемые extract_font. Ссылки на шрифты Base14 не означают, что шрифт встроен в программу, а поднабор шрифтов не всегда следует рассматривать как ошибку.

Заключение одним предложением

Сначала проведите инвентаризацию шрифтов, а затем определите путь перевода. Не меняйте шрифты глобально перед извлечением текста.

твоя ситуацияРекомендуемые практикипричина
Программа шрифтов пустаЗаписи не извлекаются в программу внедрения и подтверждают состояние страницы.Ссылка Base14 не соответствует встроенному шрифту
встретить подмножество шрифтовСохраняйте идентичность шрифтаПодмножества шрифтов не равны повреждению
Список шрифтов пустПодтвердите содержимое страницыСтраница может представлять собой изображение или другой нарисованный путь.
Необходимость обработки реальных файловСначала проверьте десенсибилизированные образцы.Пример кода не отражает влияние на все реальные файлы.

Почему мы не можем напрямую заменить шрифты глобально?

Непосредственная замена шрифтов может привести к нескольким типичным проблемам:

  • Математические символы в исходном тексте становятся квадратами.
  • Недопустимое выравнивание чисел в таблице по одинаковой ширине.
  • Встроены ограниченные шрифты, из-за чего перевод не открывается в некоторых программах чтения.

Поэтому, прежде чем приступить к извлечению текста или реконструкции набора текста, проведите инвентаризацию шрифтов документа. `get_page_fonts()` — это базовый зонд, предоставляемый PyMuPDF, который может сказать вам, на какие ресурсы шрифтов фактически ссылается каждая страница, полностью ли они встроены, а также тип кодировки. Эта информация определяет, следует ли использовать в будущем распознавание текста, прямую замену или перестановку вручную.

Ключевые моменты при чтении информации о шрифте

— Длина списка шрифтов по умолчанию отличается от длины кортежа, возвращаемого full=True, который считывается как первые шесть элементов.

  • Когда программа шрифтов пуста, это означает, что встроенные байты шрифта не извлекаются.

— Подмножество шрифтов должно сохранять только идентификатор шрифта и не рассматривать это напрямую как ошибку.

Синтетическое тестирование: построение памяти и проверка утверждений

Чтобы пример мог работать изолированно, мы создали полностью автономный тестовый пример. Вместо того, чтобы полагаться на внешние файлы, сценарий использует PyMuPDF для создания PDF-файла, содержащего стандартные шрифты в памяти, а затем немедленно выполняет инвентаризацию шрифтов на нем. Это не только обеспечивает воспроизводимость, но также позволяет избежать рисков, связанных с авторскими правами и конфиденциальностью.

import pymupdf
with pymupdf.open() as doc:
    page = doc.new_page()
    page.insert_text((72, 72), "Font sample", fontname="helv")
    fonts = doc.get_page_fonts(0, full=True)
    assert fonts
    report = []
    for item in fonts:
        xref, ext, kind, basefont, name, encoding = item[:6]
        extracted_name, extracted_ext, extracted_type, data = doc.extract_font(xref)
        report.append({"name": basefont, "font_program_present": bool(data),
                       "xref": xref, "encoding": encoding})
    assert report[0]["name"] == "Helvetica"
    assert report[0]["font_program_present"] is False
    assert report[0]["xref"] > 0

Этот тест имеет четкие границы: «поврежденный» или «невстроенный» объект синтетического шрифта не может быть создан в памяти без использования внешнего файла шрифта. Таким образом, этот тест фокусируется на двух вещах: проверке точности синтаксического анализа обычных встроенных шрифтов и защитной обработке функцией недопустимых номеров страниц. Ветки исключений необходимо тестировать индивидуально. Демонстрационный код работает в изолированной среде, но это не является гарантией работоспособности всех реальных файлов или продукта.

Критерии приемки и границы ручной проверки

«Безопасный» или «предупреждающий» вывод кода является лишь техническим сигналом и не может быть напрямую приравнен к возможности перевода. Сценарий может точно сообщить о статусе внедрения, но он не может определить, имеет ли шрифт соответствующий глиф на целевом языке, а также не может оценить, разрешает ли лицензия изменение встраивания. Эти решения должны приниматься людьми в контексте проекта.

Конкретные решения по обработке исключений

наблюдатьчто делатьне следует предполагать
Программа шрифтов пустаЗаписи не загружены для внедренияСсылки на базу 14 — это не то же самое, что вложения
Шрифт ЦзыцзиСохранять маркировку шрифтаУщерб не оценивается напрямую
Список пустПроверьте содержание страницыЭто может быть изображение или другой маршрут рисования

Перед тем как браться за важные документы, пожалуйста, сохраняйте оригиналы и проверяйте их в соответствии с вышеуказанными границами и пунктами принятия.

🎯 Какой способ тебе подходит?

Если вы просто получили PDF для перевода

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

Если результат обнаружения показывает, что программа шрифта пуста

Запишите это и подтвердите содержимое страницы; не предполагайте, что вложение завершено.

Если в документе есть подмножество шрифтов

Оставьте шрифтовые маркировки и воспринимайте их как обычные, а не напрямую оценивайте как ошибки.

Если требуется проверка с реальными документами

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

❓ Часто задаваемые вопросы (FAQ)

1. Означает ли ссылка на шрифт Base14, что шрифт уже встроен?

Нет. Ссылки на шрифты Base14 не означают, что программа для шрифтов встроена; нужно проверить, пусты ли байты шрифта, возвращаемые extract_font.

2. Действительно ли проблема с шрифтом подмножества?

Не обязательно. Шрифты подмножеств не должны быть единородно отмечены как ошибки; просто сохраняйте идентификаторы шрифтов и не оценивайте их напрямую как поврежденные.

3. Если список шрифтов пуст, значит ли это, что проблема со страницей?

Не обязательно. Когда список пуст, сначала проверьте содержимое страницы; страница может быть изображением или другим маршрутом для рисования.

4. Можно ли напрямую использовать «безопасный» результат сценария для принятия решений о переводе?

Нет. Вывод кода является лишь техническим сигналом и не может определить, пригодны ли глифы целевых языков, а также не может оценить, разрешает ли лицензия изменять эмбеддинги.

📝 Краткое содержание

Инвентаризация шрифтов — это фундаментальный этап перед переводом PDF; она помогает оценить редактируемость и стабильность рендеринга документа. После получения файла сначала проверьте шрифт, затем выберите путь, а после перевода проверьте соответствие между заголовками, основным текстом и подписями.

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

Обновлено 2026-11-15