PrintableUtils作为输出信息的工具类:
package org.example; import com.itextpdf.text.*; import com.itextpdf.text.Font; import com.itextpdf.text.pdf.PdfWriter; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class PrintableUtils{ public static void saveAsTxtImage(Object object, String fileName) throws IOException {//将对象信息保存为image形式 //Image(其全路径为java.awt.Image)是一个抽象类,BufferedImage是其实现类 /*BufferedImage主要作用是将一幅图片加载到内存中 * */ BufferedImage image = new BufferedImage(500, 500, BufferedImage.TYPE_4BYTE_ABGR); /*Graphics类提供绘制各种基本的几何图形 * Graphics2D与Graphics类相比能够处理二维图形*/ // 获取图形对象 Graphics2D graphics = image.createGraphics(); // 修改画布背景为粉色 graphics.setBackground(Color.PINK); //将图形区域内部的内容清除,使其变为透明或者指定的背景色 graphics.clearRect(0, 0, image.getWidth(), image.getHeight()); // 修改字体为黑色 graphics.setColor(Color.BLACK); // 将object对象的信息写入 graphics.drawString("Order ID: " + object.toString(), 50, 50); // ImageIO可以从本地文件中读取图片和写入图片,也可以从网络上读取图片写入本地文件中 //将图片的信息保存到名字为filename的文件中,将其保存到磁盘 ImageIO.write(image, "png", new File(fileName)); } public static void saveAsPdf(Object object, String fileName) {//将对象信息保存为pdf形式 try { Document document = new Document(); //PdfWriter是iText库中的一个类,用于将文档内容写入到PDF文件中 //getInstance()是PdfWriter类的静态方法,用于获取一个PdfWriter对象的实例 PdfWriter.getInstance(document, new FileOutputStream(fileName)); document.open(); // 设置字体 Font font = new Font(Font.FontFamily.HELVETICA, 12, Font.BOLD); // 创建段落对象 Paragraph paragraph = new Paragraph(object.toString(), font); // 添加段落到文档中--add的参数类型必须为Element document.add(paragraph); // 关闭文档 document.close(); } catch (DocumentException | FileNotFoundException e) { e.printStackTrace(); } } public static void saveAsTxt(Object object, String fileName) {//将对象信息保存为txt形式 try { // 创建文件输出流 FileOutputStream fos = new FileOutputStream(fileName); // 将信息写入文件 fos.write(object.toString().getBytes()); // 关闭文件输出流 fos.close(); } catch (Exception e) { e.printStackTrace(); } } }
实体类:
package org.example; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor public class Animal { private String name; private String type; }
测试类:
package org.example; public class Test { public static void main(String[] args) { //我这里直接是默认输出到电脑当前项目的目录下,所以只传入了文件名 Animal animal=new Animal("huahua","dog"); PrintableUtils.saveAsPdf(animal,"animal.pdf"); PrintableUtils.saveAsTxtImage(animal,"animal.png"); PrintableUtils.saveAsTxt(animal,"animal.txt"); } }
相关的依赖:
<dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.11</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext-asian</artifactId> <version>5.2.0</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.12</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.13.1</version> </dependency>
关于这个功能的实现,策略者模式也可以,但是对比了一下,策略者模式实现该功能会增加类的个数,但策略者模式满足开闭原则,后期如果有了新的打印方法,不用修改源代码,只需要增加新的即可,没有最好的技术只有最合适的技术,无论使用哪种方法还是需要根据实际开发进行选择!