Android PDF Writer(APW)波兰语字符加入

时间:2015-12-11 23:12:51

标签: android pdf

在用于创建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");

它还没有用。请帮我在库中添加其他调整,以便正确运行波兰语字符。

1 个答案:

答案 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创建库。

仅标准14种字体

我在上面声称:

  

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种字体。

仅预定义编码( MacRomanEncoding MacExpertEncoding WinAnsiEncoding

我在上面声称:

  

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字体的各自的字体程序,因此您无法依赖内置编码以任何可靠的方式为您提供帮助。)