itext android印地语pdf创建

itext android印地语pdf创建,android,pdf,itext,Android,Pdf,Itext,我正在使用itextg库在我的android设备上用印地语创建pdf。(PDF正以完美的英语创建) 下面是我的代码- 格拉德尔- compile 'com.itextpdf:itextg:5.5.10' Java代码- final String FONT = "file:///android_asset/FreeSans.ttf"; Font f = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED); Strin

我正在使用itextg库在我的android设备上用印地语创建pdf。(PDF正以完美的英语创建)

下面是我的代码-

格拉德尔-

compile 'com.itextpdf:itextg:5.5.10'
Java代码-

final String FONT = "file:///android_asset/FreeSans.ttf";
Font f = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
String outputString= "\u0915\u093e\u0930 \u092a\u093e\u0930\u094d\u0915\u093f\u0902\u0917";
document.add(new Paragraph(outputString,f));
输出字符串取自此处的itext文档-

印地语文本未打印在pdf上。因此,outputString中的行不会打印在因此创建的pdf文件上


提前感谢

在我看来,您有两个问题:

  • 我猜你的Android文件系统找不到字体。对此的一个简单测试是检查
    font.getFamilyname()
    的输出,它可能是
    未知的
    。这意味着该字体尚未找到,iText已默认为Helvetica。Helvetica不包含印度字母的信息

  • 另一个问题是,您将无法获得此文本的正确输出。特别是集群
    \u0930\u094d
    ,即RA+halant,将作为र्, 规则的RA字符+你可以在正确的书写中在一个单词的末尾看到的halant符号。KA顶部的变音符号(如र्क) 在iText 5中是不可能实现的

  • 这是因为大多数印度字母表,包括用于书写印地语的Devanagari字母表,都需要OpenType功能(特定字体类型的特定功能)才能正确呈现。这仅在iText 7+中受支持


    不幸的是,iText 7还没有Android端口,所以第二个问题目前还无法解决。

    首先,将您的freeans.ttf文件放在assets forlder中。iText库采用字体文件的文件路径,因此您无法直接访问assets文件夹,因此您不能只提供该文件的资产路径。下面是用于将字体文件从资产文件夹复制到应用程序的本地目录

    public static final String HINDI_FONT = "FreeSans.ttf";
    try {
        File file = new File(getFilesDir(), HINDI_FONT);
        if (file.length() == 0) {
          InputStream fs = getAssets().open(HINDI_FONT);
          FileOutputStream os = new FileOutputStream(file);
          int i;
          while ((i = fs.read()) != -1) {
            os.write(i);
          }
          os.flush();
          os.close();
          fs.close();
        }
    } catch (IOException e) {
       e.printStackTrace();
    }
    
    在单独的线程中执行try块代码,不要在主线程中执行。 if语句确保这种情况只发生一次。请在finally块而不是try块中写入流关闭语句,如上所示

    接下来是itext语句使用的字体

    Font f = FontFactory.getFont(getFilesDir() + "/" + HINDI_FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
    PdfPCell eCell = new PdfPCell(new Phrase(entry, f));
    eCell.setPadding(5);
    table.addCell(eCell);
    

    这里,varaible条目是您的印地语文本,代码是在活动中编写的,因此getFilesDir()可以工作。我在表格单元格中添加了一个短语。您也可以在段落中类似地使用它。我检查了此代码,它可以工作。

    我们可以在iTextPDF中使用Arial unicode来支持多种语言

    I.从“控制面板”“->字体”->Arial、Arial Unicode MS常规和Arial圆角MT粗体->创建文件夹“字体””,并将所有字体粘贴到字体文件夹中

    现在,我们可以将此文件夹保存在Android中的资产文件夹中,或保存在设备(移动设备)的内部存储中

  • 使用assest

    BaseFont BaseFont=BaseFont.createFont(“assets/unicode/arialuni.ttf”,BaseFont.IDENTITY\u H,BaseFont.EMBEDDED)

    Font catFont=新字体(基本字体,12)

    [注意:-这将使ur.apk文件很重。]

  • 使用内部冲程

    文件f=新文件(Environment.getExternalStorageDirectory()+“/”+“字体”); 字符串fontFile=f.getAbsolutePath()+File.separator+“arialuni.ttf”

    BaseFont BaseFont=BaseFont.createFont(fontFile,BaseFont.IDENTITY,BaseFont.EMBEDDED)

    Font catFont=新字体(基本字体,12)


  • 最后在PDF文件中的任何地方使用catFont

    编辑的问题,现在看看是否清晰。您是否验证了所讨论的字体包含这些字形?您的第一点是正确的,但为什么该字体可能为空?我对Android不太熟悉,所以我不知道您是否正在从正确的e文件系统。对我来说,将字体添加到应用程序的资源并从那里加载会更有意义(除非这是
    android\u asset
    的意思,我真的不知道)。我在使用内部存储方法时遇到此错误。
    /storage/emulated/0/Download/Marathi_Sharada.ttf由于许可限制而无法嵌入。
    我想在pdf文件中打印印地语/马拉地语。因此我下载了此ttf。谢谢