Формат хмл: как сделать из PDF данные для загрузки
Формат хмл: как сделать из PDF данные по требованиям получателя, подготовить черновик с LibraChat и проверить XML, не перепутав чтение файла с приёмкой.
Денис
Продакт LibraChat
9 мин чтения
В PDF со списком прогулок всё помещалось на странице: названия, коды и продолжительность. Я уже собирался отправлять его дальше, когда в требованиях увидел XML. Первой мыслью было найти конвертер и закончить. Но для программы важны имена полей, а не аккуратные колонки. Запрос «формат хмл как сделать из pdf» сначала пришлось превратить в другой вопрос: какие данные должен получить адресат?
После этого задача стала определённее. Нужно достать значения из доступного текста, разложить их по нужным полям и проверить полученный файл. LibraChat может помочь с разбором документа и черновиком кода. Сам формат не подскажет, как устроена система получателя: её требования придётся получить отдельно.
Зачем нужен XML, если PDF уже можно прочитать?
PDF удобен, когда важен вид документа: где стоит заголовок, как расположена таблица, что увидит человек при открытии. В XML данные помечены именами элементов. Программа может искать продолжительность в поле `minutes`, а не угадывать, какое число под названием прогулки относится ко времени.
Но слово XML не определяет эти имена за тебя. Один получатель ждёт `minutes`, другой — `duration`, третий описал совсем другую вложенность. Оба первых названия могут встретиться в корректном XML, однако конкретная программа не обязана считать их одним полем.
У меня это различие проявилось на обычной записи «Река & город — 90 минут». Человеку достаточно прочитать строку. Для обмена надо решить, какое здесь название, где число и означает ли оно минуты. Если значение времени подписано только в заголовке PDF, при переносе подпись легко потерять.
Поэтому переименование файла не помогает. Если заменить у PDF окончание на `.xml`, внутреннее содержимое останется прежним. Точно так же фото таблицы не становится таблицей с ячейками от нового названия. Менять нужно представление данных, а не подпись файла.
Формат хмл: как сделать из PDF то, что ждёт получатель?
У задачи «формат хмл как сделать из pdf» нет одного подходящего всем файла. Здесь нужна структура получателя. Я бы попросил не ещё один снимок экрана с ошибкой, а описание нужного файла: имена полей, обязательные значения и пример, который принимается системой. Если есть XSD, это схема с правилами для XML: какие элементы допускаются, как они связаны и что может стоять внутри.
Схему не обязательно читать как программист. Полезнее задать адресату предметные вопросы:
Какой вид документа и какая версия формата нужны?
Есть ли актуальная схема либо заполненный пример именно для этой загрузки?
Какие поля обязательны и откуда брать значения, которых нет в PDF?
Чем проверить файл перед отправкой и как выглядит подтверждение приёма?
Один принятый пример помогает разобраться, но не описывает все допустимые случаи. Например, в нём может быть одна прогулка, хотя в твоём документе их несколько. Не копируй молча количество записей: спроси, как повторяется нужный блок.
Для собственного обмена тоже нужен договорённый вид данных. Можно придумать короткую структуру вместе с получателем. Я так и сделал для разбора списка прогулок: общий блок `walks`, внутри повторяющиеся `walk`, у каждой записи код, название и минуты. Это пример устройства файла, а не формат какого-либо внешнего сервиса.
Что сначала перенести из страниц в поля?
Сначала составь маленькую таблицу соответствия. Я собрал для примера две записи и отдельно выписал, что значит каждое значение. До появления угловых скобок уже можно обнаружить большую часть вопросов к исходнику.
Сведения в PDF · Значение в нашем примере · Место в XML · Что сверить при переносе
Код первой прогулки — W01 — Атрибут `code` у `walk` — Не превратить код в порядковый номер
Название первой прогулки — Река & город — Элемент `title` — Сохранить название после технической записи знака `&`
Продолжительность первой прогулки — 90 минут — Элемент `minutes` — Перенести число в согласованных единицах
Код второй прогулки — W02 — Следующий блок `walk` — Не потерять всю запись из-за разрыва страницы
Название и время второй — Старый парк, 60 минут — `title` и `minutes` — Не соединить время с предыдущим названием
Для начала достаточно участка PDF, где текст доступен для копирования. Скопируй название и соседнее значение, затем сравни с тем, что видишь на странице. Такая проверка относится к выбранному участку. Она ещё не подтверждает, что весь документ извлечётся одинаково: на другой странице может быть рисунок, иная таблица или примечание.
Если вместо текста есть только скан, задача начинается с распознавания. Не рассчитывай на чтение сканированного PDF в LibraChat как на подтверждённую возможность. Получи текст доступным тебе способом или попроси исходный документ. Для заполнения официального формата не угадывай неразборчивое число по похожим записям.
Пропуски я оставляю вопросами. Разобрать их нужно с владельцем исходных сведений. Если в строке отсутствует продолжительность, значение `0` уже будет утверждением, а не пустотой. У принимающей программы может быть отдельное обозначение отсутствия данных — его и нужно выяснить.
Как попросить LibraChat помочь с таким переносом?
В LibraChat можно прикрепить документ и задать вопросы о его содержимом. Для этой задачи я сначала прошу выделить поля в ответе, а уже после сверки составляю задание на XML. Так удобнее найти неверную связь между названием и временем до того, как она спрячется среди тегов.
Попробуй перенести небольшой участок своего документа с таким заданием:
Разбери приложенный PDF для переноса данных в XML. Нужные поля и их значение: [перечень]. Сначала покажи извлечённые записи таблицей и укажи, где они находятся в документе. Неуверенно прочитанные значения вынеси отдельно, чтобы я проверил их по странице. После моего подтверждения подготовь текст XML по приложенному описанию структуры. Названия элементов бери из этого описания; недостающие сведения преврати в вопросы ко мне.
В следующем сообщении можно дать схему или согласованный образец. Просьба «сделай правильный XML» без них оставляет слишком много решений на стороне чата. Получится какой-то XML, но слово «правильный» в задаче так и не будет определено.
Если требования составляют большой пакет документов, начни с того фрагмента, который относится к твоему виду загрузки. Нужны действующие правила полей, а не все похожие образцы из переписки. Само извлечение текста подробнее разобрано в материале о работе нейросети с PDF.
При таком порядке LibraChat помогает разобраться и подготовить черновик. Это ещё не приёмка. Подтверждение нужно получить там, куда данные действительно загружаются.
Как выглядят данные после переноса в XML?
Для своего небольшого списка я написал такой фрагмент:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<walks>
<walk code="W01">
<title>Река & город</title>
<minutes>90</minutes>
</walk>
<walk code="W02">
<title>Старый парк</title>
<minutes>60</minutes>
</walk>
</walks>
```
Весь список находится внутри `walks`. Каждый блок `walk` описывает отдельную прогулку. Значение кода записано рядом с именем блока, а название и продолжительность — внутри. Если в требованиях адресата устроено иначе, менять нужно этот каркас. Переводить имена тегов по своему вкусу не стоит.
У названия «Река & город» появилась техническая запись `&`. В содержимом XML амперсанд имеет специальную роль; для обычного знака в тексте здесь нужна такая запись. При чтении парсер восстанавливает исходное название. Это не переименование прогулки.
Я проверил именно приведённый авторский фрагмент стандартным парсером Python `xml.etree.ElementTree`. Он прочитал обе записи, а первое название получилось с обычным `&`. Затем я подставил в текст неэкранированный знак: разбор завершился `ParseError`. Эта проверка выполнена локально; она показывает работу фрагмента, а не результат запроса в LibraChat.
Если парсер прочитал файл, его уже можно отправлять?
Для ответственной загрузки этого мало. Парсер проверяет, что XML можно разобрать. Он не знает, сколько прогулок было в PDF и какие поля ожидает твой адресат, если такая проверка отдельно не задана.
Я убрал вторую прогулку. Затем снова разобрал текст. Парсер принял сокращённый вариант. Осталась одна запись. В исходном списке их две. С точки зрения записи XML всё читалось, с точки зрения исходного списка данные были неполными.
Поэтому перед отправкой проверь разные вещи:
читается ли XML парсером без синтаксической ошибки;
соблюдает ли он актуальную схему и правила получателя;
совпадают ли записи и значения с исходными сведениями;
приняла ли его целевая система и что написано в её результате обработки.
Если загрузка сообщает о неверном поле, разбирать нужно название поля, ожидаемое значение и версию схемы. Новый прогон через случайный конвертер может убрать сообщение, но вместе с ним изменить данные. Для начала сохрани исходник и текст ошибки, затем исправляй названную причину.
Формат хмл: как сделать из PDF последнюю версию без путаницы?
Если XML пока находится в ответе чата, открой редактор обычного текста. Скопируй только разметку. Служебные строки с тройными обратными кавычками из оформления блока не переноси. Сохрани файл, например `walks.xml`, в кодировке UTF-8: именно она указана в первой строке нашего примера. Проверь полное имя, чтобы за окончанием `.xml` не пряталось ещё `.txt`.
Форматированный документ Word для этого шага не подходит: нужен текст XML, а не файл с оформлением страницы. Открой сохранённый вариант текстовым редактором и убедись, что в нём те же теги и значения. Затем запускай проверку файла, а не только фрагмента, который оставался в окне чата.
Я храню рядом исходный PDF, описание нужной структуры и XML, который готовлю к отправке. После правки проверяю именно последний файл. Иначе легко убедиться, что вчерашняя версия читалась, а отправить сегодняшнюю с потерянной записью.
Если перечень прогулок вырастет до большого PDF, заранее сверь доступные условия LibraChat для работы с файлами. Но первый шаг не требует выбирать тариф: попроси адресата прислать описание принимаемого XML. Когда в ответе есть нужные поля и образец, превращение PDF в данные становится конкретной работой, которую можно проверить.