2013-10-04 73 views
0

我正在使用Android PDF寫入(APW)創建PDF,但它不適用於某些特殊字符(葡萄牙語)。Android PDF Writer(APW)Enconding

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

標準enconding是:

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

,並沒有成功。 任何想法我該怎麼做?

EDIT

方法outputToFile被定義爲:

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:

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被定義:

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

然後我回來了黑色字體顏色:

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

'outputToFile'做什麼?有人問道,對APW來源的快速看法似乎表明,在字體和編碼方面它不太靈活。 – mkl

+1

啊,從PDFWriterDemo我假設。首先:因爲字符串包含偏移引用,所以您**不得**使用多字節或可變字節數編碼。實際上,APW在這裏返回一個字符串而不是字節數組是非常荒謬的。 PDF文件不是文字。這就是說,你應該顯示你實際添加特殊字符的代碼,包括你用來創建和選擇字體對象的代碼。 – mkl

+1

好的,但是如何在mypdf.addText(170,50,40,「Cora?o」)行之前設置字體?我問這個問題的原因是,根據你選擇的字體,字符串所需的編碼可能不同,也許你的字符根本不可選!例如。 A(atilde)中內置的編碼可以具有八進制值213,343,或343(MacRomanEncoding,WinAnsiEncoding,PDFDocEncoding的,該PDF [規格]的比照附件d(http://www.adobe.com/content /dam/Adobe/en/devnet/acrobat/pdfs/PDF32000_2008.pdf)),並且您使用的字體必須包含開頭的字符。 – mkl

回答

3

我把所提供的所有信息,寫了下面的簡單的單元測試方法並運行它。

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類的helper方法)

結果看起來是這樣的:

Screenshot of helloworld19192108.pdf in Adobe Reader

這似乎非常滿足的期望。

因此,無論哪種方式它都不適用於OP的某些特殊字符(葡萄牙語),因此重現此問題時缺少一些重要信息。

PS:根據開發環境的設置,源代碼中可能存在非ASCII字符的問題。因此,它可能是一個好主意,用

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

PPS更換

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

:查看文件產生這樣的希望修復後安裝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的版本),您也應該修復此代碼。

+0

什麼我沒有提到的是,我改變顏色,添加rawcontent的文件,像這樣:mypdf.addRawContent(「1 1 1 RG \ n」);是對的嗎? –

+0

你還沒有提到什麼,還包括什麼**完全不適合你**。到目前爲止,只有在不考慮交叉引用問題的情況下,我才發現事情確實有效。 – mkl

+0

我不知道你是否可以改變顏色,因爲你不知道究竟是什麼**不適合你**。 – mkl