当前位置: 首页 > article >正文

TXT文件转换pdf格式的java方法

<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.13.2</version>
</dependency>

接下来,编写一个方法来执行文件转换:

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfWriter;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileOutputStream;
import java.io.IOException;

public class TxtToPdfConverter {

    public static void convertTxtToPdf(String txtFilePath, String pdfFilePath) {
        Document document = new Document();
        try {
            PdfWriter.getInstance(document, new FileOutputStream(pdfFilePath));
            document.open();
            BufferedReader br = new BufferedReader(new FileReader(txtFilePath));
            String line;
            while ((line = br.readLine()) != null) {
                document.add(new Paragraph(line));
            }
            br.close();
            document.close();
            System.out.println("TXT文件已成功转换为PDF文件!");
        } catch (DocumentException | IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        String txtFilePath = "example.txt"; // 输入TXT文件路径
        String pdfFilePath = "output.pdf"; // 输出PDF文件路径
        convertTxtToPdf(txtFilePath, pdfFilePath);
    }
}

 

代码说明:

  1. 依赖项:我们使用iText库来处理PDF生成。
  2. convertTxtToPdf方法:这个方法读取指定的TXT文件,并将每一行添加到PDF文档中。
  3. PdfWriter.getInstance:用于创建PDF文件的写入器实例。
  4. BufferedReader:用于逐行读取TXT文件的内容。
  5. document.add(new Paragraph(line)):将每一行文本添加为PDF中的段落。

使用方法:

  1. 将TXT文件路径和生成的PDF文件路径传入convertTxtToPdf方法。
  2. 运行程序,生成的PDF文件将保存在指定位置。

这里有个问题,我们在转换后发现这个出现了错误,转化出来的PDF里面是数字,并非文字。

这是因为:

提到转换后的内容显示为数字,这可能是因为使用了不兼容的字体或字符编码的问题。在iText中,默认使用的字体可能不支持某些字符集,特别是中文字符。这会导致生成的PDF文件中出现乱码或意外的字符(如数字或方块)。

为了解决这个问题,你需要为PDF文档指定一种支持中文字符的字体。你可以使用iText中的BaseFont类来加载字体文件,并在生成PDF时指定使用该字体。

下面是一个修改后的示例代码,添加了对中文字符的支持:

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileOutputStream;
import java.io.IOException;

public class TxtToPdfConverter {

    public static void convertTxtToPdf(String txtFilePath, String pdfFilePath) {
        Document document = new Document();
        try {
            PdfWriter.getInstance(document, new FileOutputStream(pdfFilePath));
            document.open();

            // 设置支持中文的字体
            BaseFont bf = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            com.itextpdf.text.Font font = new com.itextpdf.text.Font(bf);

            BufferedReader br = new BufferedReader(new FileReader(txtFilePath));
            String line;
            while ((line = br.readLine()) != null) {
                // 使用指定的字体添加文本
                document.add(new Paragraph(line, font));
            }
            br.close();
            document.close();
            System.out.println("TXT文件已成功转换为PDF文件!");
        } catch (DocumentException | IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        String txtFilePath = "example.txt"; // 输入TXT文件路径
        String pdfFilePath = "output.pdf"; // 输出PDF文件路径
        convertTxtToPdf(txtFilePath, pdfFilePath);
    }
}

修改说明:

  1. 字体设置:通过BaseFont.createFont方法加载一个支持中文字符的字体。在这个例子中,使用了"STSongStd-Light"字体,这是一种常见的简体中文字体。

  2. BaseFont.createFont方法参数

    • "STSongStd-Light":字体名称。
    • "UniGB-UCS2-H":中文字体的编码。
    • BaseFont.NOT_EMBEDDED:表示不嵌入字体文件,可以根据需要更改为BaseFont.EMBEDDED
  3. 指定字体:在创建Paragraph对象时,传入字体font,确保文本显示为指定的字体格式。

这样做可以确保你的TXT文件在转换为PDF时能够正确显示中文或其他非ASCII字符。如果你使用其他语言的特殊字符,也可以通过更换支持相应字符集的字体来解决问题。

我继续运行后报错:

com.itextpdf.text.DocumentException: Font 'STSongStd-Light' with 'UniGB-UCS2-H' is not recognized.
	at com.itextpdf.text.pdf.BaseFont.createFont(BaseFont.java:716)
	at com.itextpdf.text.pdf.BaseFont.createFont(BaseFont.java:625)
	at com.itextpdf.text.pdf.BaseFont.createFont(BaseFont.java:460)
	at TxtToPdfConverter.convertTxtToPdf(TxtToPdfConverter.java:21)
	at TxtToPdfConverter.main(TxtToPdfConverter.java:41)

出现这个错误是因为iText库没有找到你指定的字体。STSongStd-Light字体可能不在你当前的字体路径或环境中。为了避免这个问题,你可以使用系统中的字体文件或指定一个明确的字体路径。

下面是如何使用系统字体文件来修复这个问题的示例:

 

解决方案:使用本地系统中的字体文件

  1. 找到字体文件:在操作系统中找到一个支持中文的字体文件(通常是.ttf.ttc文件)。例如,在Windows上,SimSun.ttf(宋体)通常是一个可用的中文字体。你可以在C:\Windows\Fonts\目录中找到它。

  2. 指定字体文件路径:使用字体文件的完整路径来创建BaseFont对象。

下面是修改后的代码:

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileOutputStream;
import java.io.IOException;

public class TxtToPdfConverter {

    public static void convertTxtToPdf(String txtFilePath, String pdfFilePath) {
        Document document = new Document();
        try {
            PdfWriter.getInstance(document, new FileOutputStream(pdfFilePath));
            document.open();

            // 使用系统中的字体文件
            String fontPath = "C:/Windows/Fonts/simsun.ttc,1";  // Windows系统上的字体文件路径
            BaseFont bf = BaseFont.createFont(fontPath, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            com.itextpdf.text.Font font = new com.itextpdf.text.Font(bf);

            BufferedReader br = new BufferedReader(new FileReader(txtFilePath));
            String line;
            while ((line = br.readLine()) != null) {
                // 使用指定的字体添加文本
                document.add(new Paragraph(line, font));
            }
            br.close();
            document.close();
            System.out.println("TXT文件已成功转换为PDF文件!");
        } catch (DocumentException | IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        String txtFilePath = "example.txt"; // 输入TXT文件路径
        String pdfFilePath = "output.pdf"; // 输出PDF文件路径
        convertTxtToPdf(txtFilePath, pdfFilePath);
    }
}

关键更改:

  • fontPath:这是字体文件的路径。在Windows系统中,可以使用"C:/Windows/Fonts/simsun.ttc,1"路径。ttc文件是字体集合,,1表示选择集合中的第一个字体。你也可以使用其他支持中文的字体文件,例如SimHei.ttf(黑体)。

  • BaseFont.IDENTITY_H:这是字符编码,表示使用Unicode编码。

运行提示:

  1. 确保你在代码中使用的是系统中存在的字体文件路径。如果你使用的是Linux或macOS,字体文件路径可能有所不同,你需要找到系统中合适的字体文件并指定其路径。

  2. 如果字体文件路径不正确或字体文件不存在,程序将抛出异常。因此,确保路径和字体文件名称准确无误。

这样,生成的PDF文件应该能够正确显示中文字符。如果你在其他系统上运行此代码,请相应调整字体路径。


http://www.kler.cn/a/281726.html

相关文章:

  • Springboot开发常见问题及对应的解决方案
  • 深入理解分页及 PageHelper 使用细节与注意事项
  • WPF MVVM框架
  • leetcode 扫描线专题 06-leetcode.836 rectangle-overlap 力扣.836 矩形重叠
  • C++线程基础使用方法
  • Django5 2024全栈开发指南(一):框架简介、环境搭建与项目结构
  • Spring Security 使用教程
  • 零基础5分钟上手亚马逊云科技-云原生架构设计
  • Ubuntu20.04安装 docker和docker-compose环境
  • 数据分析之Python对数据分组排序
  • 【qiankun】使用总结
  • 【C语言从不挂科到高绩点】04-流程控制语句-if
  • 与树懒论文一起展望学术写作的未来:AI与人类创造力的交汇点
  • 【Linux应用编程实战】常见函数应用
  • 程序猿成长之路之数据挖掘篇——Kmeans聚类算法
  • SpringBoot日常:Spring之@PostConstruct解析
  • Windows中Jupyter notebook设置默认目录
  • 全志/RK安卓屏一体机:医疗手推车解决方案,支持鸿蒙国产化
  • 中间件实时监控,运维难题一站解决
  • 【LeetCode】搜索旋转排序数组[python]
  • 【Linux】如何用一条命令终止某个后台进程?
  • AI学习记录 - 模型训练中怎么反向传播以及学习率的影响
  • CSS 的font-synthesis属性与中文体验增强
  • 手机号码归属地查询如何用PHP进行调用
  • zoom 会议 javascript 转录例子
  • 第四十篇-TeslaP40+Ollama+Ollama-WebUI(自编译)