减少iText生成的PDF(包括时间序列条形图)的大小

减少iText生成的PDF(包括时间序列条形图)的大小,itext,jfreechart,Itext,Jfreechart,在PDF中为较大的时间跨度添加时间序列条形图会导致较大的文件大小,如50MB或更大,具体取决于数据点。以下是代码示例: 将图表添加到PDF 创建图表 JFreeChart getBarChart(){ TimeSeries系列=新的TimeSeries(“数据”); GregorianCalendar cal=新的GregorianCalendar(); 对于(int i=0;i您可以尝试设置完全压缩并比较差异: PdfReader reader = new PdfReader(new File

在PDF中为较大的时间跨度添加时间序列条形图会导致较大的文件大小,如50MB或更大,具体取决于数据点。以下是代码示例:

将图表添加到PDF 创建图表
JFreeChart getBarChart(){
TimeSeries系列=新的TimeSeries(“数据”);
GregorianCalendar cal=新的GregorianCalendar();

对于(int i=0;i您可以尝试设置完全压缩并比较差异:

PdfReader reader = new PdfReader(new FileInputStream("in.pdf"));
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("out.pdf"));
int total = reader.getNumberOfPages() + 1;
for ( int i=1; i<total; i++) {
    reader.setPageContent(i + 1, reader.getPageContent(i + 1));
}
stamper.setFullCompression();
stamper.close();
PdfReader=newpdfReader(newfileinputstream(“in.pdf”);
PdfStamper stamper=新PdfStamper(读卡器,新文件输出流(“out.pdf”));
int total=reader.getNumberOfPages()+1;

对于(int i=1;i在检查OP提供的PDF时,很快就会发现其中充满了用于绘制漂亮条形图的模式定义等。因此,要减小PDF大小,简化条形图设计是一条可行之路

在本例中,可以通过设置不同的默认条形图绘制程序(使用
xybreader.setDefaultBarPainter()
)来完成此操作。该属性的初始值是一个
GradientXYBarPainter
,但对如此小的条使用渐变会导致所需的绘图操作和操作符数量激增,同时只会在巨大的缩放级别上产生差异(如果有的话)


正如在对问题的评论中已经指出的,使用
StandardXYBarPainter
可以解决大小问题。

你能提供一个它生成的示例PDF吗?这将帮助我们确定膨胀的来源。是示例代码的输出。哇,里面有很多数据点!我会尝试关闭首先放置阴影。我认为这可能会将文件大小至少减少一半。深入观察,你真的需要一个矢量版本的图表吗?如果不需要,你可能只需要渲染到一个高DPI图像并嵌入它。我不知道它是JFree还是
PdfGraphics2D
这样做,但该图表由成千上万个图形组成对象,而不仅仅是简单的线。我猜,条形图上的渐变也增加了复杂性,如果可能的话,我也会尝试将其变为实心。您也可以尝试设置其他默认条形图绘制程序(
xybreader.setDefaultBarPainter()
)。它的初始值是
GradientXYBarPainter
,对如此小的条使用渐变会使所需的绘图操作和运算符爆炸,而如果有的话,只会在巨大的缩放级别上产生差异。设置完全压缩会将大小从170MB减少到32MB,但它仍然是一个大文件。将条形图更改为折线图将大小减小到500KB。
JFreeChart getBarChart() {
    TimeSeries series = new TimeSeries("Data");
    
    GregorianCalendar cal = new GregorianCalendar();
    for (int i=0; i<365*24; i++) {
        cal.add(Calendar.HOUR, 1);
        series.addOrUpdate(new Millisecond(cal.getTime()), Math.random());
    }
    
    XYPlot plot = new XYPlot();
    plot.setDataset(new XYBarDataset(new TimeSeriesCollection(series), 10));
    plot.setRenderer(new XYBarRenderer());
    plot.setRangeAxis(new NumberAxis());
    plot.setDomainAxis(new DateAxis());

    return new JFreeChart(plot);
}
PdfReader reader = new PdfReader(new FileInputStream("in.pdf"));
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("out.pdf"));
int total = reader.getNumberOfPages() + 1;
for ( int i=1; i<total; i++) {
    reader.setPageContent(i + 1, reader.getPageContent(i + 1));
}
stamper.setFullCompression();
stamper.close();