首页 文章

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

提问于
浏览
1

我正在尝试使用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 回答

  • 2

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

    PDFBox特别使用 WinAnsiEncoding 作为标准14字体,其中卢比符号非常明确地不在其中 .

    因此,使用本地字体,您知道它包含卢比符号(例如,用于测试目的的ARIALUNI),其编码允许表示卢比符号(例如,身份-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 /”中,请使用它在您系统上的路径 .

  • 0

    解决上述问题:

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

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

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

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

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

相关问题