Как перевести документ из ПДФ в XML: маршрут экспорта в Acrobat, проверка полей и разница между читаемой разметкой и файлом для конкретной загрузки.
Денис
Продакт LibraChat
8 мин чтения
Чтобы перевести PDF в XML, в Acrobat открой Convert → Other format → XML 1.0, настрой экспорт и сохрани результат. Но для загрузки в другую программу этого может оказаться мало. Файл с расширением .xml ещё должен содержать те поля и связи, которые ждёт получатель.
Если ищешь, как перевести документ из ПДФ в хмл, сначала уточни написание: здесь речь об XML. HTML для веб-страниц — другой формат. Ниже разберу маршрут экспорта и четыре допущения, из-за которых легко получить читаемый файл, не подходящий для нужной загрузки.
Для проверки возьму условную карточку любительского каталога: код M001, название «Кружка & блюдце», год 1928, материал «фарфор». Все данные вымышлены. По ним удобно проследить одну запись, прежде чем браться за весь документ.
Как перевести документ из ПДФ в хмл: переименования недостаточно
Первая мысль — заменить окончание имени файла. Но содержимое от этого останется прежним. Программа, ожидающая XML-разметку, не получит её только потому, что в имени вместо .pdf появилось .xml.
В актуальной справке Adobe указан следующий маршрут для Acrobat:
Это маршрут из документации, а не результат моего испытания конкретной версии приложения. Если в твоём интерфейсе нужного пункта нет, проверь доступные функции установленного Acrobat. Наличие программы для чтения PDF само по себе не подтверждает наличие нужного экспорта.
В настройках Adobe перечисляет кодировку, создание структурных тегов и параметры изображений. Для большинства задач предлагается UTF-8. Если выбираешь её, фактическая кодировка сохранённого текста должна ей соответствовать. Одна надпись в начале файла не перекодирует его содержимое.
Опции добавления структуры тоже не знают устройство твоего каталога. Они могут помочь перенести структуру документа, но сами не определяют, что конкретная строка означает инвентарный номер. Поэтому я сразу разделяю два результата: экспорт документа и подготовку записей для программы-получателя.
Исходный PDF оставь отдельно. При следующей правке понадобится увидеть, что было напечатано в карточке, а не только то, как это прочитал экспортёр. Различимые имена исходника и результата помогут не перепутать их при повторном проходе.
«Любой XML подойдёт для моей программы»
XML задаёт способ записи структуры. Названия полей и смысл связей определяет конкретная задача. У одной программы название предмета будет элементом title, у другой — атрибутом name. Самостоятельно угадать это по красивому виду карточки нельзя.
Я сначала прошу у получателя образец, описание формата или схему XSD, если она предусмотрена. Затем составляю карту полей. Для нашего вымышленного каталога договоримся о четырёх значениях:
Поле условного каталога · Значение из карточки · Что проверяю
Идентификатор — M001 — Буква и нули сохранены
Название — Кружка & блюдце — Две части относятся к одному предмету
Год — 1928 — Это год предмета, а не дата составления карточки
Материал — фарфор — Значение не попало в название соседней записи
Это наши условия примера, а не универсальная схема музейных данных. В реальном импорте могут потребоваться другие имена, дополнительные поля, пространства имён или определённый порядок элементов. Такие требования берутся у получателя.
Вот написанный вручную учебный XML, который соответствует только выбранной выше простой структуре:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<artifact id="M001">
<title>Кружка & блюдце</title>
<year>1928</year>
<material>фарфор</material>
</artifact>
</catalog>
```
Это не вывод Acrobat и не ответ LibraChat. Я показываю, как можно связать одну запись с её полями. Корневой элемент catalog содержит карточку artifact; её код записан в атрибуте id. Год и материал относятся к той же карточке, потому что находятся внутри неё.
В обычном текстовом содержимом знак амперсанда записан как `&`. При чтении XML он представляет исходный символ &, а не становится частью названия из пяти печатных знаков. Такие правила разметки нужно учитывать отдельно от проверки смысла.
«Раз текст выделяется, значения можно не сверять»
Выделяемый текст удобен для дальнейшей работы, но ещё не доказывает правильного распределения по полям. На странице могут быть две колонки, подпись под изображением и повторяющийся колонтитул. Нужно проверить, откуда взялось каждое значение.
В нашем примере я начинаю с M001. Если превратить его в число 1, программа может потерять не просто оформление, а сам идентификатор. Код нужно рассматривать как обозначение, даже когда он содержит цифры.
Потом смотрю на год. Рядом с предметом может стоять дата подготовки карточки. Оба значения похожи на корректные годы, поэтому обычная проверка «здесь четыре цифры» не заметит подмену. Нужна связь с подписью в исходнике.
Название тоже проверяю целиком. Если «блюдце» перенесено на следующую строку, оно не становится новым предметом автоматически. Но и объединять соседние строки без просмотра нельзя: там действительно может начинаться другая карточка.
Для скана сначала потребуется получить распознаваемый текст. Правильное расширение результата не исправит неверно распознанный символ. Подробнее этот участок разобран в материале о переводе PDF в текст. Для дальнейшей разметки всё равно нужен контроль по изображению исходной страницы.
Я выбираю для первой проверки не самую пустую карточку, а запись с особенностью: переносом названия, буквой в коде или специальным символом. Так можно раньше увидеть слабое место выбранного пути. Проверка одной карточки помогает настроить процесс, но не подтверждает автоматически весь документ.
Если в карточке нет нужного значения
Допустим, принимающая программа требует материал, а в исходной карточке он не указан. Мне легко догадаться по названию или картинке, но такая догадка не становится перенесёнными данными. Я отмечаю отсутствие и выясняю, можно ли оставить поле пустым. Если нельзя, вопрос возвращается владельцу каталога, а не решается случайным словом.
Так же поступаю с неоднозначным годом. Если напечатано «около 1928», простое удаление уточнения может изменить смысл. Для условного приёмника, допускающего только точный год, потребуется согласованное правило: отдельное поле примечания, разрешённый способ записи приблизительной даты или отказ от переноса до уточнения. Не стоит молча делать приблизительное значение точным.
Наконец, я сохраняю связь записи с исходной страницей в рабочей таблице сверки. Это помогает вернуться к сомнительному месту после сообщения об ошибке. Такой указатель не обязательно отправлять в конечный XML: состав передаваемых полей всё равно определяют требования получателя.
После первой карточки проверяю ещё одну с другой разметкой. Если заголовок там расположен сбоку, прежнее правило выделения полей может потребовать исправления. Массовый перенос начинаю после выяснения этих различий, а не после первого удачно открывшегося файла.
«Файл открылся — значит, загрузка готова»
Здесь я делаю три отдельных прохода. Сначала проверяю XML-синтаксис: закрыты ли элементы, правильно ли они вложены, читается ли кодировка. Затем сверяю требования получателя. После этого проверяю сами значения по PDF.
Это разные вопросы. Можно написать синтаксически корректный элемент year и случайно положить в него дату составления документа. Можно сохранить правильный год, но назвать поле так, что программа его не узнает. Один вид проверки не заменяет остальные.
Перед передачей записи я отмечаю:
Сколько карточек было в выбранном фрагменте и сколько получилось записей.
Сохранились ли коды вместе с буквами и ведущими нулями.
Каждое ли значение относится к своему предмету.
Нет ли заголовков страницы среди значений материала или названия.
Соответствует ли структура описанию принимающей программы.
Есть ли результат её собственной проверки или пробного импорта.
Пробную загрузку делай там, где можно безопасно проверить отдельную запись по правилам получателя. Не стоит считать неизвестную производственную систему учебным полигоном. Если предусмотрен отчёт об ошибках, сохрани его и разбери конкретные строки до повторной передачи.
Сопоставь обезличенную карточку [текст] с описанием полей [требования]. Выпиши значение и подтверждающий фрагмент рядом. Сохрани буквенные коды и нули. Если значение не указано или его смысл неясен, оставь вопрос. Не выдумывай недостающие сведения и не утверждай, что получатель уже принял файл.
Это предлагаемое поручение для текстового разбора. Оно не заменяет XML-проверку, схему или импорт и не обещает фактически созданный файл. Если предстоит много таких разборов, сравни условия использования LibraChat со своим объёмом, прежде чем выбирать рабочий порядок.
В конце вернись к нашей одной карточке. Найди M001 в исходнике, в разметке и в результате пробного чтения получателем. Затем сверь название, год и материал. Иногда подходящий XML приходится собирать после экспорта по правилам конкретной программы. Успех здесь определяется сохранённой записью, а не новым окончанием имени.