itext android 印地语 pdf 创建

Posted

技术标签:

【中文标题】itext android 印地语 pdf 创建【英文标题】:itext android hindi pdf creation 【发布时间】:2017-01-11 14:04:47 【问题描述】:

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

以下是我的代码-

Gradle-

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 文档-http://developers.itextpdf.com/examples/font-examples-itext5/language-specific-examples

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

提前致谢

【问题讨论】:

已编辑问题,现在看看是否清楚 您是否验证了相关字体包含这些字形? 【参考方案1】:

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

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

    另一个问题是您不会得到该文本的正确输出。尤其是簇\u0930\u094d,即RA + halant,将显示为र्,即常规RA 字符+ halant 符号,您可能会在正确的写作中看到单词末尾的halant 符号。 KA 顶部的变音符号(如 र्क)在 iText 5 中是不可能实现的。

原因是大多数印度字母,包括您用来编写印地语的梵文,都需要 OpenType 功能(某些类型字体的特定功能)才能正确呈现。这仅在 iText 7 + the pdfCalligraph add-on 中受支持。

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

【讨论】:

你的第一点是正确的,但为什么这个字体可能是空的? 我对 Android 不是很熟悉,所以我不知道您是否正确地从文件系统加载资源。将字体添加到应用程序的资源中并从那里加载对我来说更有意义(除非这是 android_asset 的意思,我真的不知道)。【参考方案2】:

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

我。从“控制面板” -> 字体 -> ArialArial Unicode MS Regular 复制窗口字体>Arial Rounded MT Bold -> 创建一个文件夹“fonts”并将所有字体粘贴到字体文件夹中。

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

    使用评估

    BaseFont baseFont = BaseFont.createFont("assets/unicode/arialuni.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);

    字体 catFont = new Font(baseFont , 12);

    [注意:-这会使你的 .apk 文件变重。]

    使用内部存储

    文件 f = new File(Environment.getExternalStorageDirectory() + "/" + "fonts"); String fontFile = f.getAbsolutePath() + File.separator + "arialuni.ttf";

    BaseFont baseFont= BaseFont.createFont(fontFile, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);

    字体 catFont = new Font(baseFont, 12);

最后使用 catFont 在 PDF 文件中您想使用的任何地方。

【讨论】:

我在使用内部存储方法时收到此错误。 /storage/emulated/0/Download/Marathi_Sharada.ttf cannot be embedded due to licensing restrictions. 我想用 pdf 文件打印印地语/马拉地语。所以我下载了这个ttf。谢谢【参考方案3】:

首先,将您的 FreeSans.ttf 文件放入资产文件夹中。 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);

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

【讨论】:

以上是关于itext android 印地语 pdf 创建的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 iText 或 android 上的其他库创建 PDF 文件?

Android环境下生成PDF文件

java itext 创建pdf,直接返回输出流做成下载,怎么做

itext java pdf到文本创建

导出为 pdf 时如何正确呈现印地语?

使用 iText 库读取 pdf 文件 [关闭]