₹(印度卢比符号)符号打印为? (问号)在 pdf 中使用 Apache PDFBOX

₹ (Indian Rupee Symbol) symbol is printing as ? (question mark) in pdf using Apache PDFBOX

我正在尝试在使用 apache pdfbox 创建的 pdf 文件中写入一个字符串。我使用 ISO-8859-1 作为 UTF-8 编码。但它仍然在打印问号。尝试了很多并在互联网上寻找解决方案(Whosebug)。 有人可以帮忙吗? 提前致谢

public class TestClass {

    public static void main(String[] args) throws IOException{
        PDDocument doc = new PDDocument();
        PDPage page = new PDPage();
        doc.addPage(page);
        PDPageContentStream cos=  new PDPageContentStream(doc, page);
        cos.beginText();
        String text = "Deposited Cash of ₹10,00,000/- or more in a Saving Bank Account";
        cos.newLineAtOffset(25, 700);
        byte[] ptext = text.getBytes("ISO-8859-1");
        String value = new String(ptext, "UTF-8");
        }
        cos.setFont(PDType1Font.TIMES_ROMAN, 12);
        cos.showText(value);
        cos.endText();
        cos.close();
        doc.save("C:\Users\xyz\Desktop\Sample.pdf");
        doc.close();
    }
}

在pdf中,它写的是问号而不是卢比符号。

您使用的字体 PDType1Font.TIMES_ROMAN。这是标准的 14 字体,即每个 PDF-1.x 查看器都必须使用的字体,但仅适用于卢比符号不属于的有限字符集(参见 PDF 规范 ISO 32000-1 的附件 D ).

PDFBox 特别使用 WinAnsiEncoding 作为标准的 14 种字体,其中卢比符号绝对不在其中。

因此,使用您知道它包含卢比符号的本地字体(例如用于测试目的的 ARIALUNI)以及允许表示卢比符号的编码(例如 Identity-H)。

不要做

byte[] ptext = text.getBytes("ISO-8859-1");
String value = new String(ptext, "UTF-8");

这会根据一种编码将文本编码为字节,并根据不同的编码对这些字节进行解码。这样的代码通常只会损坏文本,往往无法修复。 (很少有这样的代码可能有意义的情况,特别是如果原始字符串已经损坏,使用错误的编码解码。但在您的情况下不会。)


正如 OP 所问,这是对我有用的代码:

PDDocument doc = new PDDocument();
PDPage page = new PDPage();
doc.addPage(page);
PDPageContentStream cos=  new PDPageContentStream(doc, page);
cos.beginText();
String text = "Deposited Cash of ₹10,00,000/- or more in a Saving Bank Account";
cos.newLineAtOffset(25, 700);
cos.setFont(PDType0Font.load(doc, new File("c:/windows/fonts/arial.ttf")), 12);
cos.showText(text);
cos.endText();
cos.close();
doc.save("IndianRupee.pdf");
doc.close();

(ShowSpecialGlyph 测试 testIndianRupeeForVandanaSharma)

结果:

正如@Tilman 已经强调的那样,需要有一个足够新的字体文件才能使这项工作生效:印度卢比符号 ₹ (U+20B9) 在 6.0.0 版(2010 年 10 月)中被引入到 Unicode 中,它可能花了字体开发人员一些时间来实现该字形。例如。我将 ArialMT (arial.ttf) 6.90 版与“(c) 2015 The Monotype Corporation.”一起使用。

当然,如果您的字体文件不在 "c:/windows/fonts/" 中,请使用它在您系统中的路径。

上述问题的解答:

目的:尝试使用 Apache PDFBox 库在 PDF 中编写 IndianRupeeSymbol(₹)。

错误:在 PDF 中写入此符号时出现一些问题(请参阅问题以获取详细信息。)

方法:我一直在寻找支持 reading/writing Unicode 字符的字体 file.I 从互联网上下载了很多各种字体的 .ttf 文件,我把它放在我系统的某个地方,使用那个.ttf 文件到 read/write (encode/decode) unicode 字符,这样我就可以在我的 pdf 文件中写入相同的字符。

错误:任何你想用于 read/write 字符的字体样式,该特定字体的字体文件必须安装在 system.However 中,我只是下载文件并试图在我的代码中阅读它。

解决方法:@Tilman和@mkl提供的,我们的系统中安装了一些默认的字体文件(C:\Windows\Fonts.....)(我使用的是windowsOS)。您可以使用这些 pre-installed 文件来实现您的目的。请检查一次您系统中安装的字体文件的版本。版本应该是最新的以支持最新的功能。如果您发现安装的字体不是最新的,您可以下载相应的字体文件并安装到您的系统中。