【问题标题】:how to rotate a JFreeChart in iText pdf如何在 iText pdf 中旋转 JFreeChart
【发布时间】:2012-12-13 16:28:56
【问题描述】:

我创建了一个 servlet 来处理将 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)的正确方法是什么?

【问题讨论】:

  • 在对话框中弹出图像,我想您会发现问题与 PDF 无关(即代码在此之前已损坏)。为了尽快获得更好的帮助,请发布SSCCE(专门使用 J2SE)。

标签: java pdf awt itext jfreechart


【解决方案1】:

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

现在回答你的问题。有一种简单的方法可以实现您想要的,也有一种更困难的方法。

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

简单的方法是将 tp 包裹在 Image 对象中,然后旋转图像:

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

还有一个以弧度为参数的setRotation() 方法。

补充说明:

  1. 不用担心 Image 类会光栅化您的内容。包裹在Image 对象中的PdfTemplate 将生成一个Form XObject,它不会变成一个Image XObject。
  2. 注意不要将图像旋转到“页面外”。您可能需要考虑枢轴点。

【讨论】:

  • 感谢 cmets 的帮助,但是底层图像似乎没有改变。我已经粘贴了上面修改过的代码和一些截图
  • 丢失的项目是edit/2 的一部分,因为revised
  • 好的,我找到了,但现在问题更不清楚了。我对该编辑的解释是:Bizmark 创建了一个宽度或 X 高度为 Y 的图表。似乎他希望在旋转图表时完全重绘图表。这没有多大意义,我倾向于在没有进一步澄清的情况下否决这个问题。
  • 嗯,是的,我一直在寻找重绘它的方法,为什么还要在图形上调用旋转?本质上,我希望当图表最初(在浏览器中)显示为纵向时,PDF 就像是横向创建的,这样用户就不必在打开 PDF 后以横向打印或以其他方式摆弄布局。
【解决方案2】:

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

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

另外,Graphics2D.rotate 需要弧度,而不是度数。

之后,如果您为它传递转换后的 Graphics2D,JFreeChart 应该会绘制转换后的图表。

【讨论】:

  • 这可能是因为您将图像旋转到模板的可见区域之外。如果您在允许您查看内容流的工具中打开 PDF,我认为您会看到绘制图表的语法。
  • translate by -width 为我工作。另请记住,如果您在某处编写旋转/翻译的图像,则必须切换高度和宽度尺寸。
猜你喜欢
  • 1970-01-01
  • 2021-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多