Я написал конвертер PDF

Чтоб не тянуть кота за это самое.

Программа выглядит так
Программа выглядит так

Предыстория

Я достаточно давно был терзаем проблемой массовой конверсии .pdf файлов в картинки.
К сведению читателя - практически все артбуки, посвященные играм или галереям искусства - поставляются в формате .pdf, хотя содержат в себе они только картинки. Причем размер таких файлов зачастую превышает 50 мегабайт.
Доставать изображения из подобных истчников - спорное "удовольствие", которое усугубляется отсутствием локального инструментария под эту задачу.

Сами видите с чем приходится иметь дело.
Сами видите с чем приходится иметь дело.

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

Гитхаб с его множеством бесплатных приложений, тоже, до сего момента, был не слишком полезен. Хотя там мне удалось наскрести одно старенькое приложение, давно никем не поддерживаемое - https://github.com/limingjie/pdf_to_image

Я написал конвертер PDF

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

Я написал конвертер PDF

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

Пройдя девять кругов ада и окончательно исчерпав запасы терпения, я таки вспомнил что программист и могу сам написать подобное. После чего написал, правда вовсе не то, что представляю вам. Я написал обычный c# скрипт с текстовым списком файлов, который работал на честном слове и такой то матери достаточно долго. До нынешнего момента.

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

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

Условия распространения

Если бы в нашей прекрасной стране был доступен мерзкий буржуазный капиталистический стим, возможно, я выставил бы это приложение туда на продажу на смешные 5$, но чего нет, того нет.

Заниматься личным распространением программы и надеяться на единицы клиентов я не собираюсь, какой толк в приложении, если им не пользуются люди?

Я раздам его бесплатно, причем не просто бесплатно, а Вместе с Исходниками по лицензии MIT, которая подразумевает передачу скачавшему полных прав на его копию кода.

Почему так? Все очень и очень просто.

С недавнего момента, к разработчику из России нет доверия не только у иностранных "партнеров", но и у наших собственных людей, то есть вот у вас, у читателей. Вспомнить тот-же мессенджер ... Max, кажется, да?

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

Очевидно, что скачивать непонятный .exe, от какого-то там интернетного aftamat4ik'а в 2025 году не станет никто, даже столкнувшись с той-же самой проблемой.

Я так-же осознаю, что, мои клятвенные заверения в отсутствии злых намерений и вообще сетевых вызовов внутри приложения никого не убедят, меня бы не убедили. Слова это всегда слова, даже если написаны красиво или красиво и на бумаге.

И что делать? Да все просто. Я дам вам исходники и инструкцию как собрать приложение самостоятельно с минимальными усилиями.

Я покажу вам что делать, какие классы и функции за что отвечают, как проходит конверсия и как работают системы. Благо программа очень простая. Даже студент университета, на первом курсе, с легкостью сможет понять как работать с представленным кодом. А может он даже сможет поднять собственные навыки научившись у старого уставшего дядьки (меня).

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

Поэтому, куда полезнее будет передать знания другим людям, вдруг, используя эти знания они сделают что-то по лучше.

Согласно данным git'a полная разработка заняла у меня с 5 по 13 число - 8 дней.

скриншот истории гит коммитов
скриншот истории гит коммитов

Скачать код и приложение

Чтобы не душить вас длинным описанием возможностей, сразу приложу ссылку на скачивание кода и бинарников.

Во первых с гитхаба - https://github.com/aftamat4ik/PDFToImage Страница релизов - https://github.com/aftamat4ik/PDFToImage/releases

Во вторых с Яндекс Диска, на всякий случай:

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

К тому-же, я не требую вашего доверия. Вы всегда можете скачать исходники и скомпилировать их самостоятельно, используя Visual Studio Code.

Лицензия позволяет вам даже издавать собственные версии этого приложения.

В написанном мной приложении нет проверки обновлений. И не будет никогда. В приложении нет сетевых функций и не будет никогда.

Технические детали

Приложение написано на .net core 8.0 и использует кроссплатформенные библиотеки: Avalonia, Skia Sharp и PDF Pig.

Теоретически, приложение должно работать под Linux и даже MacOs. Если это не так, вы всегда можете скачать исходники и скомпилировать их самостоятельно, используя Visual Studio Code.

Для работы приложения требуется .net framework 8.0 или выше. У большинства из вас он уже установлен, потому что многие современные игры его используют и, соответственно, стим его вам предустанавливает в качестве вспомогательного по. Если у вас фреймворка нет - вы можете легко скачать его с официального сайта, благо весит он всего 200 мегабайт, примерно, или даже меньше (рунтайм и вовсе весит 27 мегабайт всего-лишь).
Если вы хотите править и компилировать код, то вам нужен именно SDK.

Я написал конвертер PDF

Как работать с кодом?

Лучше всего для разработки использовать Visual Studio Community Edition с установленным на нее плагином для Avalonia.

Вот как это выглядит.
Вот как это выглядит.

Однако, я отлично понимаю что ставить целую много-гигабайтную Visual Studio на свой компьютер ради мелкой программки - плохая идея.

К тому-же, у большинства из вас, наверняка, есть Visual Studio Code. С этим редактором все просто. Я заранее написал для вас launch.json скрипт и скрипт с набором требуемых расширений (без них тоже должно компилироваться).

Открываете папку со скачанными исходниками в VsCode, идете в "Run and Debug" и там, в выпадающем меню - "Debug PDF Converter".

Я написал конвертер PDF

Это позволит запустить отладку приложения.

Запущенное приложение внутри Visual Studio Code.
Запущенное приложение внутри Visual Studio Code.

Возможности приложения

Тут начинается духота.

Конвертер представляет собой примитивное окно, со списком файлов слева и настройками справа.

Я написал конвертер PDF

Для добавления файлов в конвертер используется кнопка "Добавить", вот так сюрприз.

Диалог выбора файлов достаточно стандартный и удобный.

Я написал конвертер PDF

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

После добавления файлов в список - кнопка "Конвертировать" станет активной.

Я написал конвертер PDF

Нажав на нее вы запустите процесс конверсии. Перед этим давайте рассмотрим настройки конверсии.

Параметр "Количество Потоков" отвечает за число файлов, которое будет конвертироваться единовременно. Не советую ставить высокие значения из-за нагрузки на жесткий диск.

Если файлов в списке меньше чем количество потоков, у нас файлов 2, то потока будет всего два, по одному на каждый файл.

Параметр "Качество" отвечает за качество итогового изображения. Чем он выше - тем больше весит папка с результатами конверсии. Для 99% случаев дефолтного значения хватает.

Параметр "Формат" куда интереснее. Конвертер поддерживает три формата - `webp`, `png`, `jpg`.

Я написал конвертер PDF

`Webp` - это современный формат сжатия изображений, который поддерживает опцию "сжатие без потерь", которая по умолчанию отключена. Этот формат очень компактный, примерно на 30% эффективнее чем `jpg`, однако, он поддерживается не всеми просмотрщиками картинок. Из-за компактности и эффективности сжатия я, в основном, использую именно этот формат, но если вам не надо - есть два других.

Параметры "Макс. Ширина" и "Макс Высота" отвечают за максимальное разрешение результирующих изображений. При этом, обратите внимание - если итоговое изображение уже имеет меньшее разрешение - его не расширит, это именно максимальные лимиты. Для наглядности давайте я покажу код.

Я написал конвертер PDF

Как вы видите изображение не масштабируется если хотя-бы один из параметров (ширина или высота) меньше чем максимальные значения. Если же ширина и высота картинки выше максимальных - картинка масштабируется.

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

Для удаления проследуйте в файл "\ViewModels\MainWindowViewModel.cs" и найдите там следующую строчку.

Я написал конвертер PDF

Конвертер поддерживает работу с PDF файлами, которые закрыты паролем, для этого список паролей надо указать в соответствующее поле - "Пароли PDF". Система их автоматически подхватит и использует.

Для примера на одном из тестовых файлов у меня стоит самый очевидный пароль. Если я попытаюсь конвертировать этот файл без пароля - система выдаст ошибку в лог.

Ошибка из-за отсутствия пароля.
Ошибка из-за отсутствия пароля.

Если же я укажу пароль - конверсия пройдет успешно.

Я написал конвертер PDF

Как вы видите, в конце лога выводится директория, в которую программа записала данные.

Эта директория находится прямо в самой папке приложения и называется она "Output". Внутри нее генерируются под-директории с timestamp, чтобы пользователь мог отличить разные конверсии друг от друга.

Я написал конвертер PDF
результаты
результаты

Открыть текущую папку вывода можно очень легко кнопкой "Открыть Папку".

Я написал конвертер PDF

Я надеюсь, логика открытия папки будет работать на других платформах, кроме Windows. Однако, проверить этого сам не могу. Напишите в комментариях.

Код открытия папки можно найти в файле `\Helpers.cs`

Код открытия папки выглядит так.
Код открытия папки выглядит так.

Согласно клятвенным заверениям аж целых трех нейросетей команда "xdg-open" должна открыть просмотрщик файлов даже под linux из-за чего-то там стандартизированного. Перед публикацией статьи я постараюсь спросить об этом у своего знакомого.

Сам я linux не имею ибо занимаюсь разработкой игр.

Конвертер из коробки имеет локализацию на три языка (спасибо современным нейросетям) - это Русский, Английский и Немецкий. Для изменения языка надо поменять параметр locale в файле "settings.ini".

Я написал конвертер PDF

Сами настройки языка добавлены в систему крайне колхозным образом - через обычный вложенный словарь и выглядят они так:

Я написал конвертер PDF

В Xaml все это дело выводится в виде привязок.

Я написал конвертер PDF

Ядро конвертера - файл "\Models\OutputFormats.cs" именно тут происходит обработка изображений и работа с форматами.
За это отвечают классы, унаследованные от интерфейса "IOutputFormat".

пример формата webp
пример формата webp

Если приведенных по умолчанию форматов вам не достаточно - вы можете указать собственный, унаследовав его по этому же паттерну.
Однако, в системе нет автоматической детекции реализаций классов (ее можно написать через сканирование Assembly, но я не стал, ибо счел подход не надежным).
Экземпляры конвертеров надо указывать вручную в конструкторе класса "ViewModels\MainWindowViewModel.cs".

Я написал конвертер PDF

Если все сделано правильно - соответствующий пункт автоматически появится в интерфейсе.

Заключение

На этом у меня все. Надеюсь программа вам понравится и вы найдете применение ей и моему коду. Не забывайте, что автор живет в деревне и ему надо готовиться к долгой холодной зиме, которая, как все мы знаем - БЛИЗКО.

Поддержать меня можно тут - https://boosty.to/aftamat4ik

Если людям понравится, через пару дней, я опубликую второе приложение на той-же базе.

Так-же я постараюсь записать для вас видео с живой инструкцией, показыающей, как всем пользоваться.
Видео я записал, посмотреть можно на бусти:

Или на Рутубе:

10
3
2
1
13 комментариев