0

JSP に表示された 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を含む)を回転させる正しい方法は何ですか?

4

2 に答える 2

2

まずこれ:あなたのコードで私の名前を参照しています。代わりに itextpdf を使用してください。http://lowagie.com/itext2を参照

それでは質問です。やりたいことを実現する簡単な方法と、もっと難しい方法があります。

このメソッドでは 3 つのパラメーターのみを使用cb.addTemplate(tp, 0, 0);します。つまり、iText に翻訳を実行させるだけです (ゼロを上に、ゼロを右に)。回転も必要な場合は、メソッドを 7 つのパラメータで使用する必要があり、そのうちの 6 つが変換行列を定義します。これは単純な代数です。私の著書「iText in Action」で説明されていますが、私が知っているほとんどの開発者は数学を行うのが好きではなく、これが難しい方法だと言います。

簡単な方法は、Image オブジェクト内で tp をラップし、画像を回転させることです。

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

setRotation()ラジアンをパラメーターとして取るメソッドもあります。

その他の注意事項:

  1. Image クラスがコンテンツをラスタライズすることについて心配する必要はありません。PdfTemplateオブジェクト内にラップされるImageと、フォーム XObject になり、イメージ XObject には変更されません。
  2. 画像を「ページの外」で回転しないように注意してください。ピボット ポイントを考慮する必要がある場合があります。
于 2012-12-13T17:52:29.853 に答える
1

グラフィックスを左上隅を中心に反時計回りに回転すると、すべてが描画領域の外に移動します。これが、空白のページを取得する理由です。グラフィックスをペインティング領域に戻すためにも、変換を適用する必要があります。画像の幅だけ y を下に移動します。

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

また、Graphics2D.rotateは度ではなくラジアンを想定しています。

その後、変換された Graphics2D を渡した場合、JFreeChart は変換されたチャートを描画する必要があります。

于 2012-12-13T16:45:07.063 に答える