2011-11-13 60 views
2

我有一个基于Spring MVC的java web应用程序。 任务是生成一个PDF文件。众所周知,Spring引擎有自己的内置iText库,因此生成pdf文件非常简单。首先我们需要做的是重载AbstractView并创建一些PdfView。关键是在控制器中使用该视图。但在我的应用程序中,我也必须能够将生成的PDF文件存储在本地驱动器上,或者向我的用户提供一些链接以下载该文件。所以这种情况下的观点不适合我。Spring MVC pdf生成

我想创建一个用于创建一个PDF文件,并返回字节数组一些通用的PDF生成器。所以我可以使用该阵列来存储文件(在硬盘上)或直接在浏览器中打印。问题是 - 在PdfVIew解决方案中有没有办法使用这种引擎(只返回字节数组)?我问,因为重载的buildPdfDocument方法(在PdfView中)已经有PdfWriter和Document参数。 谢谢

回答

2

tldr;你应该能够使用一个视图并将其保存到一个文件中。

尝试使用Flying Saucer及其iTextRenderer当重载AbstractPdfView。

import org.xhtmlrenderer.pdf.ITextRenderer; 
public class MyAbstractView extends AbstractView { 
    OutputStream os; 

    public void buildPdfDocument(Map<String,Object> model, com.lowagie.text.Document document, com.lowagie.text.pdf.PdfWriter writer, HttpServletRequest request, HttpServletResponse response){ 
    //process model params 
    os = new FileOutputStream(outputFile); 
    ITextRenderer renderer = new ITextRenderer(); 
    String url = "http://www.mysite.com"; //set your sample url namespace here 
    renderer.setDocument(document, url); //use the passed in document 
    renderer.layout(); 
    renderer.createPDF(os); 
    os.close(); 
    } 
} 

protected final void renderMergedOutputModel(Map<String,Object> model, 
             HttpServletRequest request, 
             HttpServletResponse response) 
            throws Exception{ 
if(os != null){ 
    response.outputStream = os; 
} 

public byte[] getPDFAsBytes(){ 
    if(os != null){ 
    byte[] stuff; 
    os.write(stuff); 
    return stuff; 
    } 
} 

}

你可能不得不调整此处显示的示例实现,但应该提供基本依据。

+0

感谢您的回复。不幸的是,我不使用Grails。有人知道如何在“纯粹的”java + spring上实现它吗? – nKognito

+0

Grails只是Spring MVC和Groovy中的其他内容,与Java非常相似。这个答案意味着你可以通过检查图书馆的来源构建类似的功能,这可以在http://svn.codehaus.org/grails-plugins/grails-rendering/trunk/上找到。下载0.3版本并专门查看PdfRenderingService及其父类,并且您会发现它基本类似于纯Java。 –

+0

渲染只是使用飞碟下面,它有一个很好的教程,你将如何专门用它来创建一个输出流。检查链接。 –