1

我正在使用 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"
    );
}

此外,我将字体颜色更改为白色,添加以下原始内容:

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

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

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

1 回答 1

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作为 APWPDFWriterDemo类的辅助方法)

结果如下所示:

Adobe Reader 中 helloworld19192108.pdf 的屏幕截图

这似乎非常符合预期。

因此,无论以何种方式它不适用于 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 个字节,包括行尾标记

(来自ISO 32000-1第 7.5.4 节交叉参考表

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

于 2013-10-08T15:14:39.453 回答