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

XML 复制代码
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.13.2</version>
</dependency>

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

java 复制代码
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时指定使用该字体。

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

java 复制代码
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字符。如果你使用其他语言的特殊字符,也可以通过更换支持相应字符集的字体来解决问题。

我继续运行后报错:

java 复制代码
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对象。

下面是修改后的代码:

java 复制代码
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文件应该能够正确显示中文字符。如果你在其他系统上运行此代码,请相应调整字体路径。

相关推荐
东阳马生架构3 分钟前
商品中心—1.B端建品和C端缓存的技术文档
java
Chan166 分钟前
【 SpringCloud | 微服务 MQ基础 】
java·spring·spring cloud·微服务·云原生·rabbitmq
LucianaiB9 分钟前
如何做好一份优秀的技术文档:专业指南与最佳实践
android·java·数据库
Eiceblue25 分钟前
Python读取PDF:文本、图片与文档属性
数据库·python·pdf
面朝大海,春不暖,花不开33 分钟前
自定义Spring Boot Starter的全面指南
java·spring boot·后端
得过且过的勇者y33 分钟前
Java安全点safepoint
java
夜晚回家1 小时前
「Java基本语法」代码格式与注释规范
java·开发语言
斯普信云原生组1 小时前
Docker构建自定义的镜像
java·spring cloud·docker
wangjinjin1801 小时前
使用 IntelliJ IDEA 安装通义灵码(TONGYI Lingma)插件,进行后端 Java Spring Boot 项目的用户用例生成及常见问题处理
java·spring boot·intellij-idea
wtg44521 小时前
使用 Rest-Assured 和 TestNG 进行购物车功能的 API 自动化测试
java