Создание приложения для разделения PDF файла используя appJar

Недавно мне нужно было взять несколько страниц из PDF файла и сохранить их в новом PDF файле. Это простая задача, но делая её каждый раз, у меня уходит время на определение нужных параметров командной строки, что бы процесс пошел. Кроме этого, моим коллегам нужна была аналогичная функциональность. Так как им не очень удобно работать в командной строке, я решил создать небольшой графический интерфейс, чтобы решить эту проблему.

Одно из решений – использовать Gooey. Это действительно хороший вариант. Однако, я хочу попробовать воспользоваться другой библиотекой. Мой выбор пал на appJar. В этой статье мы пройдемся по примерам использования appJar для создания графического интерфейса, который позволяет пользователю:

  1. Выбирать PDF файл;
  2. Выделять одну или несколько страниц;
  3. Сохранять их в новом файле.

Такой подход простой, эффективный и показывает, как можно интегрировать графический интерфейс в то или иное приложение Python, над которым вы работаете.

Выбор графического интерфейса в Python

Один из базовых вопросов, возникающих в сабреддите Pyhton, это что-то в духе: «Какой графический интерфейс лучше всего использовать?». На самом деле, вариантов очень много, но для освоения большей части интерфейсов нужно много времени усилий. Кроме этого, одни из них работают только на определенных платформах, другие временно не работают. Так что не так уж и просто ответить на этот вопрос.

Есть вопросы по Python?

На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!

Telegram Чат & Канал

Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!

Паблик VK

Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!

Доступны следующие категории графических интерфейсов для высокого уровня:

  • PyQt;
  • wxPython;
  • Tkinter;
  • PyCairo;
  • Пользовательские библиотеки (Kivy, Toga, и т.д.);
  • Варианты на базе веб-технологий (HTML, Chrome).

В довесок к этой экосистеме, существует несколько типов оболочек и вспомогательных приложений, упрощающих проведение разработки. Например: Gooey — отличный способ использовать argparse для создания пользовательского интерфейса wxPython совершенно бесплатно. Лично у меня было много хороших примеров использования данного подхода, позволяющего конечному пользователю взаимодействовать с моими скриптами Python. Настоятельно рекомендую. Особенно с тех пор, как wxPython стал работать только на Python 3.

Недостаток Gooey в том, что возможность создавать приложение вне «полномочий» Goeey ограничена. Мне хотелось найти что-то, что отвечает следующим требованиям:

  • Легко использовать для создания быстрого и грязного скрипта;
  • Предоставляет больше возможностей для взаимодействий, чем это делает командная строка;
  • Работает и подходит для Windows;
  • Простая установка;
  • Активно поддерживается;
  • Быстро запускается;
  • Возможность также работать и на Linux – определенно плюс;

В конечном счете, я пришел к выводу, что appJar соответствует всем моим требованиям.

Что такое appJar?

appJar был разработан преподавателем, которому нужно было упростить процесс разработки пользовательского интерфейса для его студентов. Приложение предоставляет оболочку вокруг Tkinter (стоит по умолчанию в Python), и заметно упрощает шаблон при разработке приложения.

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

Перед тем как дальше углубимся в вопрос, я хочу уделить немного времени Tkinter. Я знаю, что у Tkinter немного подорванная репутация, во многом из-за его несовременности. Однако, с обновленными темами ttk он стал выглядеть лучше. Кроме этого, я думаю, что итоговое приложение хорошо работает на Windows.

В контексте Linux все не так гладко, но приложение действительно работает. В конце концов, данная статья должна помочь вам создать быстрые и эффективные решения для выполнения работы. Если вы ищете безукоризненный пользовательский интерфейс, идеально работающий с вашей ОС, вам могут понадобиться более функциональные варианты. Если вы ищете что-то, что работает быстро – стоит задуматься о appJar.

Чтобы понять, как это выглядит, вот пример рабочего приложения под Windows:

Создание приложения для разделения PDF файла используя appJar

Выглядит вполне ничего себе, на мой взгляд.

Решение Проблемы

Суть данной программы – создать быстрый и простой способ взять подмножество страниц из PDF файла и сохранить его в новый файл. Существует множество программ для Windows, в которых можно проводить данную операцию. Но я обнаружил, что эти «бесплатные» программы включают в себя кучу рекламы, и прочие «полезные» компоненты. Командная строка также работает, но пользовательский интерфейс намного проще, особенно при навигации в куче путей к файлам, или, пытаясь объяснить принцип работы неопытному пользователю.

Чтобы проводить манипуляции с PDF файлом, я использую библиотеку pypdf2. Этот набор инструментов для работы в PDF разработан уже давно и на первый взгляд выглядит немного сложным, но популярность этой библиотеки резко подпрыгнула на github. Еще один приятный аспект — PyPDF2 завернут в Automate The Boring Stuff, так что существует множество дополнительных примеров работы в данной библиотеке.

Начнем с простого скрипта, в который входят сложный ввод, вывод и ранжирование страниц.

Далее, мы утверждаем объекты PdfFileWriter и PdfFileReader и создаем файл Output.pdf:

Самая сложная часть в этом коде, это разделение page_range на последовательный список Python или страниц для извлечения.

Stack Overflow в помощь!

Последний шаг, это копирование страницы из входа и её сохранение в выходе:

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

Создание пользовательского интерфейса appJar

Теперь мы можем перейти к интеграции описанного выше куска кода с пользовательским интерфейсом, который будет:

  • Давать возможность пользователю выбирать PDF файл при помощи стандартного файлового проводника;
  • Выбирать каталог вывода и имя файла;
  • Вводить собственный диапазон для извлечения страниц;
  • Наличие проверки ошибок, чтобы удостовериться, что пользователь ввел правильные данные;

Для начала, нам нужно установить appJar при помощи:

Мы сможем приступить к написанию кода после импорта следующих компонентов:

Далее, мы можем создать базовое приложение пользовательского интерфейса:

Первые три строчки устанавливают базовую структуру приложения. Я решил установить useTtk=True, потому что с таким параметром, приложение выглядит немного лучше. Недостаток в том, что Ttj все еще в стадии бета, но, на мой взгляд, он отлично подойдет для этого приложения.

Для этой статьи я также решил установить тему по умолчанию. В системе Windows я поставил тему Vista, которая выглядит лучше, на мой взгляд.

Если вы хотите ознакомиться с полным списком доступных в системе тем, используйте app.getTtkThemes() и поэкспериментируйте с параметрами. Далее вы можете ознакомиться с тем, как по разному выглядят темы на Windows и Ubuntu.

Создание приложения для разделения PDF файла используя appJar

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

Следующий шаг: добавим ярлыки и виджеты ввода данных:

Для этого приложения я выбираю вызов Label, а затем Entry. appJar также поддерживает комбинированный виджет, под названием LabelEntry, который размещает все в одной строке. По моему опыту, выбор сводится к аскетам, так что попробуйте разные варианты, и определите, какой лучше подходит для вашего приложения.

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

Следующий шаг – добавить кнопки. В данном коде мы добавим кнопки «Выполнить» и «Выход» (“Process” и “Quit”). Если нажать на любую из кнопок, она вызовет функцию press:

Наконец, перейдем к запуску приложения:

Эта базовая структура выполняет большую часть работы интерфейса. Сейчас программа должна читать в любом вводе, проводить проверку и выполнять разделение PDF файла (аналогично примеру выше). Первая функция, которую нам нужно определить – это press. Эту функцию вызывает каждая из кнопок при нажатии.

Эта функция берет один параметр – кнопку, которая будет определена как «Выполнить» и, соответственно «Выход». Если пользователь нажмет выход, тогда app.stop() закроет приложение.

Если нажать клавишу выполнить, тогда введенные значения будут извлечены при помощи app.getEntry(). Каждое значение сортируется и утверждается путем вызова функции validate_inputs. Если возникает ошибка, мы можем отобразить ее при помощи всплывающее окно app.errorBox. Если ошибок нет, мы можем разъединить файл при помощи split_pages.

Давайте рассмотрим функцию validate_inputs.

Эта функция выполняет несколько проверок, чтобы убедиться, что данные введены в поля и являются правильными. Я не утверждаю, что это избавит от всех ошибок. Главное, что так вы имеете представление о том, как проводить проверку и собирать ошибки в список.

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

Данная функция открывает несколько дополнительных концептов appJar. Во первых, app.InfoBox используется чтобы дать пользователю понять, когда он входит в диапазон, который содержит больше страниц, чем сам документ. Я решил просто указать обработку до конца файла с последующим уведомлением пользователя.

После сохранения файла, программа использует app.questionBox, чтобы спросить пользователя, хочет он продолжать или нет. Если нет, то мы используем app.stop() и благополучно закрываем программу.

Готовый код

Рассмотрим итоговый вариант (исходный код на github):

Подведем итоги

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

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