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

news2024/9/22 17:28:38

<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.coloradmin.cn/o/2069704.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

文心快码 Baidu Comate 前端工程师观点分享:以文心快码 Baidu Comate为例,智能代码助手需要什么(四)⓵

本系列视频来自百度工程效能部的前端研发经理杨经纬&#xff0c;她在由开源中国主办的“AI编程革新研发效能”OSC源创会杭州站105期线下沙龙活动上&#xff0c;从一款文心快码&#xff08;Baidu Comate&#xff09;前端工程师的角度&#xff0c;分享了关于智能研发工具本身的研…

一文彻底搞懂CNN - 模型架构(Model Architecture)

CNN Model Architecture CNN&#xff08;卷积神经网络&#xff09;的模型架构由输入层、卷积层、池化层以及全连接层组成&#xff0c;通过卷积操作提取图像特征&#xff0c;并通过池化减少参数数量&#xff0c;最终通过全连接层进行分类或回归。 输入层&#xff1a;接收原始图…

​14:00面试,14:06就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到5月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

BoosterX:Windows 游戏玩家都爱的电脑优化工具箱

《黑神话&#xff1a;悟空》、《艾尔登法环&#xff1a;黄金树幽影》、暴雪「全家桶」回归……今年&#xff0c;我们将迎来一场豪华的游戏大餐&#xff01; 想要畅玩游戏&#xff0c;除了要准备好给力的硬件设备&#xff0c;系统优化当然也不能落下&#xff01;BoosterX 正是一…

IO进程(8)

目录 1.信号灯集 1.1概念 1.2操作步骤 1.3函数接口 1.3.1创建信号灯集 1.3.2初始化或删除信号灯集 ​​​​​​​​​​​​​​1.3.3pv操作 ​​​​​​​​​​​​​​1.4操作命令 2.消息队列 2.1特点 ​​​​​​​​​​​​​​2.2步骤 ​​​​​​​2.3函数接口 2.3…

如何选择适合自己的开放式耳机?五款实力出众爆款安利!

开放式耳机以其不侵入耳道的设计&#xff0c;为耳朵提供了更轻的负担&#xff0c;同时保护了耳道健康&#xff0c;这与传统的头戴式或入耳式耳机相比&#xff0c;在长时间佩戴时更能减少不适感。市场上的开放式耳机种类繁多&#xff0c;要找到一款真正满意的产品可能有些困难。…

使用kubeadm快速部署一套K8S集群

一、Kubernetes概述 1.1 Kubernetes是什么 Kubernetes是Google在2014年开源的一个容器集群管理系统&#xff0c;Kubernetes简称K8S。 K8S用于容器化应用程序的部署&#xff0c;扩展和管理。 K8S提供了容器编排&#xff0c;资源调度&#xff0c;弹性伸缩&#xff0c;部署管理…

Meta被曝取消了自己的“Vision Pro计划”内部代号La Jolla

据媒体周五报道&#xff0c;美国科技巨头Meta已经取消了原定于2027年推出高端混合现实头显的计划&#xff0c;Meta原本计划利用这款设备与苹果的Vision Pro一较高下。据Meta的两名员工声称&#xff0c;在本周的一次产品审查会议后&#xff0c;公司管理层突然要求Reality Labs部…

【数据结构】动态顺序表的实现

1.什么是数据结构 数据结构就是把数据元素按照一定的关系组织起来的集合&#xff0c;用来组织和存储数据。通过数据结构&#xff0c;能够有效的将数据组织和管理在一起&#xff0c;按照我们的方式任意对数据进行增删查改等操作。 2.数据结构的分类 数据结构大概可分为逻辑结构…

拆分因子+减枝

前言&#xff1a;一开始看到数据量这么大&#xff0c;我怎么拆分出因子&#xff0c;看了题解才发现要大减枝&#xff0c;但是如何拆分因数我还是要好好学一下 1 0 18 10^{18} 1018 的拆分因子有 1 0 5 10^5 105 的复杂度&#xff0c;再乘以 1 0 3 10^3 103 的数量&#xff0c…

光伏电站设备设施巡视卡之转变二维码登记卡

光伏电站作为重要的能源供应设施&#xff0c;其稳定运行和高效维护至关重要&#xff0c;光伏电站巡回检查制度是保障电站设备正常运行和安全性的重要手段,制定好的制度可以提高电站的经济效益和安全性。 传统的纸质光伏电站巡视卡容易出现巡检记录作假、信息统计不及时、汇总困…

分享一个基于python的零食销售数据采集与可视化分析系统django爬虫项目大数据源码(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

国产实时操作系统:和RT-Linux,Zephyr的实时性对比

RT-Thread 在工业领域、高安全高可靠性领域&#xff0c;实时操作系统在其中发挥着重要的作用&#xff0c;从毫秒级&#xff0c;微秒级实时响应&#xff0c;决定着装置系统能满足何种严苛的要求。 RT-Thread Smart操作系统是一套基于RT-Thread内核&#xff0c;并具备POSIX用户态…

LeetCode84(柱状图中最大的矩形)理解单调栈

1. LeetCode84(柱状图中最大的矩形) 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 1: 输入&#xff1a;heights [2,1,5,6,2,3] 输出&#xff…

大模型时代,什么样的算法工程师更吃香?

毫无疑问&#xff0c;全栈型的算法工程师将更为抢手&#xff0c;如果你精通大模型从训练到应用的整个流程&#xff0c;你走到哪里都不怕。 但往往人的精力有限&#xff0c;如果从数据、预训练、微调、对齐、推理、应用几个方面来看的话&#xff0c;个人觉得现在重要性排序是“…

python测试框架之Pytest

初识Pytest Pytest1.Pytest的特点&#xff1a;2.Pytest的基本使用规则3.pytest安装1&#xff09;使用编译器安装2&#xff09;使用命令安装 4.pytest规则 Pytest Pytest是python的一个第三方单元测试库&#xff0c;它的目的是让单元测试变得容易&#xff0c;并且也能扩展到支持…

同一个wifi不同电脑ip一样吗?网络ip地址怎么修改

‌在数字化时代&#xff0c;Wi-Fi已成为我们日常生活与工作中不可或缺的一部分&#xff0c;它让多台设备能够轻松接入互联网&#xff0c;实现信息共享与数据传输。然而&#xff0c;你是否曾好奇过&#xff0c;在同一个Wi-Fi网络下&#xff0c;不同电脑的IP地址是否会不一样&…

10个Python自动化日常任务实战脚本示例

小编准备入门了Python入门学习籽料80个Python入门实例 点击 领取&#xff08;无偿获得&#xff09; 1. 自动备份文件夹 目标 : 每天自动将指定文件夹的内容备份到另一个位置。 import shutil import datetime def backup_files(source, destination): """…

DevEcoStudio创建的默认工程HelloWorld build失败请问如何解决?

解决方法&#xff1a; 方法一&#xff1a; 方法二&#xff1a; 确认当前登录的windows用户是否是Administrator&#xff0c;出现这种情况&#xff0c;大概率都是普通用户&#xff0c;所以造成权限不足的问题。一种解决办法是切换到Administrator用户再打开项目进行build。 如…

已拿证 | 2024深圳驾考科目四全攻略:技巧、知识点一网打尽

目录 _head 精简500题 区分变道和左转&#xff0c;变道手下垂&#xff0c;左转手伸直 紧急包扎需要柔软介质 网状线内禁止停车 会车千万不能开远光灯 只准直行 城3公4 城5公7 一急二反三连续 落水救援 驾驶陋习 车到路肩人在外 交警先看脸&#xff01;&#xff01…