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"
    );
}

さらに、フォントの色を白に変更して、次の rawcontent を追加します。

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");
}

( outputToFileAPWPDFWriterDemoクラスのヘルパー メソッドです)

結果は次のようになります。

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 に答える