Unicode ₹;(印度卢比符号)符号打印为?(问号)使用ApachePDFBox的pdf格式

Unicode ₹;(印度卢比符号)符号打印为?(问号)使用ApachePDFBox的pdf格式,unicode,pdfbox,Unicode,Pdfbox,我正在尝试在我的pdf文件中编写一个字符串,使用ApachePDFBox创建。我使用ISO-8859-1作为UTF-8编码。但它仍然在印刷问号。尝试了很多,并在互联网上寻找解决方案(StackOverflow)。 有人能帮忙吗。 提前谢谢 public class TestClass { public static void main(String[] args) throws IOException{ PDDocument doc = new PDDocument()

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

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\u-ROMAN
。这是一种标准14字体,即每个PDF-1.x查看器必须具有的字体,但仅适用于卢比符号不属于的有限字符集(参见PDF规范ISO 32000-1附件D)

PDFBox特别使用WinAnsienceODing作为标准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();
(测试
testindianrupeforvandasharma

结果是:

正如@Tilman已经强调的,我们需要一个足够新的字体文件来实现这一点:印度卢比符号₹ (U+20B9)在6.0.0版(2010年10月)中引入Unicode,字体开发人员可能需要一些时间来实现该标志符号。例如,我使用ArialMT(arial.ttf)版本6.90和“(c)2015 Monotype Corporation。”


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

上述问题的解决方案:

目的:尝试书写印度卢比符号(₹) 在PDF中使用ApachePDFBox库

错误:在PDF中写入此符号时出现问题(请参阅问题以了解确切的详细信息。)

方法:我正在寻找支持在PDF文件中读/写unicode字符的字体。我从互联网上下载了许多不同字体的.ttf文件,我把它放在我的系统中的某个地方,使用该.ttf文件读/写(编码/解码)unicode字符,这样我就可以在我的PDF文件中写相同的字符

错误:任何要用于读/写字符的字体样式,都必须在系统中安装该特定字体的字体文件。但是,我只是下载了该文件,并试图在代码中读取它


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

您应该通过original字符串直接发送到showText。你会从pdfbox收到一条错误消息。然后用谷歌搜索该错误消息。如果这不能解决问题,请编辑你的问题并提及你正在使用的版本。我的意思是这样写的,你会得到一个例外。对于WinAncienceODing等,常见问题解答中提到了这一点。早些时候,当我试图用PDF编写卢比符号时,我发现了与WinAnScienceODing相关的错误。后来,我在这个平台上探索了一些解决方案,我读到使用IS0-8859-1编码,然后UTF-8解码,我们可以在Pdf中写入这样的符号。然而,现在使用这些编码和解码,它没有抛出错误,但它甚至没有写入所需的值(卢比符号)在pdf中,它正在写“?”标记。我可以直接写它,方法是使用
cos.setFont(PDType0Font.load(doc,新文件(“c:/windows/fonts/arial.ttf”)),12;
cos.showText(“₹" );
正如mkl所指出的,这个符号不在WinAnciencoding中。卢比符号来自2010年。WinAnciencoding更古老。完美无缺的胜利。我不清楚你到底想说什么。我是否应该将PDTrueType字体与ARIALUNI字体的ttf文件一起使用。@VandanaSharma不使用PDTrueType字体。请按照我的评论中所述使用PDType0Font。@VandanaSharma正如Tilman所说,使用
cos.setFont(PDType0Font.load(doc,新文件(“c:/windows/fonts/arial.ttf”)),12)
cos.showText(“₹“”
@mkl如果您的解决方案适合您,您能否提供帮助。