我正在编写一个Java函数,该函数将String作为参数,并使用PDFBox产生PDF作为输出。
只要我使用拉丁字符,一切都可以正常工作。但是,我事先不知道输入什么,可能是英文,中文或日文字符。
在非拉丁字符的情况下,这是我得到的错误:
Exception in thread "main" java.lang.IllegalArgumentException: U+3053 ('kohiragana') is not available in this font Helvetica encoding: WinAnsiEncoding
at org.apache.pdfbox.pdmodel.font.PDType1Font.encode(PDType1Font.java:426)
at org.apache.pdfbox.pdmodel.font.PDFont.encode(PDFont.java:324)
at org.apache.pdfbox.pdmodel.PDPageContentStream.showTextInternal(PDPageContentStream.java:509)
at org.apache.pdfbox.pdmodel.PDPageContentStream.showText(PDPageContentStream.java:471)
at com.mylib.pdf.PDFBuilder.generatePdfFromString(PDFBuilder.java:122)
at com.mylib.pdf.PDFBuilder.main(PDFBuilder.java:111)
Run Code Online (Sandbox Code Playgroud)
如果我理解正确,则必须对日语使用一种特定的字体,对中文使用另一种字体,依此类推,因为我使用的(Helvetiva)字体不能处理所有必需的unicode字符。
我还可以使用处理所有这些unicode字符的字体,例如Arial Unicode。但是,该字体受特定许可使用,因此我无法使用它,也没有找到另一种。
我找到了一些想要解决此问题的项目,例如Google NOTO项目。但是,该项目提供了多个字体文件。因此,我将不得不在运行时根据我的输入选择要加载的正确文件。
因此,我面临两个选择,其中一个我不知道如何正确实现:
一直在寻找可以处理几乎所有unicode字符的字体(我急切地希望在哪里找到这个字体?
尝试检测使用哪种语言,然后根据需要选择一种字体。尽管我还不知道该怎么做,但我仍然认为它不是一个干净的实现,因为输入和字体文件之间的映射将被硬编码,这意味着我将必须对所有硬编码可能的映射。
还有其他解决方案吗?
我完全偏离轨道了吗?
在此先感谢您的帮助和指导!
这是我用来生成PDF的代码:
public static void main(String args[]) throws IOException {
String latinText = "This is latin text";
String japaneseText = "????????";
// This works good
generatePdfFromString(latinText);
// …Run Code Online (Sandbox Code Playgroud)