FlyingSaucer renderer.setDocument генерирует исключение «Поток закрыт» - PullRequest
8 голосов
/ 22 февраля 2011

У меня проблемы с созданием PDF с использованием простого примера, найденного здесь . Я впервые пытаюсь его использовать, и я попробовал несколько вещей и много поиска, но не нашел причину, по которой генерируется ошибка. Ошибка возникает в строке renderer.setDocument(url);. Если у кого-то есть какие-либо идеи, предложения или альтернативы, это будет с благодарностью.

package flyingsaucerpdf;

import java.io.*;
import com.lowagie.text.DocumentException;
import org.xhtmlrenderer.pdf.ITextRenderer;

public class FirstDoc {

    public static void main(String[] args) 
            throws IOException, DocumentException {
        String inputFile = "samples/firstdoc.xhtml";
        String url = new File(inputFile).toURI().toURL().toString();
        String outputFile = "firstdoc.pdf";
        OutputStream os = new FileOutputStream(outputFile);

        ITextRenderer renderer = new ITextRenderer();
        renderer.setDocument(url);
        renderer.layout();
        renderer.createPDF(os);

        os.close();
    }
}

Консоль распечатывает ошибку ниже.

ERROR:  'Stream closed'
org.xhtmlrenderer.util.XRRuntimeException: Can't load the XML resource (using TRaX transformer). java.io.IOException: Stream closed
    at org.xhtmlrenderer.resource.XMLResource$XMLResourceBuilder.createXMLResource(XMLResource.java:191)
    at org.xhtmlrenderer.resource.XMLResource.load(XMLResource.java:71)
    at org.xhtmlrenderer.swing.NaiveUserAgent.getXMLResource(NaiveUserAgent.java:211)
    at org.xhtmlrenderer.pdf.ITextRenderer.loadDocument(ITextRenderer.java:134)
    at org.xhtmlrenderer.pdf.ITextRenderer.setDocument(ITextRenderer.java:138)
    at com.asiaprice.service.email.template.CompletePdf.createpdf(CompletePdf.java:28)

Ответы [ 5 ]

9 голосов
/ 21 февраля 2013

renderer.setDocument может выдать исключение «Поток закрыт», если xhtml ссылается на файл, который не может быть найден средством визуализации, например, файл css.

Симптомы этого не совсем совпадают с оригинальными постерами, так как «Не удается загрузить ресурс XML» не появляется в сообщении об ошибке, я включил это в пользу тех, кто приходит сюда через Google.

1 голос
/ 13 февраля 2013
 String File_To_Convert = "src/file.html";
        String url = new File(File_To_Convert).toURI().toURL().toString();
        //System.out.println("---"+url);
        String HTML_TO_PDF = "ConvertedFile.pdf";
        OutputStream os = new FileOutputStream(HTML_TO_PDF);       

         ITextRenderer renderer = new ITextRenderer();
                renderer.setDocument(url);      
                renderer.layout();
                renderer.createPDF(os) ;    
                os.close();
          System.out.println("done.");

Это код, который работает нормально.

Большинство людей получают вышеуказанную проблему @ мой код.

 File_To_Convert = "src/file.html";

Здесь мы должны указать относительный путь.

1 голос
/ 26 сентября 2011

Я решил эту проблему, просто заменив

renderer.setDocument(url);

на

renderer.setDocument(new File(inputFile));
0 голосов
/ 12 января 2012

Здесь на самом деле происходит вызов setDocument(...), и renderer не может открыть InputStream (обычно потому, что либо файл не существует, либо недостаточно прав для доступа к нему).Исправление будет состоять в том, чтобы заменить эту ссылку на File или действующий URL-адрес, по которому приложение может перейти.

0 голосов
/ 22 февраля 2011

Является ли "samples / firstdoc.xhtml" файлом из учебника?Это в правильном каталоге и доступно?XHTMLRenderer принимает только чистый код XHTML и является очень строгим.Если что-то не так, вы получите исключение.

В некоторых моих проектах я использую JTidy для очистки источника перед рендерингом.

...