首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PDFBox -如何将编码从WinAnsiEncoding更改为Unicode?

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

Stack Overflow用户
提问于 2017-10-10 13:45:52
回答 2查看 14.7K关注 0票数 5

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

代码语言:javascript
运行
复制
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等),我只看到抛出以下异常,

org.apache.pdfbox.pdmodel.font.PDTrueTypeFont.encode(PDTrueTypeFont.java:371):在此字体的编码中,U+0083不可用: WinAnsiEncoding org.apache.pdfbox.pdmodel.font.PDFont.encode(PDFont.java:316) org.apache.pdfbox.pdmodel.font.PDFont.getStringWidth(PDFont.java:345) be.quodlibet.boxable.text.PipelineLayer.push(PipelineLayer.java:65) be.quodlibet.boxable.Paragraph.getLinesbe.quodlibet.boxable.Paragraph.getHeight(Paragraph.java:465) be.quodlibet.boxable.Cell.getTextHeight(Cell.java:392) be.quodlibet.boxable.Cell.getCellHeight(Cell.java:367) be.quodlibet.boxable.Row.getHeight(Row.java:166) be.quodlibet.boxable.Table.isEndOfPage(Table.java:728) be.quodlibet.boxable.Table.drawRow(Table.java:224 (Paragraph.java:341)) be.quodlibet.boxable.Table.draw(Table.java:200) com.ssl.pew.controller.ExportPEW.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。

代码语言:javascript
运行
复制
Encoding encoding = unicodeFont.getEncoding();
String encodingName = encoding.getEncodingName();

这给了我WinAnsiEncoding,有什么办法可以改变这个吗?

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

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

EN

回答 2

Stack Overflow用户

发布于 2019-11-04 16:02:58

常见问题说:

字体处理 我得到了java.lang.IllegalArgumentException:…在此字体的编码中不可用: WinAnsiEncoding 通过查看PDF规范附录D来检查字符在WinAnsiEncoding中是否可用。如果没有,但是如果它在此字体中可用(在windows中,请查看charmap.exe),然后用PDType0Font.load()加载字体,也请参阅源代码下载中的EmbeddedFonts.java示例。

对我来说很管用,比如,

代码语言:javascript
运行
复制
PDType0Font.load(document, new ClassPathResource("fonts/OpenSans-Regular.ttf").getFile());
票数 0
EN

Stack Overflow用户

发布于 2019-01-09 07:10:32

来试试这个

代码语言:javascript
运行
复制
PDFont font = PDTrueTypeFont.load(document, new File(fontPath)), WinAnsiEncoding.INSTANCE);
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46668409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档