实现将信息作为txt,pdf,图片的形式保存到电脑~

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>

关于这个功能的实现,策略者模式也可以,但是对比了一下,策略者模式实现该功能会增加类的个数,但策略者模式满足开闭原则,后期如果有了新的打印方法,不用修改源代码,只需要增加新的即可,没有最好的技术只有最合适的技术,无论使用哪种方法还是需要根据实际开发进行选择!

相关推荐
左夕1 小时前
分不清apply,bind,call?看这篇文章就够了
前端·javascript
Zha0Zhun2 小时前
一个使用ViewBinding封装的Dialog
前端
兆子龙2 小时前
从微信小程序 data-id 到 React 列表性能优化:少用闭包,多用 data-*
前端
滕青山2 小时前
文本行过滤/筛选 在线工具核心JS实现
前端·javascript·vue.js
时光不负努力2 小时前
编程常用模式集合
前端·javascript·typescript
恋猫de小郭2 小时前
Apple 的 ANE 被挖掘,AI 硬件公开,宣传的 38 TOPS 居然是"数字游戏"?
前端·人工智能·ios
小岛前端2 小时前
Node.js 宣布重大调整,运行十年的规则要改了!
前端·node.js
OpenTiny社区2 小时前
OpenTiny NEXT-SDK 重磅发布:四步把你的前端应用变成智能应用
前端·javascript·ai编程
梦想CAD控件2 小时前
在线CAD开发包结构与功能说明
前端·javascript·vue.js
张拭心2 小时前
春节后,有些公司明确要求 AI 经验了
android·前端·人工智能