Обновление до новейшего FOP API - PullRequest
3 голосов
/ 02 августа 2011

Я хочу обновить приложение, чтобы использовать новейший API FOP.Приложение использует версию 0.20 библиотеки, например, класс Driver по-прежнему используется.

Мне кажется, что я не могу найти какой-либо разумной информации о том, как обновиться до последней версии FOP.Я нашел некоторые фрагменты, например, что следует использовать FOPFactory.

Так что мне было интересно, кто-нибудь может дать мне толчок к ресурсам при обновлении до нового (est) fop API?Или действительно не возможно обновить и мне нужно переписать эту часть приложения?

PS Я нашел страницу fop upgrade (конечно), но она, кажется, неуказать на сходство между классами / API обеих версий.

1 Ответ

2 голосов
/ 16 октября 2011

Ответ в том, что это действительно зависит от того, сколько вы используете FOP.

Когда мы обновили версию .2 * до версии .9, а затем версии 1.0, нам пришлось немного пересмотреть, но мы сгенерировали большое разнообразие FO (мы преобразовали FO в PostScript) и нам нужно было сгенерировать Разнообразие PostScripts, чтобы увидеть, что работает, а что нет в новых версиях. Скорее всего, вы найдете легкую замену всему, что могло исчезнуть в зависимости от того, что вы делали раньше.

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

Ваш первый шаг должен состоять в том, чтобы написать абстрактный Facade, так как @Wivani предлагает объединить ваши старые ссылочные вызовы fop, убедиться, что он работает в вашем коде, а затем двигаться вперед, заменив ваш старый Facade реализацией, использующей более новый код.

Единственное, что меня не устраивало в Fop, это то, что сообществу требуется довольно много времени, чтобы применить исправления ошибок и создать новые релизы. Мы использовали v1 в производстве с XML Graphics 1.4 без проблем (базовый FO для генерации файлов PostScript и TIFF).

Я дополню этот пост в понедельник кодом помощника, если он вам понадобится.

UPDATE Вот что мы использовали для преобразования файла FO в PostScript:

String foAsString = "your_fo_as_string";
File destination = new File("path_to_file"");

BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(destination));
Driver driver = new Driver(new InputSource(new StringReader(foAsString)), out);
driver.setRenderer(Driver.RENDER_PS);
driver.run();

out.close();

return destination;

Вот краткое изложение того, что мы используем сейчас.

FopFactory создается как уровень экземпляра как

this.fopFactory = FopFactory.newInstance();

код:

import javax.xml.transform.Source;
import javax.xml.transform.Templates;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.sax.SAXResult;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

import org.apache.fop.apps.Fop;
import org.apache.fop.apps.FopFactory;
import org.apache.fop.apps.MimeConstants;

// ...

String foAsString = "your_fo_as_string";
File destination = new File("path_to_file"");

OutputStream outStream = new BufferedOutputStream(new FileOutputStream(destination));
Fop fop = fopFactory.newFop(MimeConstants.MIME_POSTSCRIPT, outStream);

Transformer transformer = transformerFactory.newTransformer();
Source source = new StreamSource(new StringReader(foAsString));
Result result = new SAXResult(fop.getDefaultHandler());

transformer.transform(source, result);

outStream.close();

return destination;
...