2012-12-13 46 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