PrintableUtils作为输出信息的工具类:
java
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();
}
}
}
实体类:
java
package org.example;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Animal {
private String name;
private String type;
}
测试类:
java
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");
}
}
相关的依赖:
java
<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>
关于这个功能的实现,策略者模式也可以,但是对比了一下,策略者模式实现该功能会增加类的个数,但策略者模式满足开闭原则,后期如果有了新的打印方法,不用修改源代码,只需要增加新的即可,没有最好的技术只有最合适的技术,无论使用哪种方法还是需要根据实际开发进行选择!