2012-12-13 51 views
0

我已经创建了一个servlet来处理JSP中显示的JFreeChart到PDF文件的保存。 我使用至今的代码是:如何在iText中旋转JFreeChart pdf

import java.awt.Graphics2D; 
import java.awt.geom.Rectangle2D; 
import java.io.IOException; 
import java.io.OutputStream; 
import javax.servlet.RequestDispatcher; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import org.jfree.chart.JFreeChart; 
import com.lowagie.text.Document; 
import com.lowagie.text.DocumentException; 
import com.lowagie.text.Rectangle; 
import com.lowagie.text.pdf.DefaultFontMapper; 
import com.lowagie.text.pdf.PdfContentByte; 
import com.lowagie.text.pdf.PdfTemplate; 
import com.lowagie.text.pdf.PdfWriter; 

public class ChartPrintServlet extends HttpServlet { 

    private static final long serialVersionUID = -2445101551756014281L; 

    protected void doPost (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
    { 
     JFreeChart jFreeChart = (JFreeChart) request.getSession().getAttribute("jFreeChart"); 
     String url = ""; 
     int height = 1024; 
     int width = 1152; 

     if (jFreeChart == null) 
     { 
      url = "/do/error"; 
      RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(url); 
      dispatcher.forward(request, response); 
     } 
     else 
     { 

      AbsencesGanttChartPostProcessor postProc = new AbsencesGanttChartPostProcessor(); 
      postProc.processChart(jFreeChart, null); 
      response.setContentType("application/pdf"); 
      response.setHeader("Content-Disposition", "attachment; filename=\"absences.pdf\""); 
      OutputStream out = response.getOutputStream(); 

      try 
      { 
       Rectangle pagesize = new Rectangle(width, height); 
       Document document = new Document(pagesize.rotate(), 30, 30, 30, 30); 
       PdfWriter writer = PdfWriter.getInstance(document, out); 
       document.open(); 
       PdfContentByte cb = writer.getDirectContent(); 
       PdfTemplate tp = cb.createTemplate(height, width); 
       Graphics2D g2 = tp.createGraphics(height, width, new DefaultFontMapper()); 

       Rectangle2D r2D = new Rectangle2D.Double(0, 0, height, width); 
       jFreeChart.draw(g2, r2D); 
       g2.dispose(); 
       cb.addTemplate(tp, 0, 0); 
       document.close(); 
      } 
      catch (DocumentException de) 
      { 
       System.err.println(de.getMessage()); 
      } 
      finally 
      { 
       out.close(); 
      } 
     } 
    } 

    protected void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
    { 
     doPost(request, response); 
    } 
} 

我已经换了高度,以获得PDF看半体面宽无处不在,但我真正想要的是能够创建PDF就好像它处于横向模式一样。

如果我尝试

Graphics2D g2 = tp.createGraphics(height, width, new DefaultFontMapper()); 
g2.rotate(90) 

那么PDF只是打印出白色,空白页。

创建PDF时,使用itext/Java awt API旋转整个文档(包括下面的JFreeChart)的正确方法是什么?

+1

在对话框中弹出图像我认为您会发现问题与PDF无关(即代码在该点之前被破解)。为了更快地获得更好的帮助,请发布[SSCCE](http://sscce.org/)(仅使用J2SE)。 –

回答

2

首先这个:你在你的代码中提到我的名字。我希望你改用itextpdf。见http://lowagie.com/itext2

现在你的问题。有一个简单的方法来实现你想要的,而且还有一个更困难的方法。

您只能在此方法中使用三个参数:cb.addTemplate(tp, 0, 0);这意味着您只需要iText进行翻译(零向上,零向右)。如果您还想要旋转,则需要使用具有七个参数的方法,其中六个定义变换矩阵。这是简单的代数;在我的书“iText in Action”中有解释,但我知道的大多数开发人员不喜欢数学,他们说这是困难的方法。

简单的方法,是将包裹的Image对象内部TP,和旋转图像:

Image img = Image.getInstance(tp); 
img.setRotationDegrees(90); 

还有一个setRotation()方法,它采用弧度作为参数。

其他注意事项:

  1. 不要担心Image类栅格化内容。包含在Image对象内的PdfTemplate将导致Form XObject,它不会被更改为Image XObject。
  2. 小心不要将图像旋转到“页面外”。您可能需要考虑枢轴点。
+0

感谢您的有用评论,但底层图片似乎没有改变。我已将上面修改的代码粘贴到一些屏幕截图 – Bizmarck

+0

我看不到编辑;我无法找到屏幕截图。 –

+0

自[修订](http://stackoverflow.com/posts/13864220/revisions)以来,缺少的项目是[edit/2](http://stackoverflow.com/revisions/13864220/2)的一部分。 – trashgod

1

将图形逆时针旋转左上角,这样做会将所有内容移出绘图区域。这就是为什么你只是得到空白页。您还需要应用翻译来将图形移回绘画区域。翻译Ÿ向下由您图像的宽度:

 g.rotate(Math.PI/2); 
     g.translate(0, width); 

此外,Graphics2D.rotate预计弧度,不度。

之后,JFreeChart应绘制转换的图表,如果您通过转换的Graphics2D它。

+0

当我尝试这样做时,结果仍然是纯白色pdf – Bizmarck

+0

这可能是因为您将图像旋转到模板的可见区域之外。我认为如果您在允许您查看内容流的工具中打开PDF,您会看到绘制图表的语法。 –

+0

translate -width为我工作。另外请记住,如果您在某处编写旋转/翻译的图像,则必须切换高度和宽度尺寸。 – SamHuman