Android PDF Writer(APW)波兰语字符编码

Android PDF Writer(APW)波兰语字符编码,android,pdf,Android,Pdf,在用于创建PDF文件的Android PDF Write(APW)(链接到库:)中,我遇到了波兰语字符的问题。我正在寻找解决方案或调整库修复此问题 波兰语字符集(请注意波兰语为拉丁语2): 在XObjectImageClass中,我从: public static String ENCODING = "ISO-8859-1"; 致: 在标准字体中,我添加了: public static final String ISO8859_2 = "ISO8859-2"; 我试着把这个组合放进去: my

在用于创建PDF文件的Android PDF Write(APW)(链接到库:)中,我遇到了波兰语字符的问题。我正在寻找解决方案或调整库修复此问题

波兰语字符集(请注意波兰语为拉丁语2):

在XObjectImageClass中,我从:

public static String ENCODING = "ISO-8859-1";
致:

在标准字体中,我添加了:

public static final String ISO8859_2 = "ISO8859-2";
我试着把这个组合放进去:

mypdf.setFont(StandardFonts.SUBTYPE,StandardFonts.COURIER,StandardFonts.ISO8859_2);
outputToFile("my.pdf",pdfcontent,"ISO-8859-2");
它还不起作用。请帮助我在库中添加其他调整,以便正确运行波兰语字符。

Android PDF Write(APW)仅用于在预定义编码中使用标准的14种字体(MacRomanEncodingMacExpertEncodingWinAnsiEncoding),请参见下文

如果您查找这些编码的定义(附录D.2拉丁字符集和编码以及附录D.4专家集和MacExpertEncoding中),您将看到您的字符
“至少不是全部,我只是取样)不存在于这些编码中

此外,PDF查看器只需提供给定编码中的标准14字体(请参阅中的第9.6.2.2节标准1型字体(标准14字体))。因此,您不能指望PDF查看器能够可靠地使用这些字体显示您的字符

因此,如果您需要这些字符,您必须扩展APW以允许不同的字体和编码,或者切换到不同的PDF创建库。

只有标准的14种字体 我在上面声称:

Android PDF Write(APW)仅用于使用标准的14种字体

这是因为在类
页面中使用以下代码生成字体词典

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);
}
正如您看到的,只创建了条目类型子类型基本字体,以及可选的编码。如果在中查找第9节文本中与字体相关的子部分,您将看到,对于标准14字体以外的字体,需要更多条目

因此,APW仅正确支持标准的14种字体

仅预定义编码(MacRomanEncodingMacExpertEncoding,或WinansionCodeing) 我在上面声称:

Android PDF Write(APW)仅用于。。。预定义的编码(MacRomanEncodingMacExpertEncoding,或WinansionCodeing

正如您在上面引用的代码中所看到的,如果选择了编码,则可以使用
“\n/encoding/”+encoding+“\n”
,并且前面的
“/”
表示
编码是一个PDF名称,而不是PDF字典

根据规范

编码名称或 词典 (可选)字体字符编码的规范(如果不同) 从它的内置编码。编码值应为 预定义编码的名称(MacRomanEncodingMacExpertEncoding,或WinAnsionCodeing,如附件所述 D) 或一个编码字典,该字典应规定与 字体的内置编码或指定的预定义编码(请参阅 9.6.6,“字符编码”)

(表111–类型1字体词典中的条目-)

这只允许宏编码MacExpertEncoding,或winansioncoding。(由于PDF查看器自带用于标准14种字体的单独字体程序,您不能依靠内置编码以任何可靠的方式帮助您。)

您是否确保您的波兰字符在
WIN_ANSI_编码中表示?关于APW,你还应该考虑提到的bug。
mypdf.setFont(StandardFonts.SUBTYPE,StandardFonts.COURIER,StandardFonts.ISO8859_2);
outputToFile("my.pdf",pdfcontent,"ISO-8859-2");
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);
}