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

时间:2018-03-22 10:17:39

标签: unicode pdfbox

我正在尝试使用apache pdfbox在我的pdf文件中编写一个字符串。我使用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中,它是用问号代替卢比符号。

2 个答案:

答案 0 :(得分:2)

您使用字体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 test testIndianRupeeForVandanaSharma

结果:

Screenshot

正如@Tilman已经强调的那样,需要有一个足够新的字体文件来完成这项工作:印度卢比标志₹(U + 20B9)在版本6。0。0(2010年10月)中引入了Unicode,它可能有采用字体开发人员一些时间来实现该字形。例如。我使用ArialMT(arial.ttf)版本6.90和“(c)2015 The Monotype Corporation。”

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

答案 1 :(得分:0)

解决上述问题:

目的:尝试使用Apache PDFBox库以PDF格式编写IndianRupeeSymbol(₹)。

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

方法:我正在寻找支持在PDF文件中读取/写入unicode字符的字体。我从互联网下载了各种字体的许多.ttf文件,我把它放在我的系统中的某个地方,使用.ttf文件来读取/写(编码/解码)unicode字符,以便我可以在我的pdf文件中写入相同的内容。

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

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

相关问题