gpt4 book ai didi

java - 如何在 iText pdf 中旋转 JFreeChart

转载 作者:行者123 更新时间:2023-12-02 00:06:05 25 4
gpt4 key购买 nike

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

最佳答案

首先:您在代码中引用了我的名字。我希望您改用 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. 请注意不要在“页面之外”旋转图像。您可能需要考虑枢轴点。

关于java - 如何在 iText pdf 中旋转 JFreeChart,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13864220/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com