当前位置: 首页 > 知识库问答 >
问题:

JFreeChart未显示在生成的Spring MVC和iText PDF中

慎建本
2023-03-14

在“在另一个PDF文件的可用空间追加PDF”之前,我问了一个问题,我已经成功地将原生iText和JFreeChart结合在一个页面中制作了一个PDF。

我使用教程“SpringWebMVC与PDF视图示例(使用iText5.x)”将此设置合并到我的SpringMVC应用程序中。

我明白使用Spring的AbstractView并反过来实现为

@Override
protected void buildPdfDocument(Map<String, Object> map, Document document,
        PdfWriter pdfWriter, HttpServletRequest request,
        HttpServletResponse response) throws Exception {

    // do iText and JFreeCharts

}

并且JFreeChart实例需要将现有PDF文件插入其中,如“使用嵌入式JFreeChart创建iText PDF”中所示:

// get the direct pdf content
PdfContentByte dc = docWriter.getDirectContent();

// get a pdf template from the direct content
PdfTemplate tp = dc.createTemplate(width, height);

// create an AWT renderer from the pdf template
Graphics2D g2 = tp.createGraphics(width, height, new DefaultFontMapper() );
Rectangle2D r2D = new Rectangle2D.Double(0,0, width,height);
chart.draw(g2,r2D,null);
g2.dispose();

// add the rendered pdf template to the direct content
// you will have to play around with this because the chart is absolutely positioned.
// 38 is just a typical left margin
// docWriter.getVerticalPosition(true) will approximate the position that the content above the chart ended
dc.addTemplate(tp, 38, docWriter.getVerticalPosition(true)-height);

我现在的问题是,每当我调用扩展AbstractView的方法时(请参阅第二个链接),它都会在插入JFreeChart之前显示PDF,而不是在插入生成的图表之前显示PDF。我没有遇到任何错误,但我想知道是否有一个解决方案,为这一行为。

我只是想让用户用JFreeChart看到PDF,就像Spring MVC中的普通PDF实现一样。

正如你所看到的,我只是按照上面的教程并结合它们。它们在一个单独的项目中完美地工作,但是当我与Spring合并时,JFreeChart不显示,特别是显示了错误的PDF文件。

我知道我可以用JFreeChart调用生成的PDF,并通过添加指向正确文件的链接在某种程度上拦截查看,但我一直希望使用这种设置,因为这将是一种方便的方式,可以完全使用这三种技术,而无需在服务器中进行文件I/O(我遇到了麻烦)。

下面是我使用的“Spring Web MVC with PDF视图示例(使用iText 5.x)”中类的一个片段。

有人能告诉我如何将打开的PDF文件定向到buildPdfDocument()中带有图表ie的文件吗?

@Override
protected void renderMergedOutputModel(Map<String, Object> model,
        HttpServletRequest request, HttpServletResponse response)
        throws Exception {
    // IE workaround: write into byte array first.
    ByteArrayOutputStream baos = createTemporaryOutputStream();

    // Apply preferences and build metadata.
    Document document = newDocument();
    PdfWriter writer = newWriter(document, baos);
    prepareWriter(model, writer, request);
    buildPdfMetadata(model, document, request);

    // Build PDF document.
    document.open();
    buildPdfDocument(model, document, writer, request, response);
    document.close();

    // Flush to HTTP response.
    writeToResponse(response, baos);
}

我截获的ByteArrayOutputStream保存到一个文件后JFreeChart附加本身到iTextPDF.

@Override
protected void renderMergedOutputModel(Map<String, Object> model,
        HttpServletRequest request, HttpServletResponse response)
        throws Exception {
    // IE workaround: write into byte array first.
    ByteArrayOutputStream baos = createTemporaryOutputStream();

    // Apply preferences and build metadata.
    Document document = newDocument();
    PdfWriter pdfWriter = newWriter(document, baos);
    prepareWriter(model, pdfWriter, request);
    buildPdfMetadata(model, document, request);

    // Build PDF document.
    document.open();
    buildPdfDocument(model, document, pdfWriter, request, response);
    document.close();

    FileOutputStream fos = null;
    try {
        fos = new FileOutputStream(new File("D:/MUST-HAVE-CHART.pdf"));
        baos.writeTo(fos);
    } catch (IOException ioe) {
        // Handle exception here
        ioe.printStackTrace();
    } finally {
        fos.close();
    }
    System.out.println(baos.toString());

    // Flush to HTTP response.
    writeToResponse(response, baos);
}

所发生的是必备图表。PDF没有图表,与Spring MVC创建后提供的图表相同。但是,带有图表的文件会保存在其他地方,如代码所示:

@Override
protected void buildPdfDocument(Map<String, Object> map, Document document,
        PdfWriter pdfWriter, HttpServletRequest request,
        HttpServletResponse response) throws Exception {

    logger.info("Start of PDF creation");

    Domain domain = (Domain) map.get("domain");

    ServletContext servletContext = request.getSession()
            .getServletContext();
    File servletTempDir = (File) servletContext
            .getAttribute("javax.servlet.context.tempdir");

    if (servletTempDir == null)
        throw new IllegalStateException(
                "Container does not provide a temp dir");

    File targetFile = new File(servletTempDir, NAME_FILE);

    pdfWriter = PdfWriter.getInstance(document, new FileOutputStream(
            targetFile));

    logger.info("PDF file path: " + targetFile.getAbsolutePath().toString());

    document.open();

    PdfBuilder.assemble(document, pdfWriter, domain);

    document.close();
    pdfWriter.close();

    logger.info("End of PDF creation");

    map.put("file", targetFile.getAbsolutePath().toString());
}

正确的代码保存在javax中。servlet。上下文tempdir或在C:/tomcat/work/Catalina/localhost/my_spring\u app/pdf\u文件中。pdf

共有1个答案

濮赤岩
2023-03-14

我也有同样的问题。我使用以下代码解决了这个问题,文件现在正在下载,而不是呈现一个新的pfd视图页面(我更喜欢这样)。

protected final void renderMergedOutputModel(Map<String, Object> model, 
           HttpServletRequest request, HttpServletResponse response) throws Exception {

    // IE workaround: write into byte array first.
    ByteArrayOutputStream baos = createTemporaryOutputStream();

    // Apply preferences and build metadata.
    Document document = newDocument();
    PdfWriter writer = newWriter(document, baos);
    prepareWriter(model, writer, request);
    buildPdfMetadata(model, document, request);

    // Build PDF document.
    document.open();
    buildPdfDocument(model, document, writer, request, response);
    document.close();

    //Custom code start 
    String filestorePath = "/var/www/xxx/xxxxx/";
    String downloadfileNm = "DeliveryNote.pdf";
    String filePath = filestorePath+downloadfileNm;
    URL url = new URL("file:"+filePath);
    File file = new File(url.toURI());
    if (file.exists()) {
        response.setContentLength(new Long(file.length()).intValue());
        response.setHeader("Content-Disposition", "attachment; filename="+downloadfileNm);
        FileCopyUtils.copy(new FileInputStream(file), response.getOutputStream());      
    }
    //Custom code end

    // Flush to HTTP response.
    //writeToResponse(response, baos);

}
 类似资料:
  • minOccurs=“0”和maxLength value=“15”都被植入到生成的java类中。 有人能帮我吗?TNX

  • 我使用iTextPDF生成PDF,从一些文本输入中获取数据。 当我运行应用程序并创建第一个PDF时,它会按预期生成。 然后我改变一些值并生成另一个值,这就是问题所在。第一个PDF上显示的最后一个条目被打印在第二个生成的PDF的第一个条目的顶部。 不知道为什么会这样?它是保存到缓冲区还是什么的,不是很确定。 下面是生成PDF的代码: 输出请见附件图像,第一个显示第一个文件生成,第二个显示第二个文件生

  • 突然间得到了所有这些错误所有构建错误“在Android Studio中存在多个错误的清单合并失败” 当我没有得到这个建议的时候,我就用android studio提出了替换建议 "清单合并失败:属性application@appComponentFactoryvalue=(android.support.v4.app.CoreComponentFactory)from[com.android.su

  • 在我的Spring web MVC应用程序中,我计划在我的jsp视图上显示一些JFree图表,我不知道如何做到这一点,因为我的第一个想法对我不起作用,生成一个图像,然后从文件夹中检索它。 现在我想,控制器能够直接回放图像吗?假设这是我的服务接口: 我可以做这样的事情吗?我如何从我的jsp调用这个映像?

  • 问题内容: 在我的JFreeChart时间序列图中,我发现图例线条变细以准确查看颜色。另一篇文章jfreechart- 更改图例中的颜色示例 ]建议重写渲染器方法,如下所示: 这种方法行之有效,直到你做我所做的 一旦完成,图例就会恢复为一行。有什么办法解决吗? 我采用的解决方案接近于TrashGod提出的解决方案, 我覆盖了getLegendItem()方法,将图例形状强制为所需的框。 问题答案:

  • 我正在运行基于这里所示示例的代码,在OS X上使用Eclipse,我正在使用JFreeChart和JCommon库。 正如我在标题中所说,程序正在运行,但没有显示任何内容。作为检查,我尝试使用printData()方法打印数据,它工作得非常好。它正确地从yahoo csv文件中获取数据。 我甚至尝试过使用一小部分数据(20行),但它一直不显示。 问题可能只是在显示JFrame窗口时。 我插入的试图