Создайте файл PDF в соответствующем формате

Для себя я создал PDF-файл, используя библиотеку летающих тарелок. Это был устаревший HTML, поэтому я очистил XHTML с помощью библиотеки HTMLCleaner.

После этого я сериализую XML в виде строки, затем передаю его в модуль iText летающей тарелки для его рендеринга и последующего создания PDF.

Этот PDF я помещаю в папку OutputStream. После подтверждения ответа я получаю диалоговое окно с просьбой сохранить или открыть его. Однако он не сохраняется в виде файла PDF. Мне нужно щелкнуть правой кнопкой мыши и открыть его в Adobe или любой программе для чтения PDF.

Как мне сделать так, чтобы он отображался в программе чтения PDF. И сделайте так, чтобы файл был сохранен как файл .pdf. Что было бы эффективным и удобным для пользователя способом решения этой проблемы? Помощь, как всегда, будет принята с благодарностью!

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.StringBufferInputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.htmlcleaner.CleanerProperties;
import org.htmlcleaner.DomSerializer;
import org.htmlcleaner.HtmlCleaner;
import org.htmlcleaner.PrettyXmlSerializer;
import org.htmlcleaner.TagNode;
import org.htmlcleaner.XmlSerializer;
import org.w3c.dom.Document;
import org.xhtmlrenderer.pdf.ITextRenderer;
import org.xhtmlrenderer.resource.XMLResource;

public class MyPDF extends HttpServlet {


public MyPDF() {
    super();
}


public void destroy() {
    super.destroy(); 
}


public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    doPost(request, response);
}


public void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    response.setContentType("text/pdf");

    String html = request.getParameter("source");

    try 
    {
        HtmlCleaner cleaner = new HtmlCleaner();
        CleanerProperties props = cleaner.getProperties();

        TagNode node = cleaner.clean(html);

        //String content = "<" + node.getName() + ">" + cleaner.getInnerHtml(node) + "</" + node.getName() + ">";
        //System.out.println("content " +content);

        OutputStream os = response.getOutputStream();
        System.out.println("encoding " +response.getCharacterEncoding());

        final XmlSerializer xmlSerializer = new PrettyXmlSerializer(props);
        final String html1 = xmlSerializer.getAsString(node);

        ITextRenderer renderer = new ITextRenderer();
        renderer.setDocumentFromString(html1);
        renderer.layout();

        renderer.createPDF(os);
        os.close();
    } 
    catch (Exception ex) 
    {
        ex.printStackTrace();
    }


}


public void init() throws ServletException {

}

}

person Ford Perfect    schedule 30.08.2013    source источник


Ответы (1)


Ваш тип MIME неверен для PDF. Это должно быть приложение/pdf.

Изменять

response.setContentType("text/pdf");

to

response.setContentType("application/pdf");

См. http://tools.ietf.org/html/rfc3778 RFC для PDF MIME. тип.

Изменить: полностью упустил из виду вопрос «Сохранить как .pdf». Вам также нужно будет добавить что-то вроде:

response.setHeader("content-disposition", "attachment; filename=yourFileName.pdf");

чтобы сообщить браузеру, каким должно быть имя файла по умолчанию.

person aryn.galadar    schedule 30.08.2013