₹(印度卢比符号)符号打印为? (问号)在 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 文件来实现您的目的。请检查一次您系统中安装的字体文件的版本。版本应该是最新的以支持最新的功能。如果您发现安装的字体不是最新的,您可以下载相应的字体文件并安装到您的系统中。
我正在尝试在使用 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 文件来实现您的目的。请检查一次您系统中安装的字体文件的版本。版本应该是最新的以支持最新的功能。如果您发现安装的字体不是最新的,您可以下载相应的字体文件并安装到您的系统中。