пятница, 24 ноября 2017 г.

Парсинг PDF файлов на python

Список популярных пакетов для работы с PDF документами из Python


pdfminer - Отличная библиотека для работы с pdf. 
Для работы с python 3.x лучше использовать форки: pdfminer3k и pdfminer.six 
(В последнем, есть также консольная утилита для работы с форматом pdf)
Популярность:  2479 звезд, 738 форков на GitHub

PyPDF2 - Популярный форк старой библиотеки pyPDF. Умеет разделять pdf по отдельным документам, объединять документы в один, получать текст и мета информацию.
Совместим с Python 2.6, 2.7, и 3.2 - 3.5. 
Популярность: 1612 звезд, 444 форка на GitHub

pdfquery - Обертка вокруг библиотеки pdfminer, используя  язык запросов JQuery и XPath позволяет быстро получить информацию из PDF документа. 
Последнее обновление библиотеки 16 июля 2017.  
Совместима с Python 3.x. 
Популярность: 300 звезд, 38 форков на GitHub

pdfrw - Простая библиотека для python, может читать и записывать pdf файл, работать с мета-информацией, объединять документы, переворачивать, и т.д. 
Последнее обновление библиотеки 17 сентября 2017. 
Поддерживаются версии Python 2.6, 2.7, 3.3, 3.4, 3.5, and 3.6
Популярность: 440 звезд, 105 форков на GitHub

slate - Этот пакет позволяет легко получить текст из pdf документа. 
Последнее обновление пакета: 26 марта 2017 года. 
С работой на python 3.x имеются проблемы. 
Популярность: 231 звезды, 92 форкa на GitHub

reportlab - Мощная библиотека для создания pdf документов (текст и графика). 
Кроме open-source пакета имеется и коммерческая версия ReportLab Plus. 
Совместима с python 2.7 или 3.3 и выше.
Популярность:  84 форка на bitbucket 

fdfgen - Библиотека для Python, портированная с php (forge_fdf). 
Возможности: создание документов, объединение. 
Совместима с python 3.x
Популярность:  113 звезд, 25 форков на GitHub

Вспомогательные утилиты

Pdftk - Консольная утилита  и GUI приложение для работы с pdf. 
Возможности: объединение, разделение документов, извлечение текста.

qpdf - Консольная утилита написанная на С++ для работы с  pdf быстро.
Основные возможности: создание, объединение, разделение, шифрование, получение мета информации.

ghostscript - Конвертер файлов в PostScript формате в графические файлы или PDF. 

среда, 22 ноября 2017 г.

Как просто и быстро разложить фотографии по папкам


Часто после отпуска возникает ситуация когда большое количество фотографий необходимо разложить по папкам. Для этих целей можно использовать отличную программу для работы с мета информацией (EXIF, IPTC, XMP, GPS) ExifTool. Эта утилита, которую можно запустить из командной строки или из bat файла.

Для работы копируем утилиту exiftool в директорию с фотографиями,
далее нажимаем кнопку Start и в строке поиска пишем cmd и нажимаем enter.
Откроется окно терминала. Переходим к нашей директории с фотографиями (команда: cd путь до папки). И пишем такую команду

exiftool -v "-Directory<${DateTimeOriginal}/${model;}" -d %%Y_%%m_%%d *.jpg

В итоге в этой папке будут созданы подпаки вида:



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

За пару минут можно отсортировать огромный архив фотографий по папкам!

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

exiftool -v "-Directory<${DateTimeOriginal}/${model;}" -d %%Y_%%m_%%d *.JPG
exiftool -v "-Directory<${DateTimeOriginal}/${model;}" -d %%Y_%%m_%%d *.jpg
exiftool -v "-Directory<${DateTimeOriginal}/${model;}" -d %%Y_%%m_%%d *.jpeg
exiftool -v "-Directory<${DateTimeOriginal}/${model;}/RAW" -d %%Y_%%m_%%d *.CR2
exiftool -v "-Directory<${DateTimeOriginal}/${model;}" -d %%Y_%%m_%%d *.tif


Дополнительно:
Для сортировки RAW (Canon) файлов можно воспользоваться этой командой.

exiftool -v "-Directory<${DateTimeOriginal}/${model;}/RAW" -d %%Y_%%m_%%d *.CR2

В подпапке с названием модели появится директория RAW.


Небольшая ремарка:
На официальном сайте ExifTool утилита называется exiftool(-k).exe для удобства использования советую переименовать в exiftool.




понедельник, 17 августа 2015 г.

“Сборка” Python скрипта в один exe файл


Все мы знаем, что пайтон интерпретируемый язык и получить настоящий скомпилированный exe файл - нет возможности. Однако, есть такие проекты как: py2exe или cx_freeze, которые, анализируя код приложения, собирают все зависимые библиотеки и сам интерпретатор в отдельной папке, и создают запускающий exe файл. Этот exe файл при запуске подготовит окружение для нашего приложения, запустит интерпретатор python и уже в нем - наше приложение. После работ утилит py2exe или cx_freeze у нас всегда появляются куча dll и др. файлов.


Так что же сделать для получения одного exe файла, вместо кучи файлов?


Будем считать, что у нас уже есть папка (dist) с зависимыми файлами, после прогона py2exe или cx_freeze.


  • Первым делом, чистим за утилитами py2exe или cx_freeze библиотеки и файлы, которые гарантированно не будут использоваться. (например: w9xpopen.exe).Таким образом, уменьшаем размер нашего будущего exe файла и скорость его загрузки.
  • Далее, упаковываем архиватором 7zip (если у Вас его нет, то скорее качаем с официального сайта: www.7-zip.org) папку (dist) со всеми файлами.


Все параметры упаковки лучше запомнить, так как далее они понадобятся.
Я упаковку делаю из командной строки поэтому и запомнить просто :)
Например: C:\7-Zip\7z.exe a -r -t7z -m1=LZMA dist.7z dist\*.*


Далее начинается темная магия, которой порой, пользуются всякие недалекие вирусописатели.


Идем на сайт http://7zsfx.info/ru/ и скачиваем специальный модифицированный модуль (например: 7zsd.sfx) для распаковки нашего приложения “по тихому” и запуску одного из файлов внутри архива. Модуль должен быть с поддержкой именно того сжатия, которое применяем, в моем случае это LZMA, a есть еще лучше - LZMA2)


Далее готовим файл настройки для модуля 7zsd.sfx:
(config.txt)

;!@Install@!UTF-8!
RunProgram="наш_запускатор.exe /s"
GUIMode="2"
;!@InstallEnd@!


Главная строчка здесь это: RunProgram с ключем /s - говорит, что после распаковки запустить “по тихому” (/s) файл из архива.


Следующим шагом идем в командную строку и делаем следующие:
copy /b 7zsd.sfx + config.txt + dist.7z alone.exe


Итогом получаем один exe (alone.exe) файл, который на самом деле является файлом состоящем из трех частей. Распаковщика (7zsd.sfx), конфига к нему (config.txt) и нашего дистрибутива (dist.7z).


После запуска, произойдет следующее: во временной директории (TEMP) будет развернут наш дистрибутив и автоматом запустится файл из него (alone.exe). Распакованные файлы останутся лежать в  (TEMP), если оно нам не надо, то в конфигурационном файле надо добавить ключик delete=директория.
А вообще рекомендую посмотреть справку по модулю 7zsfx на официальном сайте:



Как поменять иконку приложения и описание программы?

Для этого воспользуемся программой Resource Hacker
Процесс простой, описывать думаю нет смысла.


Что дальше?

Все использованные программы могут работать из командной строки и легко принимают разные параметры. Поэтому можно легко сделать bat файл со всем этим процессом (компилятор_всея_пайтон.bat)  и запускать по мере необходимости.


Оптимизация: скорость, размер, можно попробовать воспользоваться UPX
http://upx.sourceforge.net/ для сжатия. Может оно что-то и даст.


Приятные бонусы.

Бесплатным бонусом идет возможность шифрования кода нашего приложения  и установка пароля на запуск приложения. Но… Ниже о безопасности кода.


Не могу промолчать про минусы.
  1. Возможно, некоторые антивирусы будут ругаться.
  2. Исходный код можно все равно перехватить, например, подсмотрев его во время распаковки архива во временную директорию.
  3. Медленный запуск приложения. (Можно победить подбором параметров сжатия и удалением мусорных файлов из дистрибутива) (А на SSD, так вообще не заметно:) )  


Второй пункт можно чуть улучшить, если использовать распаковку на виртуальный диск в памяти, который предварительно надо создать. Это даст еще 2 очка к безопасности кода. :) Но защита все равно очень слабенькая…