itextpdf生成pdf中文乱码 (乱码中挣扎的自述)

article/2025/8/23 0:00:04

生成pdf文件的方法有很多,网上也有很多的介绍,本文主要主要是讲生成pdf乱码的问题,而且还十分诡异,具体生成pdf的步骤同学们可以自己百度,也可以参考如下链接:

https://www.cnblogs.com/LUA123/p/5108007.html

 

最开始我也是参考这篇文章来制作pdf的,但是坑爹的步骤开始了,一开始就是中文不显示的问题,然后我就想到了是不是字体什么的不支持的问题,然后就找到了设置字体的方法,导入jar包itext-asian,添加如下代码:

 AcroFields form = stamper.getAcroFields();// 设置字体,防止中文乱码
// 引用jar包itext-asian
BasFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); ArrayList<BaseFont> fontList = new ArrayList<BaseFont>(1);
fontList.add(bf);
form.setSubstitutionFonts(fontList); 

 然后运行代码,生成pdf,效果还不错,可以显示中文,然后就调调格式,以为即将结束的时候,坑爹的时候开始了,在用户的机子上打开,中文全是乱码

what are you 弄啥呢!!!

然后我开始怀疑是不是自己编辑器设置的编码集什么的问题,开始各种查找,都确认没问题呢,然后又是网上一通搜索“itextpdf生成pdf中文乱码”,都是这种写法,没毛病啊。

在没有办法了的情况下,我把客户那里生成的pdf复制到了我自己电脑上,用自己的pdf阅读器,word以google浏览器打开都是正常的。顿时我心中一万头草泥马崩腾而过。

我再次转战到客户的机子上,也用word和google打开了那一份pdf文件,咦……是中文呀。。。难道是我刚才错觉?再次用pdf阅读器打开,现实再一次打击到了我,中文依旧乱码,我顿时冒火了,这什么破阅读器,啥烂玩意儿,是不是没有升级到最新版,我立马找到了阅读器顶上的帮助,点进去,然后再到官网查看对比,虽然不是最新版,但是也不算就,去年底出来的,我心中那一顿火,立马把这个破阅读器和作者骂了千百回,从此我深深的记住了这个阅读器的名字:Apabi Reader

骂归骂,问题还是要解决,而且客户那边基本上都安装的是这个破烂玩意儿,于是乎,我又开始了无尽头的查找,终于在快要绝望的时候,无意间发现了一个利用本地字体来写pdf的文章,自己脑中也产生了一个想法,是不是itext-asian 中的字体他不支持,于是我讲windows自带的字体复制了一个出来放在项目中,将上面的代码更改如下:

 AcroFields form = stamper.getAcroFields();// 设置字体,防止中文乱码
// // 引用jar包itext-asian
// BasFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); 
// 在个别pdf中引用的字体在个别pdf阅读器中会出现乱码,如:Apabi Reader,引用字体文件(一定记得字体后加“,1”)
BaseFont bf = BaseFont.createFont("D:/sumsun.ttc,1",BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
ArrayList<BaseFont> fontList = new ArrayList<BaseFont>(1);
fontList.add(bf);
form.setSubstitutionFonts(fontList); 

 依然没解决,那应该是模板设置的字体有问题,然后,我就讲模板中所有的字体也都设置成“宋体”,再试,终于搞定,真的是风雨后见彩虹啊。。。

 

最后,附上所有源码,仅供参考:

package com.sqxxcx.customer.ssjjfx.utils;import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;import com.itextpdf.text.BadElementException;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfCopy;
import com.itextpdf.text.pdf.PdfImportedPage;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;public class PDFUtil {private static String PDF_TEMPLATE_PATH = null;private static PDFUtil pdfUtil = null;public static PDFUtil getInstance() {if (null == pdfUtil) {pdfUtil = new PDFUtil();}return pdfUtil;}private void getPdfTemplate() {if (null == PDF_TEMPLATE_PATH) {// pdf模板路径PDF_TEMPLATE_PATH = this.getClass().getClassLoader().getResource("security/last_template.pdf").getPath();}}/*** * @param pdfValues 生产pdf所需要的数据* @param pdfPath   生成的新文件路径* @param sealPath  印章路径* @throws IOException* @throws DocumentException*/public void generateFile(Map<String, String> pdfValues, String pdfPath, String sealPath)throws IOException, DocumentException {getPdfTemplate();PdfReader reader = null;FileOutputStream out = null;ByteArrayOutputStream bos = null;PdfStamper stamper = null;System.out.println(new File(PDF_TEMPLATE_PATH).getAbsoluteFile());reader = new PdfReader(PDF_TEMPLATE_PATH);// 读取pdf模板bos = new ByteArrayOutputStream();stamper = new PdfStamper(reader, bos);AcroFields acroFields = stamper.getAcroFields();/* 使用中文字体 */BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
//		BaseFont bf = BaseFont.createFont(
//				this.getClass().getClassLoader().getResource("security/simsun.ttc").getPath() + ",1",
//				BaseFont.IDENTITY_H, BaseFont.EMBEDDED);ArrayList<BaseFont> fontList = new ArrayList<BaseFont>(1);fontList.add(bf);acroFields.setSubstitutionFonts(fontList);//			Map<String, String> pdfValues = getPdfValues();Set<String> keySet = pdfValues.keySet();for (String key : keySet) {String value = pdfValues.get(key);acroFields.setField(key, value);}// 插入图片addImage(stamper, acroFields, sealPath);stamper.setFormFlattening(true);// 如果为false那么生成的PDF文件还能编辑,一定要设为truestamper.close();Document doc = new Document();out = new FileOutputStream(pdfPath);// 输出流PdfCopy copy = new PdfCopy(doc, out);doc.open();PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), 1);copy.addPage(importPage);doc.close();}private void addImage(PdfStamper stamper, AcroFields acroFields, String sealPath)throws BadElementException, MalformedURLException, IOException, DocumentException {int pageNo = acroFields.getFieldPositions("zgswjggz").get(0).page;Rectangle signRect = acroFields.getFieldPositions("zgswjggz").get(0).position;float x = signRect.getLeft();float y = signRect.getBottom();// 读图片Image image = Image.getInstance(sealPath);// 获取操作的页面PdfContentByte pdfContentByte = stamper.getOverContent(pageNo);// 根据域的大小缩放图片image.scaleToFit(signRect.getWidth(), signRect.getHeight());// 添加图片image.setAbsolutePosition(x, y);pdfContentByte.addImage(image);}
}

 


http://chatgpt.dhexx.cn/article/koJkPd3K.shtml

相关文章

pdf转换html乱码怎么办,pdf转word后乱码怎么办?

pdf转word后乱码怎么办&#xff1f;网络上面有一些PDF资料你可以对其内容复制&#xff0c;但是粘贴到word或者文本中就是一堆乱码&#xff0c;你用转换软件转换出来&#xff0c;有一些文件不会是乱码&#xff0c;但是还有一些文件依旧是乱码&#xff0c;怎么办呢&#xff1f;今…

表格生成pdf 中字乱码

表格生成pdf及解决中字乱码 npm库表格生成pdf的超简洁小例子(用的是npm导入字体)两种解决乱码方法直接引入npm引入在项目中导入stsong-font在所需的页面上引用最后在生成pdf函数中使用(同上) npm库 两个必备包 jspdf npm i jspdfjspdf-autotable npm i jspdf-autotable在所需…

php生成pdf乱码_ierport 生成pdf出现乱码问题

iReport导出pdf中文乱码问题解决 使用iReport的过程经常遇到一些乱码的问题&#xff0c;最近用iReport导出pdf的时候就遇到中文不能显示的问题。 要使导出的pdf能够显示中文&#xff0c;需要用到iTextAsian.jar包。 1.将显示中文的地方Text属性设置成支持中文的字体。 Pdf font…

PDF文件复制文本为乱码

PDF文件可能会出现复制文本粘贴成乱码的现象。原因是PDF中所用的字体无法在电脑中找到&#xff0c;点击编辑器的”文件-属性“&#xff0c;查看字体&#xff0c;如果字体可以下载&#xff0c;可以在网上下载安装&#xff0c;就可以进行复制粘贴。 但有的PDF为保护内容&#xff…

pdf复制乱码_网站推荐 | 从未见过你这么不单纯的PDF转换器!

点击蓝字 关注我们 之前给大家分享过几期PDF转换器 但是仍然觉得部分线上转换器会出现 格式乱码、甚至字乱码的现象 (字乱码是由于外文网址识别误差) 这次挥挥找到了一个PDF转word 近乎完美保留原格式的在线转换网站&#xff01; 一起来看看叭 Today PDF转换器 http://www.pdfd…

Pdf 解密后复制文字乱码

1、安装cajviewer 这个工具 2、用CAJviewer打开pdf文档 3、选择图像4、点文字识别&#xff0c;这时候就弹窗一个框&#xff0c;里面是可复制的文本&#xff0c;而且准确率比较高 转载于:https://www.cnblogs.com/wangyuelang0526/p/3735398.html

使用latex撰写中文科技论文时,生成的PDF复制中文时乱码(不能查重),解决办法如下

在投稿中文期刊《控制理论与应用》时&#xff0c;期刊要求必须用latex&#xff0c;官方给的编辑器是WinEdt7.0&#xff0c;但是如果用常用的编译方式生成PDF的话&#xff0c;也就是第一个选项PDFTeXify 打开生成的PDF表面上看是没有任何问题的&#xff0c;可以正常阅读。但是如…

Tex导出PDF乱码问题

目录 工作环境错误pdf导出方式正确的pdf导出方式 工作环境 我用的是CTex TexStudio。CTex是为了方便中文字体。 错误pdf导出方式 一般我们都是点上方菜单栏的双箭头的按钮进行Tex文件编译&#xff0c;右边就会实时显示pdf内容。当然此时文件夹内也会产生相应的pdf文件。 我…

pdf复制乱码_SCI必备利器:选中即翻译,PDF文献也能一键翻译了。

来源丨软件通 ← 关注Ta 都是干货&#xff0c;无需引导 请仔细阅读全文。 熟悉小通的童鞋都知道&#xff0c;我们只推荐过一款sci论文翻译软件&#xff0c;那就是&#xff1a;CopyTranslator。复制即翻译&#xff0c;现在又更新了。新版本支持选中即翻译厉害吧&#xff01;选中…

新版macbook,PPT导出PDF复制文字乱码问题的解决

参考资料&#xff1a; 福昕阅读器的文档&#xff1a;https://m.foxitsoftware.cn/company/product/964.html 微软支持(完全一模一样的问题) 先说一下&#xff0c;我的这个PDF复制文字乱码问题确实是被我解决了&#xff0c;但是我的这个PDF是有源文件的&#xff1a;一个PPT演示文…

解决从PDF复制文字后乱码问题

背景 需要从PDF复制文字出来做笔记&#xff0c;可是谁知道PDF通过adobe打开后复制出来后是乱码&#xff0c;如下图所示&#xff1a; 解决 尝试过安装字体&#xff0c;可惜没卵用。 方法1-CAJViewer打开 用该软件打开后复制&#xff0c;可以完美复制&#xff0c;但是有个小问题…

pdf复制乱码_教程如何将公众号文章导出为pdf

0.说明 最近有一些小伙伴在后台问我们文章有没有word版&#xff0c;因为可能对着手机小小的屏幕看这些公式什么的确实有点头疼&#xff0c;而且有的小伙伴还需要上课哈。 其实word文档的doc/docx并不是最佳的&#xff0c;在不同环境可能会出现公式乱码的情况&#xff0c;相比之…

PDF复制乱码 -- 简单解决办法

这里写自定义目录标题 前言步骤1&#xff1a;PDF转Word步骤2&#xff1a;word转回PDF 前言 很多从网上下载的PDF会存在乱码的情况&#xff0c;比如这个&#xff0c;明明可以选中&#xff0c;但是使用 有道词典的划词翻译 或者 复制到别的地方的时候却是乱码&#xff1a; 试了…

pdf复制出乱码解决方案

目录 pdf复制出乱码解决方案一、pdf格式基础二、ttf格式基础三、解决乱码1.提取文字&#xff0c;识别文字a.和原文件比对b.OCR手工辅助识别 2.修改pdf中的文字&#xff0c;使其可复制a.选择pdf开发库b.修改pdfc.完整代码 pdf复制出乱码解决方案 偶然发现有一类pdf文档中的文字…

RK px30 配置GT911 TP触摸流程记录

1.简介 RK px30配置GT911 TP 触摸&#xff0c;流程记录 2.查看原理图 首先&#xff0c;查看原理图的tp座子&#xff0c;然后往下查找连接在主控的哪路i2c上 这里我们可以看见&#xff0c;此路TP是连接在i2c3上&#xff0c;接下来进行dts配置 3.DTS 配置 先查看是否有 i2c3…

linux下GT911触摸屏驱动优化记录

linux下GT911触摸屏驱动优化记录 背景 由于最近要做linux内核启动速度优化&#xff0c;所以就对着驱动一点一点优化&#xff0c;加上QT应用程序的初始化&#xff0c;总共的启动时间要做到4S以内。目前先调试GT911驱动程序。 平台 芯片&#xff1a;全志A33内核&#xff1a;l…

多点电容触摸驱动(基于gt911)

多点电容触摸的驱动使用到的知识主要有input子系统、gpio硬件中断、iic子系统&#xff0c;tslib测试等知识点&#xff0c;下面将针对多点电容触摸屏的驱动开发的四个知识点进行展开&#xff0c;以及gt911芯片的知识&#xff0c;官方gt9xx驱动的移植。 一、gt911芯片 gt911芯片…

rk3588s-pc gt911 gt9xx驱动

1.在官网拉取代码。配置好环境 2.进入hvml_rk3588s/device/rockchip/rk3588/目录下&#xff0c;我们可以看到我们编译的文件。 本项目中我们的config文件是firefly-linux.config dts文件是rk3588-firefly-itx-3588j-mipi101-M101014-BE45-A1.dtsi 3.进入tp驱动的目录 配置mak…

海思35xx实现GT911触摸屏功能

海思35xx通过gpio模拟i2c实现GT911触摸功能 1.遇到的问题 地址选配后一直不对,首先检测硬件问题,然后通过调试驱动部分,打印调试从设备给的ack&#xff08;没有逻辑分析仪&#xff09;;发现寄存器地址一直为FF或00,检查发现GT911地址均为16bit,而读写i2c接口是8位的;成功后点…

[RK3568 Android12] GT911触摸屏调试

屏幕规格书 需要主要硬件通信电压为:1.8V或者3.3V I2C通信的地址:0x5D 和0x40 系统上电时序:不同的地址,稍微有些差异 对应代码中如下: