使用itextpdf、jfree、transcoder生成清晰的柱状图

2023-12-02 10:45

本文主要是介绍使用itextpdf、jfree、transcoder生成清晰的柱状图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

项目需求:在PDF文件中生成柱状图

需求难点:使用网上大家提供能的代码只能完成生成柱状图,但是pdf中展示出来的效果是比较模糊的,尤其是在中文汉字上的表现,基本不能使用

功能实现:

1.相关jar包:

<dependency><groupId>com.itextpdf</groupId><artifactId>itext7-core</artifactId><version>7.0.6</version>
</dependency>
<dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version>
</dependency>
<dependency><groupId>com.itextpdf</groupId><artifactId>font-asian</artifactId><version>7.1.16</version>
</dependency> 
<dependency><groupId>org.jfree</groupId><artifactId>jfreechart</artifactId><version>1.5.4</version>
</dependency>
<dependency><groupId>org.jfree</groupId><artifactId>jcommon</artifactId><version>1.0.24</version>
</dependency>
<dependency><groupId>org.jfree</groupId><artifactId>jfreesvg</artifactId><version>3.4.3</version>
</dependency>
<dependency><groupId>org.apache.xmlgraphics</groupId><artifactId>batik-transcoder</artifactId><version>1.14</version>
</dependency>
<dependency><groupId>org.apache.xmlgraphics</groupId><artifactId>batik-codec</artifactId><version>1.14</version>
</dependency>

2.实现原理:使用JFreeChart生成svg格式图片,然后使用batik.transcoder将svg图片转换成png格式图片,不经过svg转png过程直接生成png格式时图片模糊无法使用。

3.代码实现:

import java.awt.BasicStroke;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.text.SimpleDateFormat;
import java.util.Date;import org.apache.batik.transcoder.Transcoder;
import org.apache.batik.transcoder.TranscoderInput;
import org.apache.batik.transcoder.TranscoderOutput;
import org.apache.batik.transcoder.image.ImageTranscoder;
import org.apache.batik.transcoder.image.PNGTranscoder;
import org.fusesource.hawtbuf.ByteArrayInputStream;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.StandardChartTheme;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.renderer.category.StandardBarPainter;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.graphics2d.svg.SVGGraphics2D;import com.itextpdf.io.font.PdfEncodings;
import com.itextpdf.io.image.ImageDataFactory;
import com.itextpdf.kernel.color.Color;
import com.itextpdf.kernel.color.DeviceRgb;
import com.itextpdf.kernel.events.PdfDocumentEvent;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.border.SolidBorder;
import com.itextpdf.layout.element.Cell;
import com.itextpdf.layout.element.Div;
import com.itextpdf.layout.element.Image;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.element.Table;
import com.itextpdf.layout.property.HorizontalAlignment;
import com.itextpdf.layout.property.TextAlignment;
import com.itextpdf.layout.property.VerticalAlignment;
import com.minxue.util.common.DateUtils;
import com.minxue.util.common.PropertisUtil;
import com.minxue.util.common.StringUtil;
import com.minxue.util.pdf.VacationHoistEventHandlerA4SingleFaceOneCol;
import com.minxue.util.qrCode.QRCodeUtil;/*** @author Administrator* @date 2023年11月23日*/
public class PdfTablesTest {public static void main(String[] args) {try {String studentId = "123456";String temp = DateUtils.formatDateTimeToStr2(DateUtils.getNowTime());String folder1 =PropertisUtil.getInstance().getTempDir() +File.separator +"VacationHoist";File dirfolder1 = new File(folder1);if (!dirfolder1.exists()){dirfolder1.mkdirs();dirfolder1.setReadable(true, false);dirfolder1.setExecutable(true, false);dirfolder1.setWritable(true, false);}String folder2 =PropertisUtil.getInstance().getTempDir() +File.separator +"VacationHoist"+File.separator+studentId;File dirfolder2 = new File(folder2);if (!dirfolder2.exists()){dirfolder2.mkdirs();dirfolder2.setReadable(true, false);dirfolder2.setExecutable(true, false);dirfolder2.setWritable(true, false);}String folder3 =PropertisUtil.getInstance().getTempDir() +File.separator +"VacationHoist"+File.separator+studentId +File.separator + temp;File dirfolder3 = new File(folder3);if (!dirfolder3.exists()){dirfolder3.mkdirs();dirfolder3.setReadable(true, false);dirfolder3.setExecutable(true, false);dirfolder3.setWritable(true, false);}//String doc1 = PropertisUtil.getInstance().getTempDir() +File.separator +"VacationHoist"+File.separator+studentId+File.separator + temp;String fileName1 = PropertisUtil.getInstance().getTempDir() +File.separator +"VacationHoist"+File.separator+studentId+File.separator + temp+File.separator+ "scoreAnaLysis_1.pdf";String filepath = PropertisUtil.getInstance().getTempDir() + File.separator;String qrcodeName = filepath   +PropertisUtil.getInstance().getTemplate()+File.separator+ "qrLogo.jpg";PageSize ps = PageSize.A4;PdfFont sysFont1 = null;String fonts_dir = PropertisUtil.getInstance().getFonts_dir();sysFont1 = PdfFontFactory.createFont(fonts_dir, PdfEncodings.IDENTITY_H, false);Document document = null;PdfDocument pdfDoc = new PdfDocument(new PdfWriter(fileName1));pdfDoc.addEventHandler(PdfDocumentEvent.END_PAGE, new VacationHoistEventHandlerA4SingleFaceOneCol("西安xxxx中       高三(2031班)       xxx【数学】                                       2024届高三入学摸底考试 数学", "https://wx.xxxxxx.com/wechat", qrcodeName, filepath));//传期数 账号document = new Document(pdfDoc, ps);// 构建文档对象createBarChar(document,sysFont1);document.close();} catch (Exception e) {e.printStackTrace();}}public static void createBarChar(Document document, PdfFont sysFont1) throws Exception {//echart图表DefaultCategoryDataset defaultCategoryDataset = new DefaultCategoryDataset();defaultCategoryDataset.addValue(5,"其他人","160-150");defaultCategoryDataset.addValue(20,"其他人","150-140");defaultCategoryDataset.addValue(100,"其他人","140-130");defaultCategoryDataset.addValue(11,"其他人","130-120");defaultCategoryDataset.addValue(8,"其他人","120-110");defaultCategoryDataset.addValue(5,"其他人","110-100");defaultCategoryDataset.addValue(14,"我的位置","100-90");defaultCategoryDataset.addValue(7,"其他人","90-80");defaultCategoryDataset.addValue(30,"其他人","80-70");defaultCategoryDataset.addValue(7,"其他人","70-60");defaultCategoryDataset.addValue(8,"其他人","60-50");defaultCategoryDataset.addValue(9,"其他人","50-40");defaultCategoryDataset.addValue(4,"其他人","40-30");defaultCategoryDataset.addValue(3,"其他人","30-20");defaultCategoryDataset.addValue(2,"其他人","20-10");defaultCategoryDataset.addValue(12,"其他人","10-0");StandardChartTheme chartTheme = new StandardChartTheme("CN");chartTheme.setExtraLargeFont(new java.awt.Font("微软雅黑", java.awt.Font.BOLD,8));chartTheme.setRegularFont(new java.awt.Font("微软雅黑", java.awt.Font.BOLD,8));chartTheme.setLargeFont(new java.awt.Font("微软雅黑", java.awt.Font.BOLD,8));ChartFactory.setChartTheme(chartTheme);//JFreeChart chart = ChartFactory.createBarChart("趋势图", "各项分布","比例分值",defaultCategoryDataset);JFreeChart chart = ChartFactory.createBarChart("", "","人数",defaultCategoryDataset);chart.setBackgroundPaint(java.awt.Color.white);//chart.setTextAntiAlias(false);//chart.setAntiAlias(true);CategoryPlot categoryplot = chart.getCategoryPlot();// 图本身org.jfree.chart.axis.CategoryAxis domainAxis = categoryplot.getDomainAxis();domainAxis.setCategoryLabelPositions(CategoryLabelPositions.createUpRotationLabelPositions(70));BarRenderer brender = new BarRenderer();//设置柱子为平面效果brender.setBarPainter(new StandardBarPainter()); brender.setSeriesPaint(0, java.awt.Color.decode("#61CAFF"));brender.setSeriesPaint(1, java.awt.Color.decode("#78AB41"));brender.setSeriesStroke(0, new BasicStroke(4));brender.setSeriesStroke(0, new BasicStroke(4));brender.setShadowVisible(false);//设置柱状图的顶端显示数字brender.setIncludeBaseInRange(true);brender.setDefaultItemLabelGenerator(new StandardCategoryItemLabelGenerator());brender.setDefaultItemLabelsVisible(true);brender.setDefaultItemLabelFont(new java.awt.Font("微软雅黑", java.awt.Font.BOLD,8));//brender.setBarPainter(new StandardBarPainter());// 标准的渲染器(支持颜色渐变)brender.setItemMargin(0);// 设置图的背景为白色categoryplot.setBackgroundPaint(java.awt.Color.WHITE);categoryplot.setRangeGridlinePaint(java.awt.Color.decode("#B6A2DE"));categoryplot.setOutlineVisible(false);categoryplot.setRenderer(brender);SVGGraphics2D g2 = new SVGGraphics2D(500, 300);java.awt.geom.Rectangle2D area = new java.awt.geom.Rectangle2D.Double(0, 0, 500, 300);chart.draw(g2, area );InputStream is = new ByteArrayInputStream(g2.getSVGDocument().getBytes());OutputStream out = new FileOutputStream(new File("D:\\data\\mxjy_pdf\\VacationHoist\\x.png"));out = new BufferedOutputStream(out);Transcoder transcoder = new PNGTranscoder();TranscoderInput input = new TranscoderInput(is);TranscoderOutput output = new TranscoderOutput(out);transcoder.addTranscodingHint(ImageTranscoder.KEY_WIDTH, 1024f);transcoder.addTranscodingHint(ImageTranscoder.KEY_HEIGHT, 614f);transcoder.transcode(input, output);Image image = new Image(ImageDataFactory.create("D:\\data\\mxjy_pdf\\VacationHoist\\x.png"));document.add(image);}
}

4.实现效果:

svg转png图片:

(1)JfreeChart之柱状图_jfreechart柱状图-CSDN博客

JFreeChart| 图解JFreeChart中的条形图/柱状图(BarChart)_jfreechart柱状图-CSDN博客

使用报表功能SpringBoot + itextpdf +JfreeEhart+vue实现后端饼图柱状图写进PDF一并导出后,摸鱼时间又长了_itextpdf 柱状图-CSDN博客

这篇关于使用itextpdf、jfree、transcoder生成清晰的柱状图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/445033

相关文章

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)

《java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)》:本文主要介绍java中pdf模版填充表单踩坑的相关资料,OpenPDF、iText、PDFBox是三... 目录准备Pdf模版方法1:itextpdf7填充表单(1)加入依赖(2)代码(3)遇到的问题方法2:pd

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

C#中lock关键字的使用小结

《C#中lock关键字的使用小结》在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时,其他线程无法访问同一实例的该代码块,下面就来介绍一下lock关键字的使用... 目录使用方式工作原理注意事项示例代码为什么不能lock值类型在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时