S
SaaS Founders
@saas_founders1.5K подп.
1.5Kпросмотров
98.1%от подписчиков
12 декабря 2025 г.
question📷 ФотоScore: 1.6K
Как задачка на 15 минут превращается в издевательство над AI агентами, на 4 часа? Ситуация: требуется переделать секцию “Billed To” в 7 тысячах pdf инвойсов на новую компанию. Инвойсы сгенерированы в SaaS сервисе, это не картинка воткнутая в пдфку, а нормальные векторные шрифты, все инвойсы по одному шаблону и очень похожи друг на друга, но есть нюанс - высота шапки у всех разная (потому что разные контрагенты в "Billed From" указывают разное количество данных и у них разные логотипы по высоте). Claude Code бодро попытался использовать самый очевидный способ - использовал консольные утилиты типа pdftk и замену строк через sed. Не сработало - новый текст, внедренный на место старого, обрезался визуально (PDF очень сложный формат - мешанина картинок, шрифтов, форматирования, тексты все "заархивированы"). Я подсказал использовать convert (imagemagick) через CLI для визуального контроля результатов подмены (когда pdf страничка конвертится в png и изучается уже самой ллмкой). В третьей итерации Claude попытался написать низкоуровневый nodejs код который декодирует (uncompress) PDF и заменяет HEX символы, по словам. На двух строках из адреса работает, на третьей - строчка обрезается визуально из-за особенностей верстки. В итоге CC сдался и превысил лимиты тарифного плана за $20/mo примерно через час мучений и подсказок. Переходим в Gemini CLI. Предлагаю попробовать вариант с работой PDF как с картинкой - нарисуем оверлей и сверху новый текст. В принципе, оно сработало на 75% инвойсов, но увы - на 25% из-за смещения по вертикали самой секции - часть старого адреса не перекрывалась надежно, или наоборот перекрывала основную часть инвойса. Проверять результаты пришлось кожаному мне - у Gemini CLI оказалось все плохо с визуальным контролем нюансов скриншотов, она совершенно не понимала что мне не нравится в торчащем на скриншоте старом адресе, на который был криво “наляпан" новый адрес сверху. У Клода Sonnet 4.5 тоже с пониманием было не все гладко, но, кажется, получше. Конечно, если бы у меня было 100 инвойсов, или 500, я бы плюнул и сделал бы все через чистый OCR подход - конвертим PDF в PNG, находим координаты bounding box для нужной секции в инвойсе - не очень сложно. Но, блин, для 7к файлов это очень много процессорного времени и денег! Решил попробовать следующий вариант - вырезал кусочек с текстом "Billed To" из инвойса, в .png формате, предложил скриптом искать координаты вхождения этой картинки в картинке страницы инвойса. Gemini попыхтел на тестовой выборке, почему-то ничего не нашел - видимо, из-за разностей рендеринга в разных DPI. Тут уже наступила ночь, и я уже совсем не вчитывался в генерируемый код, хотелось просто уже запустить скрипт и пойти спать. Я уже был близок к совершенно чудовищному способу решения задачи - отконвертировать PDF -> HTML, заменить строчки, отрендерить новый PDF. Но это было бы долго, и скучно, и была вероятность поломать неочевидные вещи в визуале инвойсов. И итоге победил Cursor и GPT 5.1 Codex Max. У него получилось найти слова "Billed" и "To" в сорсах пдфки, и вытащить их координаты. Потом пересчитать "пункты" этих векторных координат в пиксельные координаты, и наложить новый сгенерированный кусок в правильное месте в PNG картинке. Дальше сделать новый PDF - уже растеризованный. Написали с ним тестовый скрипт, который берет десяток рандомных пдфок и проверяет, что наложение корректно рассчитывается. Такой гибридный подход (детектим координаты по тексту пдфки без вовлечения тяжелых ocr решений, а рисуем уже как на картинке) позволил добиться приемлемой скорости и 100% успеха на всех 7к инвойсах - Макбук перерисовал их примерно за 10 часов скриптом работающим в три потока. Думаю, подход с OCR занял бы в 10 раз больше ресурсов и времени. Оптимальный ли это вариант? Сомневаюсь, но он неплохо сработал.
1.5K
просмотров
3816
символов
Нет
эмодзи
Да
медиа

Другие посты @saas_founders

Все посты канала →
Как задачка на 15 минут превращается в издевательство над AI — @saas_founders | PostSniper