Добавить в корзинуПозвонить
Найти в Дзене
Программы от меня

Как я за неделю написал конвертер PDF в DOCX на C#, а потом понял, что проще было перепечатать руками

Привет, Хабр… ой, то есть Дзен! Сегодня хочу поделиться эпичной историей о том, как я решил написать свой конвертер PDF в Word на C#. Казалось бы: ну что там, закинул библиотеку, пролистал страницы – и готово. Спойлер: ничего готово не было, зато было много слёз, костылей и магии на ровном месте. Однажды мне прислали договор в PDF. А надо было его отредактировать. Сервисы онлайн — «загрузи и получи DOCX за 2 минуты» — выдали файл, в котором вместо таблиц была каша из символов, а шрифты напоминали послание из другого измерения. «Напишу сам!» — подумал я. И правильно сделал, потому что психушка ещё не закрылась на карантин. Итак, задача: берём PDF, отдаём DOCX с сохранением форматирования. Звучит как «взять Луну, покрасить в розовый и доставить на Землю без повреждений». Первая остановка — iTextSharp. Отличная библиотека, но её коммерческое использование стоит как iPhone 15 Pro Max. Вторая — PdfPig. Бесплатно, открыто, но с текстом работает так, будто читает его через запотевшее стекло.
Оглавление

Привет, Хабр… ой, то есть Дзен! Сегодня хочу поделиться эпичной историей о том, как я решил написать свой конвертер PDF в Word на C#. Казалось бы: ну что там, закинул библиотеку, пролистал страницы – и готово. Спойлер: ничего готово не было, зато было много слёз, костылей и магии на ровном месте.

Предыстория, от которой волосы встают дыбом

Однажды мне прислали договор в PDF. А надо было его отредактировать. Сервисы онлайн — «загрузи и получи DOCX за 2 минуты» — выдали файл, в котором вместо таблиц была каша из символов, а шрифты напоминали послание из другого измерения. «Напишу сам!» — подумал я. И правильно сделал, потому что психушка ещё не закрылась на карантин.

Итак, задача: берём PDF, отдаём DOCX с сохранением форматирования. Звучит как «взять Луну, покрасить в розовый и доставить на Землю без повреждений».

Выбор библиотеки: дьявол в деталях (и в лицензиях)

Первая остановка — iTextSharp. Отличная библиотека, но её коммерческое использование стоит как iPhone 15 Pro Max. Вторая — PdfPig. Бесплатно, открыто, но с текстом работает так, будто читает его через запотевшее стекло. Третья — Ghostscript. Могучий зверь, но требует сторонний EXE-файл. Подключать его к C# проекту — всё равно что прикручивать ракетный двигатель к детской коляске.

Остановился на PdfPig + OpenXML (DocumentFormat.OpenXml). Первая вытягивает текст, вторая склеивает docx. Звучит надёжно? Ага, как зонтик из папье-маше.

Техническая реализация: без комментариев, но с комментариями

Вот код, который заставит ваших коллег нервно креститься и звонить HR.

-2

Результат: DOCX файл создаётся! Поздравляю! Текст в нём есть! Но выглядит так, будто его набрала обезьяна с похмелья: колонки поехали, таблицы превратились в лесенку, а картинки потерялись где-то в недрах межгалактического пространства.

-3

Проблемы, о которых умалчивают гуру с ютуба

  1. Форматирование. PDF — это по супери бумажка. В нём нет понятий «абзац», «отступ слева», «жирный шрифт». Там набор символов с абсолютными координатами. Перевести это в стили Word — всё равно что по фотографии торта восстановить рецепт вместе с калориями.
  2. Таблицы. В PDF ячейка может быть нарисована линиями, а текст внутри — сдвинут на 0.2 мм. Программа думает: «А, это просто случайные буквы!» и выводит их подряд. Прощай, бухгалтерская отчётность.
  3. Шрифты. В PDF может быть встроен шрифт «SuperCoolUnderground». В Word его нет. Word подставляет «Comic Sans». Теперь важное письмо выглядит как приглашение на день рождения клоуна.
  4. Скорость работы. Конвертация 50-страничного PDF заняла на моём ноутбуке 4 минуты. За это время можно самому перепечатать полстраницы с нормальным форматированием.

Бонус-трек: как я пытался чинить таблицы

Я написал велосипедный парсер координат. Если несколько строк текста находятся на одной Y-координате — значит, это одна строка. Если встречаются вертикальные линии — пытаемся определить границы колонок. В итоге код разросся до 800 строк, и в нём поселились две криптономикона и один баг, который появлялся только по вторникам после обеда.

В конце я сдался и сделал так:

System.Diagnostics.Process.Start("libreoffice", $"--headless --convert-to docx \"{pdfPath}\"");

Libreoffice сделал конвертацию идеально за 3 секунды. Я заплакал. Потом долго пил чай с печеньками и смотрел в стену.

Мораль этой страшной сказки

  • Не пишите свой конвертер PDF в Word, если вас не пытали огнём и калёным железом.
  • Если очень хочется — используйте готовые движки (LibreOffice, Ghostscript + утилиты) и не страдайте фигнёй.
  • И помните: программист — не тот, кто пишет всё с нуля, а тот, кто умеет найти готовое решение и скормить ему свои данные.

-4

С тех пор я спокойно принимаю PDF как есть. А если нужно отредактировать — иду к секретарю, даю ей 200 рублей и печеньку. Она за полчаса перепечатывает аккуратнее, чем любой мой конвертер. Иногда высокие технологии — это просто высокое мастерство чая и терпения.

Если вам понравилось — поставьте лайк, подпишитесь.