Na última quarta-feira, a Apache Foundation anunciou o lançamento do Apache FOP 1.0, um projeto que demorou cerca de uma década para ser feito. O Apache FOP, ou Formatting Objects Processor, teve o seu início com o XML project na Apache antes de mudar (junto com o Batik, um renderizador SVG baseado em Java) para o projeto XMLGraphics em 2004.
O Apache FOP tem o intuito de tornar documentos XML em uma variedade de formatos prontos para impressão, como por exemplo o PDF, PNG ou até mesmo para HTML. A sua história volta para o primeiro lançamento do XSL do W3C. Embora muitos confundam o XSL com a XSL Transformation language, o XSL foi criado primeiramente em benefício da indústria editorial. Como resultado, a especificação da XSL engloba tanto a linguagem em si (eXtensible Stylesheet Language) quanto a XSL Formatting Objects. A partir do resumo do XSL:
Esta especificação define as características e sintaxe para o Extensible Stylesheet Language (XSL), uma linguagem para expressar estilo. Ela consiste em duas partes:
- uma linguagem para transformar documentos XML (XSLT).
- um vocabulário XML para especificar semântica de formatação.
O que a maioria imagina do XSL, na verdade é o XSLT, a primeira parte da especificação. A especificação do XSL também define uma mini linguagem para definir como o texto deverá ser impresso no formato XSL Formatting Objects, ou apenas FO, na mesma especificação. (Este é o nome que deu início ao Apache FO Processor, e também ao nome do próprio projeto.)
Embora o CSS 1 tenha sido lançado em 1996, e o CSS2 em 1998, nenhum deles possuem a habilidade para alguns requisitos como notas de rodapé, referências de número de páginas, separar o texto por fluxo de colunas (i.e. o texto fluir de acordo com um certo número de colunas, no lugar de pré dividí-los em DIVs separados). Quando o XSL FO foi lançado em 2001 como parte da especificação XSL, havia poucos processadores disponíveis para processá-lo. O Apache FOP foi um dos primeiros, porém ficou parado na versão 0.20 (lançado em 2003), até o seu reínico na versão FOP 0.93 (lançado em 2007). Na verdade, esta lacuna foi utilizada para demonstrar a capacidade de OSGi em carregar diferentes versões de JARs em um evento OSGi JSIG na Sun alguns anos atrás.
Um exemplo de documento FO parece muito com o XML tradicional, com um namespace fo e delimitador para http://www.w3.org/1999/XSL/Format
. Aqui está um exemplo do http://www.renderx.com/tutorial.html (um processador FO comercial):
<?xml version="1.0" encoding="iso-8859-1"?> <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> <fo:layout-master-set> <fo:simple-page-master master-name="my-page"> <fo:region-body margin="1in"/> </fo:simple-page-master> </fo:layout-master-set> <fo:page-sequence master-reference="my-page"> <fo:flow flow-name="xsl-region-body"> <fo:block>Hello, world!</fo:block> </fo:flow> </fo:page-sequence> </fo:root>
O conteúdo em fo:layout
contém o estilo (por exemplo quais são as margens do documento, o local onde a numeração das páginas deverão ser mostradas; ele suporta diversos estilos, logo você pode ter estilos separados para a 'página principal' e para 'página index'), seguido do fo:page-sequence
, que corresponde a um conjunto de páginas (e.g. um capítulo). O flow
e o block
são semelhantes ao div
e ao p
do HTML.
Embora possa parecer muito detalhado, ele é um formato intermediário de formatos como o MediaWiki ou o WikiText. (o Eclipse WikiText pode ser traduzido para DocBook ou XSL-FO; na verdade, alguns processadores DocBook geram XSL-FO, o que pode ser compilado em PDF através de ferramentas como o Apache FOP). O site do Maven utilizou o Apache FOP para viabilizar a geração de versões em PDF do site através do plugin pdf.
O Apache FOP 1.0 ainda não está completamente compatível com a especificação do XSL FO; uma página de compatibilidade lista maiores informações a respeito do que é suportado atualmente.