0

为了我的使用,我使用飞碟库创建了一个 PDF 文件。这是一个遗留的 HTML,所以我使用 HTMLCleaner 库清理了 XHTML。

在此之后,我将 XML 序列化为字符串,然后将其传递给飞碟的 iText 模块以呈现它并随后创建 PDF。

这个 PDF 我把它放在OutputStream. 提交响应后,我会收到一个对话框,要求保存或打开它。但是它不会保存为 PDF 文件。我必须右键单击并在 Adob​​e 或任何 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 {

}

}
4

1 回答 1

1

您的 MIME 类型对于 PDF 不正确。它应该是应用程序/pdf。

改变

response.setContentType("text/pdf");

response.setContentType("application/pdf");

有关 PDF MIME 类型的 RFC,请参阅https://www.rfc-editor.org/rfc/rfc3778

编辑:完全忽略了“另存为 .pdf”的问题。您还需要添加以下内容:

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

告诉浏览器默认文件名应该是什么。

于 2013-08-30T21:12:04.667 回答