当前位置: 首页 > 知识库问答 >
问题:

如何将编码从WinAnsiEncoding更改为Unicode?

叶桐
2023-03-14

我试图找到一种方法,可以将WinAnsiEncoding更改为Unicode,我试着像这样设置字体,

PDDocument doc = new PDDocument();
PDPage page = new PDPage(PDRectangle.A4);
doc.addPage(page);

File unicodeFileLocation = new File(getServletContext().getRealPath("/lib/ARIALUNI.TTF"));
PDTrueTypeFont unicodeFont = PDTrueTypeFont.loadTTF(doc, unicodeFileLocation);

...

// Create Table using boxable API
BaseTable table = new BaseTable(yStart, yStartNewPage, bottomMargin, tableWidth, margin, doc, page, true, drawContent);
// Title Field
Row<PDPage> titleRow = table.createRow(rowHeight);
Cell<PDPage> cell = titleRow.createCell(30, "Title");
cell = titleRow.createCell(70, TitleText);
cell.setFont(unicodeFont);

table.draw();

对于简单的文本,这很好,我可以看到Helvetica的字体变化,但是如果文本包含UTF-8字符(例如,U+0083等),我只会看到抛出以下html" target="_blank">异常,

java.lang.IllegalArgumentException:U+0083在此字体的编码中不可用:WinAnsiEncoding org.apache.pdfbox.pdmodel.font.pdtrueTypeFont.encode(pdtrueTypeFont.java:371)org.apache.pdfbox.pdmodel.font.pdfont.encode(pdfont.java:316)org.apache.pdfbox.pdmodel.font.pdfont.encode(:341)be.quodlibet.boxable.partage.getheight(partage.java:465)be.quodlibet.boxable.cell.gettextheight(cell.java:392)be.quodlibet.boxable.cell.getcellheight(cell.java:367)be.quodlibet.boxable.row.getheight(cell.java:166)be.quodlibet.boxable.table.isendofpage(W.processRequest(exportpew.java:498)com.ssl.pew.controller.exportpew.doPost(exportpew.java:792)javax.servlet.http.httpservlet.service(httpservlet.java:648))javax.servlet.http.httpservlet.service(httpservlet.java:729)org.apache.tomcat.websocket.server.wsfilter.doFilter(wsfilter.java:52)

当我试图查看编码类型时,它总是WinAnsiEncoding,我不需要它。

Encoding encoding = unicodeFont.getEncoding();
String encodingName = encoding.getEncodingName();

这给了我WinAnsiEncoding,有什么方法可以改变这一点吗?

对我来说,这似乎是因为WinAnsiEncoding,如果我能改变这一点,我可能会解决这个问题。

似乎大多数人决定搬到iText,这对我来说不是一个选择。

共有1个答案

逄嘉木
2023-03-14

常见问题解答说:

字体处理

我得到java.lang.IllegalArgumentException:…在此字体的编码中不可用:WinAnsiEncoding

通过查看PDF规范附录D,检查该字符在WinAnsiEncoding中是否可用。如果没有,但如果该字体可用(在windows中,请使用charmap.exe查看),然后使用pdtype0font.load()加载该字体,请参见源代码下载中的EmbeddedFonts.java示例。

对我来说很有效,例如,

PDType0Font.load(document, new ClassPathResource("fonts/OpenSans-Regular.ttf").getFile());
 类似资料:
  • 我正在使用带有Selenium的testNG。我有两种记录器,一种是log4j记录器,另一种是testNG reporter.log()。现在的问题是我需要记录一些中文文本。但它是作为‘????’而不是中文文本。所以我更改了log4j.properties文件,只添加了两行: 现在,在我的log4j日志中,它是正确的,但在testNG Reporter.log()中,它仍然是“?????”。

  • 问题内容: 我在将URL编码为URI时遇到问题: 这不能满足我对以下URL的期望: 传递字符串: http://m.bloomingdales.com/img?url=http%3A%2F%2Fimages.bloomingdales.com%2Fis%2Fimage%2FBLM%2Fproducts%2F3%2Foptimized%2F1140443_fpx.tif%3Fwid%3D52%26q

  • 问题内容: 我需要编译我的源代码以与jre 1.6兼容。但是,当我尝试将javac任务的编译器属性设置为javac1.6时,ant仍将使用javac1.7编译我的代码。我也尝试将编译器版本设置为“现代”,但没有帮助。 我的JAVA_HOME设置为JDK 1.6: 我的ant版本是:Apache Ant(TM)版本1.8.2 根据这篇文章,ant使用自己的编译器。如何覆盖ant默认值?另外,根据本文

  • 问题内容: 我正在使用eclipse编辑器来处理我的远程文件,看来eclipse编辑器已设置为dos文件格式,我不知道如何查找在eclipse编辑器中设置的文件格式,但我希望将其设置为unix文件格式。 如何在Eclipse中将文件格式选项设置为Unix文件格式? 在VIM中设置文件格式的类似问题 谢谢。 问题答案: 我没有安装Eclipse进行检查,但是通过一些搜索,看来有两件事要做。 要更改新

  • 问题内容: 根据以下我用于常规mysql的代码,如何将其转换为使用mysqli? 像更改为一样简单吗? 问题答案: 首先要做的可能是将每个函数调用都替换为等效函数,至少在您愿意使用过程式API的情况下-考虑到您已经有一些基于MySQL API的代码,这将是更简单的方法是一种程序性的。 为了解决这个问题,“ MySQLi扩展功能摘要” 绝对是有用的。 例如: 将被替换 将被替换为和/或,具体取决于上

  • 我是一个超级初学者与Android Studio。我正在尝试打开相册并获取图像,startActivityForResult()已被弃用。如何使用ActivityResultLauncher更改代码?