Android PDF Writer(APP)编码

时间:2013-10-04 23:08:52

标签: android pdf encoding

我使用Android PDF Write(APW)来创建PDF,但它不适用于某些特殊字符(葡萄牙语)。

mypdf.addText(170, 50, 40,"Coração");

标准的含义是:

mypdf.setFont(StandardFonts.SUBTYPE, StandardFonts.COURIER, StandardFonts.WIN_ANSI_ENCODING);
outputToFile("helloworld.pdf",pdfcontent,"ISO-8859-1");

我试过了

outputToFile("helloworld.pdf",pdfcontent,"UTF-8");
outputToFile("helloworld.pdf",pdfcontent,"UTF-16");
outputToFile("helloworld.pdf",pdfcontent,"Cp1252");

并没有成功。 任何想法我该怎么办?

修改

方法outputToFile定义为:

    private void outputToFile(String fileName, String pdfContent, String encoding) {
    File newFile = new File(Environment.getExternalStorageDirectory() + "/" + fileName);
    try {
        newFile.createNewFile();
        try {
            FileOutputStream pdfFile = new FileOutputStream(newFile);
            pdfFile.write(pdfContent.getBytes(encoding));
            pdfFile.close();
        } catch(FileNotFoundException e) {
            //
        }
    } catch(IOException e) {
        //
    }
}

方法addText定义为:

    public void addText(int leftPosition, int topPositionFromBottom, int fontSize, String text, String transformation) {
    addContent(
        "BT\n" +
        transformation + " " + Integer.toString(leftPosition) + " " + Integer.toString(topPositionFromBottom) + " Tm\n" +
        "/F" + Integer.toString(mPageFonts.size()) + " " + Integer.toString(fontSize) + " Tf\n" +
        "(" + text + ") Tj\n" +
        "ET\n"
    );
}

此外,我将字体颜色更改为白色,添加以下rawcontent:

mypdf.addRawContent("1 1 1 rg\n"); 

然后我回到黑色字体颜色:

    mypdf.addRawContent("0 0 0 rg\n");

1 个答案:

答案 0 :(得分:4)

我获取了所有提供的信息,编写了以下简单的单元测试方法并运行它。

public void test19192108()
{
    PDFWriter mPDFWriter = new PDFWriter(PaperSize.FOLIO_WIDTH, PaperSize.FOLIO_HEIGHT);
    mPDFWriter.setFont(StandardFonts.SUBTYPE, StandardFonts.COURIER, StandardFonts.WIN_ANSI_ENCODING);
    mPDFWriter.addText(170, 50, 40,"Coração");

    String pdfcontent = mPDFWriter.asString();
    outputToFile("helloworld19192108.pdf",pdfcontent,"ISO-8859-1");
}

outputToFile是来自APW PDFWriterDemo类的辅助方法)

结果如下:

Screenshot of helloworld19192108.pdf in Adobe Reader

这似乎非常符合预期。

因此,无论哪种方式它都不适用于OP的某些特殊字符(葡萄牙语),因此重现该问题时缺少一些重要信息。

PS:根据开发环境的设置,源代码中可能存在非ASCII字符的问题。因此,替换

可能是个好主意
    mPDFWriter.addText(170, 50, 40,"Coração");

    mPDFWriter.addText(170, 50, 40,"Cora\u00e7\u00e3o");

PPS:查看生成的文件后,Adobe Reader想要修复它。原因是交叉引用表被破坏了。生成条目的代码是:

public void addObjectXRefInfo(int ByteOffset, int Generation, boolean InUse) {
    StringBuilder sb = new StringBuilder();
    sb.append(String.format("%010d", ByteOffset));
    sb.append(" ");
    sb.append(String.format("%05d", Generation));
    if (InUse) {
        sb.append(" n ");
    } else {
        sb.append(" f ");
    }
    sb.append("\r\n");
    mList.add(sb.toString());
}
  

(来自CrossReferenceTable.java

计算此条目中的字符,我们得到10 + 1 + 5 + 3 + 2 = 21。

根据规范,但是:

  

每个条目的长度应为20个字节,包括行尾标记

     

(来自第7.5.4节 ISO 32000-1的交叉引用表

使用(当前版本)Android PDF Writer时,您也应修复此代码。