Pokazywanie postów oznaczonych etykietą tomcat. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą tomcat. Pokaż wszystkie posty

6 kwietnia 2011

Apache FOP na Apache Tomcat cz.4

Nie odpuściłem tego servleta... Po pewnych walkach (przypominam, że to moje pierwsze programowanie w Javie), udało się skompilować fop.war. Dokonane zmiany wyglądają tak:
--- FopServlet.java.org 2010-07-12 21:34:45.000000000 +0200
+++ FopServlet.java     2011-04-06 19:00:01.639060332 +0200
@@ -44,6 +44,10 @@ import org.apache.fop.apps.Fop;
 import org.apache.fop.apps.FopFactory;
 import org.apache.fop.apps.MimeConstants;

+import org.xml.sax.SAXException;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
 /**
  * Example servlet to generate a PDF from a servlet.
  * 
@@ -77,6 +81,8 @@ public class FopServlet extends HttpServ /** Name of the parameter used for the XSLT file */ protected static final String XSLT_REQUEST_PARAM = "xslt"; + private final Log log = LogFactory.getLog(FopServlet.class); + /** The TransformerFactory used to create Transformer instances */ protected TransformerFactory transFactory = null; /** The FopFactory used to create Fop instances */ @@ -94,6 +100,13 @@ public class FopServlet extends HttpServ //Configure FopFactory as desired this.fopFactory = FopFactory.newInstance(); this.fopFactory.setURIResolver(this.uriResolver); + try { + fopFactory.setUserConfig(new File("userconf.xml")); + } catch (IOException e) { + log.error("No such file or directory", e); + } catch (SAXException e) { + throw new ServletException(e); + } configureFopFactory(); }
Plik konfiguracyjny userconf.xml wrzucamy po prostu do katalogu z Tomcat'em. Jeśli brak jest pliku, generowany jest log, jeśli są błędy w strukturze xml, zgłaszany jest wyjątek.

Apache FOP na Apache Tomcat cz.3

Ta ścieżka została, odrzucona. Dlaczego? Nie wiem jak podpiąć plik konfiguracyjny. Edycja a później kompilacja nowego servleta nie wchodzi w grę. A potrzebuję własnego pliku konfiguracyjnego aby wrzucić fonty z polskimi znakami. Bez tego ani rusz. Walki skończyły się na tym, że zrobiłem najprostszego wrappera w PHP, generuję plik .fo, zapisuję w tempie, wywołuję bezpośrednio skrypt fop ze ścieżką do zmodyfikowanego pliku konfiguracyjnego i wypluwam do przeglądarki zawartość wygenerowanego pliku PDF. Wrapper wygląda następująco:
<?php
$fo_tmp = tempnam("/tmp", "fop_fo_");
$pdf_tmp = tempnam("/tmp", "fop_pdf_");

$fo = '<?xml version="1.0" encoding="utf-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
  <fo:layout-master-set>
    <fo:simple-page-master master-name="first" 
                           page-height="29.7cm" 
                           page-width="21cm"
                           margin-top="1cm"
                           margin-bottom="2cm"
                           margin-left="1cm"
                           margin-right="1cm">
      <fo:region-body margin-top=".5cm"/>
      <fo:region-before extent="0cm"/>
      <fo:region-after extent="0cm"/>
    </fo:simple-page-master>
  </fo:layout-master-set>
  <fo:page-sequence master-reference="first">
    <fo:flow flow-name="xsl-region-body">
      <fo:block">Hello World!</fo:block>
    </fo:flow>
  </fo:page-sequence>
</fo:root>';

file_put_contents($fo_tmp,$fo);
system("/home/tools/fop/fop -c /home/tools/fop/userconf.xml $fo_tmp $pdf_tmp");

$lastmodified = gmdate('D, d M Y H:i:s \G\M\T',time());
header("Content-Type: application/pdf");
header("Last-Modified: $lastmodified");
$pdf = @file_get_contents($pdf_tmp);
header("Content-Lenght: ".strlen($pdf));
header("Content-Length: ".strlen($pdf));
echo $pdf;
@unlink($fo_tmp);
@unlink($pdf_tmp);
exit;
?>
Należy pamiętać o odpowiedniej modyfikacji ścieżek. Po delikatnych modyfikacjach, możemy dostosować ten wrapper do konwersji plików xml+xslt.

31 marca 2011

Apache FOP na Apache Tomcat cz.2

Jak człowiek sam nie pokombinuje, to sobie może szukać w necie i oczywistych rzeczy nie zobaczy... Wystarczyło ściągnąć źródła FOPa, przekompilować wszystko ant, przekopiować fop.war do katalogu webapps/ i już. W Slackware, wystarczyło ściagnąć i odpalić Tomcat'a, wcześniej kopiując skompilowany pod Debianem fop.war do katalogu webapps/ i... gotowe.