2013-03-29 126 views
26

Desidero visualizzare un file .docx in un View in Android. Il file ha simboli matematici e anche immagini tra il testo. Voglio visualizzare molti di questi file e sfogliarli tramite il gesto swipe. Ho eseguito lo stesso con successo per i file .txt. E ora puoi facilmente andare alla pagina successiva di scorrimento. Il codice per .txt file è il seguente:Visualizzazione di un file MS Word in visualizzazione (ad esempio TextView) in Android

public String readTxt(String fileName) 
    { 


     try { 
      InputStream is; 
      is = context.getAssets().open(fileName + ".txt"); 
      ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 

      int i; 
      i = is.read(); 
      while (i != -1) 
      { 
       byteArrayOutputStream.write(i); 
       i = is.read(); 
      } 

      is.close(); 

      return byteArrayOutputStream.toString(); 

     } 

     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 

     return fileName; 
    } 

Questo codice restituisce il testo che ho quindi visualizzare nella mia TextView. In questo modo ho solo bisogno di cambiare il nome del file in modo dinamico e scorrere le modifiche del testo.

Ora voglio modificare questo codice in modo che possa visualizzare file MS Word (.docx) che contengono testo, immagini e simboli matematici.

ho già controllato molte discussioni simili su questo argomento su stack overflow così come su altri forum: Questi sono i link molte persone hanno suggerito come risposte a domande simili e mi hanno già dato questi una prova: Link1 e link2

Anche su molti altri thread le persone hanno consigliato Jopendocument. Ho anche letto su questo e ho appreso che Android non supporta il formato di documento aperto. quindi questa opzione sembra improbabile. Ma se avete qualche soluzione o una buona spiegazione dettagliata riguardo all'aggiunta della libreria JOpenDocument al progetto e alla visualizzazione di rich text, condividete la soluzione perché l'ho cercata molto ma non ne ho trovata nessuna.

C'è anche un'altra libreria denominata OliveDocLibrary per visualizzare file word ricchi su Android. ecco il link da dove ho scaricato la libreria. La demo inclusa nel pacchetto di download funziona bene. Ma la versione di prova è una versione di prova. Al momento sto cercando di lavorare con questa libreria e vedere dove va. Ma sono ancora alla ricerca di opzioni migliori.

Qualsiasi aiuto in merito è apprezzato. Qualsiasi suggerimento diverso da quelli sopra menzionati è il benvenuto.

Aggiornamento:

ho ottenuto un suggerimento, che ha detto l'uso di Apache POI (HWPF più precisamente) nella prima taglia ho iniziato su questa questione. Dopo aver esplorato POI di Apache per qualche tempo, ho ricevuto alcuni codici che scrivevano in un file doc, leggendo il file doc, aggiornando i fogli ecc.

Tale codice di esempio (per Java) che ho trovato da Internet va qualcosa in questo modo:

import java.io.*; 
import org.apache.poi.hwpf.HWPFDocument; 
import org.apache.poi.hwpf.extractor.WordExtractor; 

public class ReadDocFile { 
public static void main(String[] args) { 
File file = null; 
WordExtractor extractor = null ; 
try { 

file = new File("c:\\New.doc"); 
FileInputStream fis=new FileInputStream(file.getAbsolutePath()); 
HWPFDocument document=new HWPFDocument(fis); 
extractor = new WordExtractor(document); 
String [] fileData = extractor.getParagraphText(); 
for(int i=0;i<fileData.length;i++){ 
if(fileData[i] != null) 
System.out.println(fileData[i]); 
} 
} 
catch(Exception exep){} 
} 
} 

così ho aggiunto questa libreria (Apache POI) al mio progetto Android in Eclipse e ha cercato questo codice di esempio con alcune modifiche. E ho provato a visualizzarlo su un TextView. Il problema qui però è che non visualizza le immagini come OliveDocLibrary fa. Quindi, se Qualcuno suggerirà il POI di Apache, richiedo un puntatore o un codice solido che legge un file docx e tutto il suo contenuto (che include le immagini) e li visualizza in una vista personalizzata.

Apache POI è una grande cosa, ma purtroppo non ho trovato esempi/esempi validi che implementassero tali librerie. Se conosci una buona fonte di esempi (solo w.r.t MS word), per favore condividili nei commenti.

Update 2:

Nel pacchetto OliveDocLibrary il codice fornito funziona bene. C'è però il marchio d'acqua di Olive sulla vista. Attualmente sto lavorando per eseguire Swipe su quel codice. Ma il problema rimane che è una versione di prova.

Update 3:

penso OliveDocLibrary è il modo più efficace per farlo. Anche se ha uno svantaggio di essere una versione di prova, penso che nessun'altra libreria faccia un lavoro migliore di questa libreria per riempire completamente il mio specifico requisito. La risposta dettagliata è stata pubblicata below. Mentre il tempo della taglia sta per finire. Chiederei alle persone che potrebbero avere una soluzione alternativa e migliore di postarlo il prima possibile. Per ora sto andando con OliveDocLibrary e accettando la mia risposta.

+0

Dal thread qui: http://forum.openoffice.org/en/forum/viewtopic.php?f=12&t=38718 Mi aspetterei che sarebbe più semplice trasformare i documenti di Word in pdf e visualizzarli in Android. –

+0

Segui questo link penso che questo è quello che ti serve [Come rendere PDF in Android] (http://stackoverflow.com/questions/2883355/how-to-render-pdf-in-android) è per pdf ti penso può fare lo stesso per i documenti d'ufficio che puoi inviare tramite intent se l'app è già installata o visualizzata in webview con i link di google doc –

risposta

7

Ciao ragazzi Dopo molte considerazioni e guardando inferno sacco di opzioni e soluzioni penso OliveDocLibrary è il modo migliore per farlo. Ecco lo link che ti indirizzerà alla pagina di download di tre librerie per Android che sono per DOC, XLS e PPT. Tutti questi funzionano egregiamente. La cartella del pacchetto che scaricherai avrà tre cartelle all'interno. che sono:

  1. API
  2. lib_trial
  3. Demo

Nella cartella demo si trova un progetto di esempio per Word. Puoi importare direttamente questo progetto nel tuo spazio di lavoro in Eclipse e testare il codice tu stesso. Per comodità delle persone sto postando quel codice qui.Ho cancellato parte del codice che ritenevo non fosse necessario (la risposta alla mia domanda qui). Così il codice ha due file, l'attività principale è FileChooser che è la seguente:

public class FileChooser extends Activity { 

    private String filePath = Environment.getExternalStorageDirectory() 
      .getPath() + "/simple.docx"; 
    MyBaseAdapter adapter; 
    private static String parentPath; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(2); 
     copyFileToSdcard(); 
     Intent intent = new Intent(FileChooser.this, 
       OliveWordTrailDemoAcitivy.class); 
     intent.setAction(Intent.ACTION_VIEW); 
     intent.setData(Uri.fromFile(new File(filePath))); 
     startActivity(intent); 
    } 

    class MyBaseAdapter extends BaseAdapter { 
     private String[] list; 

     public MyBaseAdapter(String[] list) { 
      this.list = list; 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      if (convertView == null) { 
       convertView = new TextView(FileChooser.this); 
       ((TextView) convertView).setTextSize(35); 
      } 
      ((TextView) convertView).setText(list[position]); 
      return convertView; 
     } 

     @Override 
     public long getItemId(int position) { 
      return position; 
     } 

     @Override 
     public Object getItem(int position) { 
      return null; 
     } 

     @Override 
     public int getCount() { 
      return list.length; 
     } 

     public void setList(String[] list) { 
      this.list = list; 
     } 
    }; 

    class MyItemClickListener implements OnItemClickListener { 
     String[] list; 
     InputStream is; 

     public MyItemClickListener(String[] list) { 
      this.list = list; 
     } 

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, 
       long id) { 

      File file = new File(parentPath + list[position]); 
      if (file.isFile()) { 
       Intent intent = new Intent(FileChooser.this, 
         OliveWordTrailDemoAcitivy.class); 
       intent.setAction(Intent.ACTION_VIEW); 
       intent.setData(Uri.fromFile(file)); 
       startActivity(intent); 
      } else { 
       list = file.list(); 
       adapter.setList(list); 
       adapter.notifyDataSetChanged(); 
       parentPath = file.getAbsolutePath() + "/"; 
      } 
     } 

    } 
    private void copyFileToSdcard() { 
     InputStream inputstream  = getResources().openRawResource(
       R.raw.simple); 
     byte[] buffer = new byte[1024]; 
     int count = 0; 
     FileOutputStream fos = null; 
     try { 
      fos = new FileOutputStream(new File(filePath)); 
      while ((count = inputstream.read(buffer)) > 0) { 
       fos.write(buffer, 0, count); 
      } 
      fos.close(); 
     } catch (FileNotFoundException e1) { 
      e1.printStackTrace(); 
      Toast.makeText(FileChooser.this, "Check your sdcard", Toast.LENGTH_LONG).show(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

} 

Qui ho messo un file doc di nome simple.docx che include immagini e simboli matematici che sono resi e visualizzati correttamente. Questa attività interagisce con OliveWordTrialDemoActivity che è la seguente:

public class OliveWordTrailDemoAcitivy extends Activity implements 
OnClickListener, CommentListener, NoteListener, HyperlinkListener, ProgressListener { 

    OliveWordOperator viu; 

    EditText searchEditText; 
    ArrayList<String> bookmarks; 
    Handler handler; 

    protected void onCreate(Bundle savedInstanceState) { 
     viu = new OliveWordOperator(this, this); 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_PROGRESS); 
     setProgressBarVisibility(true); 
     getWindow().setFeatureInt(Window.FEATURE_PROGRESS, Window.PROGRESS_VISIBILITY_ON); 
     setContentView(R.layout.demo_view); 
     OliveWordView view = (OliveWordView) findViewById(R.id.test_view); 

     try { 
      viu.init(view, getIntent().getData()); 
      viu.start(viu.isEncrypted(), "111"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     handler = new Handler(){ 

      @Override 
      public void handleMessage(Message msg) { 
       setProgress(msg.what * 10); 
       super.handleMessage(msg); 
      } 

     }; 

    } 

    @Override 
    protected void onDestroy() { 
     viu.release(); 
     super.onDestroy(); 
    } 

    @Override 
    public void getComment(ArrayList<String[]> comments) { 
     for (int i = 0; i < comments.size(); i++) { 
      AlertDialog.Builder builder = new Builder(this); 
      builder.setTitle(comments.get(i)[0]).setMessage(comments.get(i)[1]) 
      .show(); 
     } 
    } 

    @Override 
    public void getHyperlink(String hyperlink) { 
     if (Uri.parse(hyperlink).getScheme().contains("mailto")) { 
      try { 
       startActivity(new Intent(Intent.ACTION_SENDTO, 
         Uri.parse(hyperlink))); 
      } catch (ActivityNotFoundException anfe) { 
       Toast.makeText(this, "can't found email application", 
         Toast.LENGTH_SHORT).show(); 
      } 
     } else { 
      startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(hyperlink))); 
     } 
    } 

    @Override 
    public void getNote(SparseArray<String> notes) { 
     for (int i = 0; i < notes.size(); i++) { 
      AlertDialog.Builder builder = new Builder(this); 
      if (notes.keyAt(i) == NoteListener.FOOTNOTE) { 
       builder.setTitle("footnote").setMessage(notes.valueAt(i)) 
       .show(); 
      } else if (notes.keyAt(i) == NoteListener.ENDNOTE) { 
       builder.setTitle("endnote").setMessage(notes.valueAt(i)).show(); 
      } 
     } 

    } 

    public void goToBookmarks(String name) { 
     viu.goToBookmark(name); 
    } 

    public void listBookmarks() { 
     this.bookmarks = viu.listBookmarks(); 
    } 

    @Override 
    public void notifyProgress(int progress) { 
     handler.sendEmptyMessage(progress); 
    } 

    @Override 
    public void onClick(View v) { 

    } 

} 

Nella cartella lib_trial si trova la libreria che può essere aggiunto alle vostre librerie cartella se si desidera utilizzare separatamente.

E nella cartella API troverete una descrizione dettagliata della libreria e dei suoi metodi sotto forma di un file pdf che è molto facile da capire. così le persone possono semplicemente usare direttamente questa libreria e utilizzare i metodi forniti per il loro specifico requisito.

Quindi questa è la soluzione per ora. Qualunque soluzione migliore è la benvenuta. Il tempo di taglia sta per finire presto, quindi ti preghiamo di fornire qualsiasi altra soluzione che potresti avere il prima possibile. Grazie.

+0

Posso anche visualizzare correttamente la parola documento utilizzando la libreria sopra. L'unico problema è di "Filigrana" che viene visualizzato nel documento. Hai trovato qualche altro modo migliore per visualizzare il documento MS-Word o hai qualche idea per rimuovere questa filigrana? – YuDroid

+0

@YuDroid: No. Non ho trovato nulla di meglio della soluzione OliveDocLibrary per questo problema. E sì. La filigrana è davvero un problema. Non sto più lavorando a questo progetto, ma se trovi un modo migliore. Per favore condividi la tua risposta su questo thread perché ho cercato di esplorare tutti i modi possibili e li ho menzionati qui. –

+0

Sì, certo ... :) – YuDroid

1

Come hai detto nella tua domanda che hai già provato alcune delle librerie come Jopendocument,OliveDocLibrary e Apache POI ma senza fortuna.

Ora voglio modificare il codice in modo che io possa visualizzare i file MS Word (.docx), che contengono testo, immagini e simboli matematici in mezzo.

Mentre la ricerca mi sono imbattuto in un altro libreria denominata , che ha usato anche per estrarre i dati e la sua support listed documents e anche Libra Office dove è possibile leggere scrivere e gestire documenti.

Ultimo suggerimento:

si può ottenere mediante la conversione, doc to html e html to pdf come menzione here.

Per convertire doc to html riferiscono stack-overflow answer

+0

Ciao @RobinHood. Grazie per la risposta. Sarebbe davvero utile se fosse possibile inviare un codice di esempio per l'utilizzo di tika per visualizzare i file di Word in Android. Ho cercato un codice di esempio. Ma non posso trovarne. Sul link specificato si dice che utilizza POI Apache per questa operazione. questo è quello che è scritto sul link che hai postato w.r.t file MS "Le classi di OfficeParser e OOXMLParser utilizzano librerie POI Apache per supportare l'estrazione di testo e metadati da entrambi i documenti OLE2 e OOXML." –

+1

http://www.hascode.com/2012/12/content-detection-metadata-and-content-extraction-with-apache-tika/ http://stackoverflow.com/questions/11932762/how-to- detect-image-in-a-document http://www.jworks.nl/2011/09/02/friday-repost-indexing-documents-with-tika-and-grails/ questo sono alcuni dei collegamenti, che non Hai un esempio esatto come vuoi ma otterrai il riferimento da esso. – RobinHood