Парсинг swf на Java

Недавно столкнулся с задачей парсинга swf файла (помимо высоты, ширины и версии флеш плеера была необходимость извлечь скрипт). Выбор языка программирования был за мной, а так как до этого больше всего работал с Java, решил использовать именно его. После недолгого поиска набрел на сайт http://flagstonesoftware.com. Одной из предлагаемых ими библиотек является Transform SWF, возможности которой оказались более чем достаточны для решения поставленной задачи. Вот что говорят про библиотеку сами создатели:

«Transform is an Open Source library for reading and writing Flash (.swf) files. The API gives you complete control over how files are created with access to all the features supported by the Flash Player but yet is still intuitive and easy to use.»

Transform — это Open Source библиотека для чтения и записи Flash (. SWF) файлов. API дает вам полный контроль над тем, как создаются файлы с доступом ко всем функциям, поддерживаемым Flash-плеером, в интуитивно-понятной и простой в использовании форме.

Под катом немного подробнее о библиотеке и небольшой пример.

Основные характеристики:
  • Полная поддержка Flash 10.
  • Создание Flash файлов для любой версии настольных Flash Player.
  • Создание Flash Lite файлов для мобильных телефонов и устройств.
  • Простой в использовании API позволяет редактировать любые флэш-файлы.
  • Широкое 2-D API для рисования фигур от произвольного сложному.
  • Использование OpenType и TrueType шрифтов для отображения текста.
  • Получение изображений с помощью JPEG, PNG и BMP файлов.
  • Добавление событий и потокового звука из WAV и MP3 файлов.
  • Возможность добавления плагинов-декодеров для новых форматов изображений и звуков.
  • Интеграция с Java JDK добавляет поддержку для AWT Fonts и ImageIO readers.
  • Open Source, лицензия BSD является бесплатной для коммерческого использования.

Для демонстрации возможностей приведу небольшой пример. Парсится флешка(swf, не fla!), содержащая одну единственную кнопку, при нажатии на которую вызывается следующий ActionScript-сценарий:

on (release) {
 getURL("http://google.com", "_blank");
}
.
При запуске примера получите информацию о самом файле и скрипт, вызываемый нажатием кнопки.

Для запуска примера необходимо скачать jar библиотеки Transform SWF и подключить ее к Вашему проекту.

Несколько пояснений к коду:
класс Movie это класс-контейнер для объектов, которые представляют структуры данных в Flash-файле;
интерфейс MovieTag представляет собой тип, используемый для определения всех объектов, которые могут быть добавлены в фильм;
класс MovieHeader содержит данные из заголовка Flash-файла.

Листинг:

import java.io.File;
import java.util.List;

import com.flagstone.transform.EventHandler;
import com.flagstone.transform.Movie;
import com.flagstone.transform.MovieHeader;
import com.flagstone.transform.MovieTag;
import com.flagstone.transform.button.DefineButton2;

public class SimpleSwfDecoder {

public static void main(String[] args) {
 final File srcFile = new File("button_with_script.swf");
 Movie movie;

try {
 movie = new Movie();
 movie.decodeFromFile(srcFile);

List tags = movie.getObjects();

for (MovieTag t : tags) {
 if (t.getClass().equals(MovieHeader.class)) {
 MovieHeader mh = (MovieHeader)t;
 System.out.println("Height = "+mh.getFrameSize().getHeight()/20);
 System.out.println("Width = " + mh.getFrameSize().getWidth()/20);
 System.out.println("Flash Player v"+mh.getVersion());
 System.out.println("Frame count = "+mh.getFrameCount());
 System.out.println(mh.getFrameRate()+ " frames per second"); 
 }
 if(t.getClass().equals(DefineButton2.class)){
//извлекаем нашу кнопку
 DefineButton2 db2 = (DefineButton2)t;
//получаем все обработчики событий
 List ehl = db2.getEvents();
/*выводим на экран скрипт из обработчика, так как у нас лишь один обработчик,
 напрямую обращаемся к первому элементу List*/
 System.out.println(ehl.get(0).getActions().get(0));
 }
 }
 } catch (final Exception e) {
 e.printStackTrace();
 }
 }
}


Это лишь вершинка айсберга, библиотека Transform SWF имеет огромные возможности. Удачи в использовании.


0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.