在用于创建PDF文件的Android PDF Write(APW)中(链接到库:http://sourceforge.net/projects/apwlibrary/)我遇到波兰字符问题。我正在寻找解决方案或库中的调整修复此问题。
波兰语字符集(请注意波兰语是拉丁语2):
mypdf.addText(10,10,12,"ŚĆĄĘŃŻŹÓŁ śćąęńżźół");
在XObjectImage类中,我改为:
public static String ENCODING = "ISO-8859-1";
为:
public static String ENCODING = "ISO-8859-2";
在StandardFonts中我添加了:
public static final String ISO8859_2 = "ISO8859-2";
我试图把这个组合放在:
mypdf.setFont(StandardFonts.SUBTYPE,StandardFonts.COURIER,StandardFonts.ISO8859_2);
outputToFile("my.pdf",pdfcontent,"ISO-8859-2");
它还没有用。请帮我在库中添加其他调整,以便正确运行波兰语字符。
答案 0 :(得分:0)
Android PDF Write(APW)仅适用于使用预定义编码的标准14字体( MacRomanEncoding , MacExpertEncoding 或 WinAnsiEncoding ),见下文。
如果在PDF specification中查找这些编码的定义(附件D.2 拉丁字符集和编码和D.4 专家集和MacExpertEncoding ) ),你会看到你的角色"ŚĆĄĘŃŻŹÓŁ śćąęńżźół"
不是(至少不是全部,我只是采样)存在于这些编码中。
此外,PDF查看器只需要在给定编码中提供标准的14种字体(参见PDF specification中的第9.6.2.2节标准类型1字体(标准14字体)) 。因此,您无法期望PDF查看器能够可靠地使用这些字体显示您的字符。
因此,如果您需要这些字符,您必须扩展APW以允许不同的字体和包含或切换到不同的PDF创建库。
我在上面声称:
Android PDF Write(APW)仅用于使用标准的14种字体
这是因为使用以下代码在类Page
public void setFont(String subType, String baseFont) {
IndirectObject lFont = mDocument.newIndirectObject();
mDocument.includeIndirectObject(lFont);
lFont.setDictionaryContent(" /Type /Font\n /Subtype /" + subType + "\n /BaseFont /" + baseFont + "\n");
mPageFonts.add(lFont);
}
public void setFont(String subType, String baseFont, String encoding) {
IndirectObject lFont = mDocument.newIndirectObject();
mDocument.includeIndirectObject(lFont);
lFont.setDictionaryContent(" /Type /Font\n /Subtype /" + subType + "\n /BaseFont /" + baseFont + "\n /Encoding /" + encoding + "\n");
mPageFonts.add(lFont);
}
如您所见,只创建了条目类型,子类型, BaseFont ,以及可选的编码。如果您在PDF specification中查找第9节文本的字体相关小节,您将看到对于标准14字体以外的字体,需要更多条目。
因此,APW只能正确支持标准的14种字体。
我在上面声称:
Android PDF Write(APW)仅用于使用...预定义编码( MacRomanEncoding , MacExpertEncoding 或 WinAnsiEncoding )
正如您在上面引用的代码中看到的,如果完全选择了编码,则使用"\n /Encoding /" + encoding + "\n"
完成,而前导'/'
表示encoding
是PDF名称,而不是PDF词典。
根据规范
编码名称或 字典 (可选)字体的字符编码规范,如果不同的话 从其内置编码。编码的值应为 预定义编码的名称( MacRomanEncoding , MacExpertEncoding 或 WinAnsiEncoding ,如附件所述 D)或编码字典,应指定与...的差异 font的内置编码或指定的预定义编码(请参阅 9.6.6,"字符编码")。
(表111 - 类型1字体字典中的条目 - PDF specification)
这只允许 MacRomanEncoding , MacExpertEncoding 或 WinAnsiEncoding 。 (由于PDF查看器带有用于标准14字体的各自的字体程序,因此您无法依赖内置编码以任何可靠的方式为您提供帮助。)