Apache FOP создает пустую страницу - PullRequest
1 голос
/ 28 апреля 2010


Я пытаюсь создать PDF, используя Apache FOP и Java. Я использую действительный файл xsl-fo, который я могу создать в формате PDF с помощью командной строки FOP.

Моя проблема возникает при попытке запустить FOP с использованием библиотек Apache FOP. Бег по мосту Java / PHP. Невеста правильно настроена и java / php общаются. На стороне Java у меня есть функция, которая принимает строку, содержащую xsl-fo, и возвращает строку, содержащую PDF. Когда я выполняю эту функцию и перенаправляю вывод в stdout, а затем в файл или через мост java / php, pdf выглядит пустым, а его размер примерно вдвое больше, чем у правильного pdf, который я получаю через командную строку. Я предполагаю, что у меня какая-то проблема с кодировкой.

Кто-нибудь видел эту проблему раньше?

Вот мой код Java

public String ConvertFoToPdf(String fo) {

    // Will contain the results after the transformation.
    ByteArrayOutputStream out = new ByteArrayOutputStream();

    // Input string
    StringReader sr = new StringReader(fo);

    // Should be UTF-8;
    String strEncoding = Charset.defaultCharset().name();

    // Resulting string.
    String pdfResult = "";

    try
    {
        // Get an instance of the fop factory
        FopFactory fopFactory = FopFactory.newInstance();
        FOUserAgent foUserAgent = fopFactory.newFOUserAgent();

        // Construct fop with desired output format
        Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);

        // Setup JAXP using identity transformer
        TransformerFactory factory = TransformerFactory.newInstance();
        Transformer transformer = factory.newTransformer(); 

        // Setup input stream
        Source src = new StreamSource(sr);

        // Resulting SAX events (the generated FO) must be piped through to FOP            
        Result res = new SAXResult(fop.getDefaultHandler());           

        // Set the encoding on the transformer.           
        transformer.setOutputProperty(OutputKeys.ENCODING, strEncoding); 

        // Start XSLT transformation and FOP processing
        transformer.transform(src, res);

        // Put the byte array stream into a string
        pdfResult = out.toString(strEncoding);
    }

    // Catch all exceptions for simplicities sake.
    catch (Exception e){

        // Log        
    }

    return pdfResult;
}
...