Коммерческие процессоры FO в eXist-db

Для своего проекта я хотел бы протестировать XEP и AH Formatter. Мне нравится FOP, но в некоторых случаях он действительно терпит неудачу (поплавки, метки обрезки, стандарты pdf/x и т. д.), и мне нужно знать некоторые альтернативы.

XEP

С XEP я очень близок. Я скопировал все банки в $EXIST_HOME/lib/user и сменил адаптер в $EXIST_HOME/conf.xml. Кроме того, я загрузил файл конфигурации xep.xml в базу данных.

Тестирование XQuery:

xquery version "3.0";

declare namespace fo = "http://46.28.111.241:8081/exist/db/apps/bunny/modules/fop";

let $config := doc('/db/apps/bunny/test/xep.xml')
let $fo := doc('/db/apps/bunny/data/test.fo')
let $pdf := xslfo:render($fo, "application/pdf", (), $config)
return response:stream-binary($pdf, "application/pdf", "output.pdf")

Он бросает:

exerr:ERROR org.exist.dom.persistent.NodeProxy cannot be cast to org.w3c.dom.Node [at line 7, column 13]

Формат AH

С AH Formatter я сейчас потерялся. Он не включает какой-либо конкретный файл jar, который я мог бы скопировать в $EXIST_HOME/lib/user, или, по крайней мере, так не кажется. На сайте AH есть примечание об использовании AH Formatter на Linux-машине, но это замечание не помогает в целом процессе включения его в eXist.

Установка включает в себя несколько папок, которые все упомянуты в файле run.sh, это гораздо более фрагментированное приложение, чем XEP.

Я тестирую Ubuntu Server 14.04 и eXist-db RC01.


person Honza Hejzl    schedule 05.04.2016    source источник
comment
Интерфейс Java для AH Formatter задокументирован по адресу antennahouse.com/product/ahf66/ahf. -java.html. AH Formatter также имеет опцию веб-интерфейса: antennahouse.com/web-interface   -  person Tony Graham    schedule 23.10.2019


Ответы (2)


eXist на данный момент поддерживает только Apache FOP или RenderX XEP.

@wolfgang-meier ранее добавил поддержку средства форматирования Antenna House (22 августа 2012 г., git commit: ffda3b7), но затем снова удалил его 12 сентября 2012 г. (git commit: 5a2a0aa) с комментарием, что он будет перемещен в отдельный проект... Я не могу найти отдельный проект.

Если вы хотите использовать Antenna House, я бы посоветовал связаться с Вольфгангом или получить код из соответствующих коммитов Git.

Что касается ошибки, которую вы имеете с RenderX XEP, когда вы получаете ошибку exerr:ERROR org.exist.dom.persistent.NodeProxy cannot be cast to org.w3c.dom.Node, в вашем $EXIST_HOME/webapp/WEB-INF/logs/exist.log также должна быть связанная трассировка стека, не могли бы вы также опубликовать соответствующий раздел?

person adamretter    schedule 05.04.2016
comment
Это интересно. Никакой ошибки с этим не связано. Когда я пытаюсь очистить журнал и запустить тест, ничего нового нет. Но некоторые ошибки возникают, если я перезапускаю eXist. Здесь вы можете проверить журнал, он довольно длинный. Есть какая-то ошибка, связанная с индексированием (несмотря на это, мои настройки хорошо работают при поиске по файлам). За исключением проблемы с XEP, все работает хорошо. - person Honza Hejzl; 06.04.2016
comment
До сих пор нет прогресса. Я попытался переключиться на RC02, который, кажется, немного сломан в случае с xslfo (я опубликовал Issue на GitHub). Кроме того, я попытался сделать новую установку RC01 и загрузить туда свое приложение. Это то же самое. В логе только такая же ошибка по индексу, но ничего связанного с xslfo. - person Honza Hejzl; 07.04.2016
comment
Пардон какой RC02? Вы должны использовать либо eXist-2.2, либо eXist-3.0.RC1. Также я не могу получить доступ к тому файлу журнала, который, как вы говорите, вы загрузили. - person adamretter; 11.04.2016
comment
Моя вина, ошибка сервера. Теперь оно есть. Что касается версии, то опять же прошу прощения за непонятную информацию, я имел в виду 3.0.RC2. Я пытался как-то заставить работать FOP 2.1, поэтому попытался использовать вашу последнюю сборку. Спасибо за вашу терпеливую поддержку, это очень достойно. Файл журнала отслеживает запуск eXist от чистого запуска, теста XEP и до завершения работы. - person Honza Hejzl; 11.04.2016
comment
Хорошо, здесь тоже надо поправить термины — я имел в виду ночную сборку #ecc4df4, а не 3.0.RC2. - person Honza Hejzl; 11.04.2016
comment
Итак, с ночной сборкой у вас работает FOP 2.1? И это только XEP, который все еще не работает для вас? - person adamretter; 12.04.2016
comment
@HonzaHejzl Хорошо, я снова открыл проблему GitHub и ответил вам там. - person adamretter; 13.04.2016

Хотя это старый вопрос, я решил опубликовать здесь альтернативный ответ на случай, если он появится при поиске.

В качестве альтернативы вы можете установить EnMasse от RenderX (или WinMasse в Windows), который предоставляет форматировщику интерфейс SOAP. Обратите внимание, это можно запустить на любой машине, даже не обязательно быть на сервере eXist. EnMasse предоставляет порт SOAP для отправки вашего FO и получения обратно PDF (или альтернативных форматов). Тогда это так же просто, как создать сообщение SOAP и отправить его на сервер EnMasse.

xquery version "3.0";
declare namespace fo = "http://www.w3.org/1999/XSL/Format";

(: web address for the EnMasse server :)
let $xepsoap := 'http://www.yourserver.com:6577/fairy'
(: The base for any relative references (if any) -- cannot be empty and does not need to exist at all on the formatting server, just a path to resolve relative references :)
let $in0 := 'c:/foo.xml'
(: The base64 encoded XSL FO :)
let $in1 := util:base64-encode(serialize(doc('/db/EIDO/data/edit/_scratch/sample.fo')/fo:root))

let $soapMessage := <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:fairy="http://www.yourserver.com:6577/fairy"> 
    <SOAP-ENV:Header/> 
    <SOAP-ENV:Body> 
        <fairy:format SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
            <in0>{$in0}</in0> 
            <in1>{$in1}</in1> 
        </fairy:format> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope>

let $xepout := httpclient:post(xs:anyURI($xepsoap),$soapMessage,false(),<headers/>)
return $xepout//formatReturn/string()

В этом примере кода он возвращает PDF в кодировке base64, но вы поняли, что вы можете использовать с response-stream-binary() для возврата PDF.

Это можно использовать в средах с очень высокой производительностью, поскольку EnMasse может масштабироваться для использования множества потоков RenderX XEP на нескольких JVM, ядрах и даже на разных машинах.

person Kevin Brown    schedule 22.10.2019