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 来支持多种语言
我。从“控制面板” -> 字体 -> Arial、Arial 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 文件?