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.rhkb.cn/news/408937.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络-物理层

物理层 基本概念 物理层考虑怎样才能在连接各种计算机的传输媒体上传输数据比特流 物理层为数据链路层屏蔽了各种传输媒体的差异&#xff0c;使数据链路层只需要考虑如何完成本层的协议和服务&#xff0c;而不必考虑网络具体的传输媒体是什么 物理层协议主要任务 机械特性&am…

小兔鲜首页制作css

一、项目目录 项目名-客户端 xtx-pc 1.images&#xff1a;存放固定使用的图片&#xff0c;例如&#xff1a;logo、样式修饰图 2.uploads:存放非固定图片&#xff0c;例如&#xff1a;商品图、宣传图等需要上传的图片 3.iconfont:字体图标素材 4.css文件&#xff1a; 4.1base.cs…

C语言 | Leetcode C语言题解之第371题两整数之和

题目&#xff1a; 题解&#xff1a; int getSum(int a, int b){ int c; while(b) {c(unsigned int)(a&b)<<1;a^b;bc; }return a; }

资产架构端口应用CDNWAF站库分离负载均衡

知识点&#xff1a; 1、资产架构-端口&目录&插件接口&多站点&多应用 2、番外安全-域名&服务器本身&服务厂商&管理人员 3、考虑阻碍-站库分离&CDN&WAF&负载均衡&主机防护 详细点&#xff1a; 1、前置条件-购买使用-云服务器&a…

第135天:内网安全-横向移动非约束委派约束委派数据库攻防

案例一: 横向移动-原理利用-非约束委派 该案例建立了解即可&#xff0c;真实环境应该不可能有人这样配置 非约束委派的原理和利用场景 原理&#xff1a; 机器 A &#xff08;域控&#xff09;访问具有非约束委派权限的机器 B 的服务&#xff0c;会把当前认证用户&#x…

Admin.NET源码学习(4:基于Furion的后台服务启动方式浅析)

Admin.NET为前后端分离架构&#xff0c;后台服务的入口项目为Admin.NET.Web.Entry&#xff0c;其与其它项目的依赖关系如下图所示。   由于项目采用Furion框架&#xff0c;后台服务启动方式、注册方式、配置方式等方面与常规的asp.net core项目差异明显&#xff0c;初步接触…

初识C语言指针(5)

目录 1. 回调函数 2. qsort函数 2.1 qsort函数的基本参数 2.2 qsort函数的使用 2.3 qsort排序结构体类型数据 结语 1. 回调函数 什么是回调函数呢&#xff1f;回调函数就是⼀个通过函数指针调⽤的函数。 如果你把函数的指针&#xff08;地址&#xff09;作为参数传递给另…

如何使用ssm实现铁岭河医院医患管理系统+vue

TOC ssm077铁岭河医院医患管理系统vue 系统概述 进过系统的分析后&#xff0c;就开始记性系统的设计&#xff0c;系统设计包含总体设计和详细设计。总体设计只是一个大体的设计&#xff0c;经过了总体设计&#xff0c;我们能够划分出系统的一些东西&#xff0c;例如文件、文…

《黑神话:悟空》中的实景三维建模

这几天&#xff0c;国产游戏《黑神话:悟空》终于面世&#xff0c;迅速引爆了全球游戏市场。作为一款以《西游记》为背景的3A级动作角色扮演游戏&#xff0c;《黑神话:悟空》不仅在文化表达上极具吸引力&#xff0c;其背后的技术实力更是令人瞩目。本文将深入探讨&#xff0c;3A…

UEditor百度富文本后端上传文件接口

UEditor百度富文本后端上传文件接口 直接上代码 接口&#xff1a; RequestMapping("/UEditorConfig")public String list(HttpServletRequest request, HttpServletResponse response) throws IOException {String config environment.getProperty("ueditor.c…

C/C++逆向:寻找main函数(Debug-x86)

在程序的逆向分析中&#xff0c;寻找main函数在逆向分析中是非常重要的&#xff0c;它是程序的核心执行点&#xff0c;从这里开始&#xff0c;程序的主要逻辑开始展开&#xff1b;在这边我们需要明确两个概念&#xff1a;用户入口&#xff08;User Entry Point&#xff09; 和 …

【HarmonyOS】鸿蒙应用蓝牙功能实现 (三)

【HarmonyOS】鸿蒙应用蓝牙功能实现 &#xff08;三&#xff09; 前言 今天整理蓝牙Demo代码&#xff0c;查看官网时发现自己帐号没有登录&#xff0c;竟然也可以访问最新的API文档&#xff0c;真是喜大奔普。看来华为已经开始对外开放最新的API文档&#xff0c;不再有白名单…

《机器学习》—— 使用过采样方法实现逻辑回归分类问题

文章目录 一、什么是过采样方法&#xff1f;二、使用过采样方法实现逻辑回归分类问题三、过采样的优缺点 本篇内容是 基于Python的scikit-learn库中sklearn.linear_model 类中的 LogisticRegression&#xff08;&#xff09;逻辑回归方法实现的&#xff0c;其内容中只是在处理…

使用Java进行中小学违规教育培训数据采集实践-以某城市为例

目录 前言 一、违规教育信息 1、内容管理 2、转换后的内容 二、数据库设计 1、空间数据库 三、字符地址位置转换空间信息 1、实现时序图 2、后台实体类的设计与实现 3、数据持久化操作 四、总结 前言 时间来到2024年8月24日&#xff0c;时间过得很快&#xff0c;2024…

芯片后端之 PT 使用 report_timing 产生报告 之 -include_hierarchical_pins 选项

今天,我们再学习一点点 后仿真相关技能。 那就是,了解 report_timing 中的 -include_hierarchical_pins 选项。 如果我们仅仅使用如下命令,执行后会发现: pt_shell> report_timing -from FF1/CK -to FF2/d -delay_type max 我们使用命令 report_timing 报出的如上路…

C++篇:C向C++迈进(上)

引言 C语言作为编程基石&#xff0c;其高效与直接性深受开发者喜爱。然而&#xff0c;随着软件复杂度的增加&#xff0c;C以其面向对象及高级特性成为了新的选择。我们接下来将学习C&#xff0c;从C语言迈向C。 什么是C C 是一种高级语言&#xff0c;由 Bjarne Stroustrup 于…

python测试框架之Pytest

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

VSCode插件 live Server

普通打开 安装live Server 包含端口 说明内置了服务器

视频插帧—— RIFE 和 IFNet 的机制和应用

介绍 最近&#xff0c;数字和模拟技术开始加速融合。我们生活在一个人工智能技术能够显著提高质量的时代&#xff0c;只要模拟材料能够数字化。 例如&#xff0c;讨论中涉及到的纸艺软件&#xff0c;纸龙的移动模型被时间锁定&#xff0c;以大约 3 fps&#xff08;每秒帧数&a…

一元四次方程求解-【附MATLAB代码】

目录 前言 求解方法 MATLAB验证 附&#xff1a;一元四次方程的故事 前言 最近在研究机器人的干涉&#xff08;碰撞&#xff09;检测&#xff0c;遇到了一个问题&#xff0c;就是在求椭圆到原点的最短距离时&#xff0c;构建的方程是一个一元四次方程。无论是高中的初等数学…