Writer di Android PDF (APW) Enconding

Sto usando Android PDF Write (APW) per creare un PDF, ma non funziona con alcuni caratteri speciali (portoghese).

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

L'enconding standard è:

  • Android: come get il valore di un attributo nel codice?
  • Android - FirebaseListAdapter in ordine inverso?
  • Ottieni / seleziona un'image dall'applicazione della Galleria integrata di Android in modo programmato
  • ADB non riconosce il mio Galaxy Nexus - Win7
  • Android View.onDraw () ha sempre una canvas pulita
  • Android: limitare EditText ai numbers
  •  mypdf.setFont(StandardFonts.SUBTYPE, StandardFonts.COURIER, StandardFonts.WIN_ANSI_ENCODING); outputToFile("helloworld.pdf",pdfcontent,"ISO-8859-1"); 

    Ho provato

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

    e non è riuscito. Qualche idea che cosa devo fare?

    EDIT

    Il metodo outputToFile è definito come:

      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) { // } } 

    Il metodo addText è definito come:

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

    Inoltre, cambio il colore del carattere a bianco aggiungendo il seguente rawcontent:

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

    Poi torno al colore nero del carattere:

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

  • Rileva se il dispositivo Android dispone di connessione a Internet
  • Cosa fa realmente google-services.json?
  • Le righe di listview ordinano cambiano a caso in un elenco di listview in android
  • Risorse $ NotFoundException: La risorsa non è un disegno (colore o path)?
  • Webview di Android lento lento
  • Come impostare la data minima DatePicker alla data corrente
  • One Solution collect form web for “Writer di Android PDF (APW) Enconding”

    Ho preso tutte le informazioni fornite, ho scritto il seguente semplice metodo di test di unità e ho eseguito.

     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 è il metodo di aiuto dalla class APW PDFWriterDemo )

    Il risultato sembra questo:

    Schermata di helloworld19192108.pdf in Adobe Reader

    Questo sembra abbastanza per soddisfare le aspettative.

    Quindi, in qualunque modo non funziona con alcuni caratteri speciali (portoghese) per l'OP, mancano alcune informazioni vitali per riprodurre il problema.

    PS: A seconda della configuration dell'ambiente di sviluppo, potrebbe esserci un problema con i caratteri non ASCII nel codice sorgente. Pertanto, potrebbe essere una buona idea sostituire

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

    con

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

    PPS: Adobe Reader dopo aver visto un file generato come questo vuole ripararlo. Il motivo è che la tabella di riferimento trasversale è rotta. Il codice che genera le voci per esso è questo:

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

    (da CrossReferenceTable.java )

    Contando i caratteri in questa voce si ottengono 10 + 1 + 5 + 3 + 2 = 21.

    Secondo la specifica, però:

    Ogni voce deve essere esattamente 20 byte di lunghezza, inclusa la marcatura finale

    (dalla sezione 7.5.4 tabella trasversale di ISO 32000-1 )

    Quando si utilizza (la versione corrente) di Android PDF Writer, è necessario correggere questo codice.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.