2012-12-13 9 views
0

JSP로 표시된 JFreeChart의 저장을 PDF 파일로 처리하는 서블릿을 만들었습니다. 내가 지금까지 사용하고 코드는 : 나는 높이를 교환하고 반 괜찮은 볼 수있는 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를 생성 할 수있다 마치 풍경 모드에있는 것처럼 내가

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

을하려고하면

다음 PDF는 흰색, 빈 페이지를 인쇄합니다.

PDF를 만들 때 itext/Java awt API가 전체 문서 (JFreeChart 밑 포함)를 회전시키는 올바른 방법은 무엇입니까?

+1

대화 상자에서 이미지 팝하기 & nbsp; 문제는 PDF와 관련이 없다는 것을 알게 될 것입니다. 더 나은 도움을 받으려면 [SSCCE] (http://sscce.org/) (J2SE 만 사용)를 게시하십시오. –

답변

2

처음이 코드는 내 이름을 참조합니다. 대신에 extextpdf를 사용하고 싶습니다. http://lowagie.com/itext2

을 참조하십시오. 원하는 것을 성취 할 수있는 쉬운 방법이 있으며, 더 어려운 방법이 있습니다.

이 방법에서는 세 가지 매개 변수 (cb.addTemplate(tp, 0, 0);) 만 사용합니다. 즉, iText가 번역을 수행하기를 원합니다 (0 위, 0으로 오른쪽). 회전을 원한다면 7 개의 매개 변수가있는 메소드를 사용해야하며 그 중 6 개는 변형 행렬을 정의합니다. 이것은 간단한 대수학입니다. 그것은 내 책 "iText in Action"에서 설명하지만, 알고있는 대부분의 개발자는 수학을하는 것을 좋아하지 않으며 이것이 어려운 방법이라고 말합니다.

쉬운 방법은, Image 객체의 내부 목표 주가를 포장하고, 이미지를 회전 : 매개 변수로 라디안 소요 setRotation() 방법도 있습니다

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

.

추가 참고 :

  1. 콘텐츠를 래스터 이미지 클래스에 대해 걱정하지 마십시오. Image 개체 안에 포장 된 PdfTemplate은 양식 XObject가되고 이미지 XObject로 변경되지 않습니다.
  2. 이미지를 '페이지 외부로 회전하지 않도록주의하십시오. 피벗 포인트를 고려해야 할 수도 있습니다.
+0

도움이되는 의견을 보내 주셔서 감사합니다. 그러나 기본 이미지는 변경되지 않은 것 같습니다. 위의 수정 된 코드를 일부 스크린 샷으로 붙여 넣었습니다. – Bizmarck

+0

수정 사항이 표시되지 않습니다. 스크린 샷을 찾을 수 없습니다. –

+0

누락 된 항목은 [수정 됨] (http://stackoverflow.com/posts/13864220/revisions)부터 [edit/2] (http://stackoverflow.com/revisions/13864220/2)의 일부입니다. – trashgod

1

그래픽을 왼쪽 위 모퉁이를 중심으로 시계 반대 방향으로 회전하면 그리기 영역 밖으로 모든 것이 이동합니다. 이것이 바로 빈 페이지를 얻는 이유입니다. 그래픽을 도장 영역으로 다시 이동하려면 번역을 적용해야합니다. 당신이 이미지의 폭에 의해 아래로 Y 번역 :

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

또한, Graphics2D.rotate 예상하는 라디안이 아니라도.

그런 다음 JFreeChart는 변형 된 Graphics2D를 전달하면 변환 된 차트를 그려야합니다.

+0

시도해 보았을 때 그 결과는 흰색으로 계속 나타납니다. – Bizmarck

+0

그 이유는 템플릿의 보이는 영역 밖에 이미지를 회전 시켰기 때문일 것입니다. 콘텐츠 스트림을 볼 수있는 도구에서 PDF를 열면 차트를 그리는 구문을 볼 수 있다고 생각합니다. –

+0

나를 번역 한 -width로 번역합니다. 또한 회전 된/변환 된 이미지를 어딘가에 쓰는 경우 높이 및 너비 치수를 전환해야합니다. – SamHuman