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

时间:2017-10-10 13:45:52

标签: encoding pdfbox boxable

我正在尝试找到一种方法,我可以将 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,这对我来说不是一个选择。

2 个答案:

答案 0 :(得分:0)

在这里尝试

PDFont font = PDTrueTypeFont.load(document, new File(fontPath)), WinAnsiEncoding.INSTANCE);

答案 1 :(得分: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());