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

问题描述 投票:0回答:2

我正在尝试找到一种方法可以将 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 等),我只会看到抛出以下异常,

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.getStringWidth(PDFont.java:345) be.quodlibet.boxable.text.PipelineLayer.push(PipelineLayer.java:65) be.quodlibet.boxable.Paragraph.getLines(Paragraph.java:341) be.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) 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。

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

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

对我来说,这似乎是因为 WinAnsiEncoding,如果我能以某种方式改变它,我也许能够解决这个问题。

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

encoding pdfbox boxable
2个回答
0
投票

FAQ说:

字体处理

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

通过查看 PDF 规范附录 D 检查字符在 WinAnsiEncoding 中是否可用。如果不可用,但如果它在此字体中可用(在 Windows 中,请使用 charmap.exe 查看),然后使用 PDType0Font.load 加载字体(),另见源码下载中的EmbeddedFonts.java例子

它对我有用,例如,

PDType0Font.load(document, new ClassPathResource("fonts/OpenSans-Regular.ttf").getFile());

-2
投票

来试试这个

PDFont font = PDTrueTypeFont.load(document, new File(fontPath)), WinAnsiEncoding.INSTANCE);
© www.soinside.com 2019 - 2024. All rights reserved.