PSD parser или как разобрать файл Photoshop на Java

Как-то предложили сделать парсер psd файла. Вроде бы очень просто. Надо найти из каких слоёв состоит документ, вывести перечень слоёв. Если слой текстовый, вывести текст и параметры форматирования. Т.е. названия шрифтов, размеры, отступы и т.д.

С чего начать? Да поможет нам гугл. Море информации, куча подробностей как делать плагины для фотошопа. Но это всё не то. Нужна консольная программа, которая будет получать на вход psd файлы и выдавать на выходе текстовое описание его внутренностей. Установка фотошопа изначально не планировалась.

Самым полезным оказался вот этот документ: PhotoshopFileFormat — собственно спецификация структуры файла photoshop. Эдакий побайтный скелет .psd файла, как раз то, что доктор прописал.

Далее погуглил на предмет того, а делали ли что либо подобное коллеги на java? Да, оказывается и такое есть. Parser-psd — краткое описание + исходники там же. Их программа разбирает файл на слои, причём сохраняет их в отдельные файлы(!) плюс добывается информация по нарезке(slices). Для моей задачи немного не то, но как начальный пример очень даже помог.

Файл загоняется в обычный поток DataInputStream in = new DataInputStream(input) и далее работаем с этим потоком побайтно.

Сам файл состоит из пяти основных секций:
1. File header
2. Color mode data
3. Image resources
4. Layer and mask information
5. Image data

header имеет фиксированный размер, а вот остальные блоки могут иметь разный размер. С этим повнимательнее. Один байт мимо и всё дело накроется. Размер указывается в первых четырёх байтах блока, поэтому блоки можно проскакивать, если всё парсить не надо in.skipBytes(size).

Тут главное внимание и чёткое следование спецификации. Внимание! От версии к версии формат меняется, в спецификации эти различия указываются. Однако текущая спецификация, которую мне удалось найти от 2010 года, а мне пришлось пользоваться ещё более старым описанием за 2007й год. Поэтому при разборе самых свежих версий файлов можно промахнуться.
  • –13
  • 6.3k
  • 8
Share post

Comments 8

    –1
    А Apache PDFBox или iText чем-то не устроили? Они все это умеют и без всяких ручных велосипедов. Например примеры для Apache PDFBox. Скажем выдернуть текст из pdf можно одной элементарной командой: ExtractText.main(new String[]{pdfFile, textFile});

    P.S. Вообще, на все стандартные задачи в Java давно уже есть стандартные хорошо описанные и проверенные решения.
      0
      А при чем тут PDF, когда речь о PSD идет?
        0
        О сори, промахнулся. Но для PSD тоже есть и библиотеки Apache и гугла и вероятно много других. Так уж надо делать парсер самому, если библиотеки давно написаны, open sourcны и протестированы?
      +10
      Не первая уже статья на хабре с содержанием «смотрите, я нагуглил библиотеку! Вот, держите!». В чем проблема то? Что спецификация формата, что библиотека для его парсинга на java ищутся за 3 секунды. Описание структуры так же дано в том документе на первой же странице.

      Да, на хабре нужно публиковать интересные библиотеки, интересные способы их использования, неординарные решения различных задач, причем чем выковыристее, тем лучше, но хабр не место, где стоит выкладывать ни спецификацию, которая ищется за 3 секунды, ни библиотеку с таким же временем поиска. Простите.
        +1
        Да, ладно если бы в статье было просто «я нагуглил библиотеку!», хуже что статья учит изобретать велосипеды на ровном месте, вместо того чтобы использовать давным давно написанные библиотеки, которых на Java сто возов и маленькая тележка.
        0
        Сам довольно давно с этим мучался (с чтением PSD) — в итоге остановился на самом простом — подключаюсь через COM-объект к самому фотошопу и через его публичные методы читаю (ссылочку на сырцы могу скинуть в личку, кому интересно). Из минусов — нужен инстанс фотошопа. Думаю благодаря ссылоке на документацию проблему решу и сделаю ридер без непосредственного участия фотошопа, как-то раньше она (ссылка) не нагугливалась (руки кривые?), спасибо большое.
          0
          Из минусов — нужен инстанс фотошопа
          Этим почти все сказано.
            0
            Угу, это адовый минус. Зато всё очень просто делается и доки довольно быстро откопались: wwwimages.adobe.com/content/dam/Adobe/en/devnet/photoshop/pdfs/photoshop_cs5_scripting_guide.pdf

          Only users with full accounts can post comments. Log in, please.