Afficher un fichier MS Word en vue (par exemple TextView) dans Android

je veux afficher un .docx fichier dans un View dans Android. Le fichier des symboles mathématiques et aussi des images dans le texte. Je veux afficher beaucoup de tels fichiers et les feuilleter via swipe geste. J'ai fait avec succès la même chose pour .txt "151990920 de fichiers". Et peut maintenant très facilement aller à la page suivante sur le balayage. Le code pour .txt fichier comme suit:

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

This le code renvoie le texte que j'affiche alors dans mon TextView . De cette façon, j'ai seulement besoin de changer le nom du fichier dynamiquement et de glisser sur la modification du Texte.

maintenant je veux modifier ce code pour que je puisse afficher des fichiers MS Word(.docx) qui contiennent du texte,des images et des symboles mathématiques.

j'ai déjà vérifié de nombreux threads similaires sur ce sujet sur le débordement de la pile ainsi que sur d'autres forums: Ce sont les liens que beaucoup de gens ont suggéré que réponses à des questions similaires et je l'ai déjà donné un essai: Link1 et link2

aussi sur beaucoup d'autres fils, les gens ont recommandé Jopendocument . J'ai également lu à ce sujet et appris que Android ne supporte pas le format de document ouvert. cette option semble donc peu probable. Mais si vous avez une solution de contournement ou une bonne explication détaillée en ce qui concerne l'ajout de la bibliothèque JOpenDocument à le projet et l'affichage du texte riche alors s'il vous plaît partagez cette solution parce que je l'ai cherché beaucoup mais n'ai pas pu en trouver.

Il ya aussi une autre bibliothèque appelée OliveDocLibrary pour afficher des fichiers word riches sur android. voici le lien d'où j'ai téléchargé la lib. La démo incluse dans ce paquet de téléchargement fonctionne très bien.Mais la lib est une version d'essai. Donc suis en train d'essayer de travailler avec cette bibliothèque et voir où il va. Mais je suis toujours à la recherche de meilleures options.

toute aide à ce sujet est appréciée. Tous les conseils autres que ceux mentionnés ci-dessus sont les bienvenus.

mise à jour:

j'ai eu une suggestion qui disait l'utilisation de Apache POI (HWPF plus spécifiquement) dans le premier bounty j'ai commencé sur cette question. Après avoir exploré Apache POI pendant un certain temps, j'ai eu quelques codes qui étaient en train d'écrire dans un fichier doc, de lire le fichier doc, de mettre à jour les feuilles excel, etc.

un tel exemple de code (pour Java) que j'ai trouvé sur internet fait quelque chose comme ceci:

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

donc j'ai ajouté cette bibliothèque(Apache POI) à mon projet Android dans eclipse et j'ai essayé ce code échantillon avec quelques modifications. Et essayé de l'afficher sur un TextView . Le problème ici est qu'il n'affiche pas les images comme OliveDocLibrary ne. Donc, si Quelqu'un va suggérer Apache POI, alors je demande un pointeur solide ou un code qui lit un fichier docx et tout son contenu(qui inclut des images) et les affiche dans une vue personnalisée.

Apache POI est une bonne chose mais malheureusement je n'ai pas trouvé de bons exemples/échantillons mettant en œuvre ces bibliothèques. Si vous connaissez une bonne source d'exemples(W. R. T MS word seulement) alors s'il vous plaît les partager dans les commentaires.

Update 2 :

Dans OliveDocLibrary package le code fonctionne très bien. Il y a une marque D'eau D'Olive sur la vue cependant. Je travaille actuellement sur l'exécution de Swipe sur ce code. Mais le problème reste que c'est une version d'essai.

mise à Jour 3:

je pense OliveDocLibrary est le moyen le plus efficace de le faire. Bien qu'il ait un inconvénient d'être une version d'essai, je pense qu'aucune autre bibliothèque fait un meilleur travail que cette bibliothèque pour remplir mon besoin spécifique. La réponse détaillée a été postée ci-dessous . Comme le temps de la prime est sur le point de passer. Je demanderais aux personnes qui pourraient avoir une solution alternative et meilleure de la poster le plus tôt possible. Pour l'instant je vais avec OliveDocLibrary et accepter ma propre réponse.

26
demandé sur Community 2013-03-29 09:21:26

2 réponses

Bonjour les gars, Après beaucoup de considération et de regarder l'enfer beaucoup d'options et de solutions de contournement, je pense que OliveDocLibrary est la meilleure façon de le faire. Voici le lien qui vous donnera directement à la page de téléchargements de trois bibliothèques pour Android qui sont pour DOC, XLS et PPT. Tous ces travaux excellemment bien. Le dossier package que vous allez télécharger aura trois dossiers à l'intérieur. qui sont:

  1. API
  2. lib_trial
  3. Démo

dans le dossier Démo vous trouverez un exemple de projet pour Word. Vous pouvez importer directement ce projet dans votre espace de travail dans Eclipse et tester le code vous-même. Pour la commodité des gens je poste ce code ici. J'ai supprimé une partie du code que j'ai ressenti était pas nécessaire(w.r.t la réponse à ma question ici). Si le code a deux fichiers, L'activité principale est FileChooser qui est comme suit:

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

}

ici j'ai placé un fichier doc nommé simple.docx qui inclut des images et des symboles mathématiques qui sont rendus et affichés correctement. Cette activité interagit avec OliveWordTrialDemoActivity qui est comme suit:

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

    }

}

dans le dossier lib_trial vous trouverez la bibliothèque qui peut être ajoutée à votre dossier libs si vous voulez l'utiliser séparément.

et dans le dossier API vous trouverez une description détaillée de la bibliothèque et de ses méthodes sous la forme d'un fichier pdf très facile à comprendre. les gens peuvent donc utiliser cette bibliothèque directement et utiliser les méthodes fournies à leurs besoins spécifiques.

donc c'est la solution que j'ai pour l'instant. Toute meilleure solution est la bienvenue. Le temps de prime est sur le point d'obtenir plus bientôt donc s'il vous plaît fournir toute autre solution vous peut avoir dès que possible. Grâce.

7
répondu D'yer Mak'er 2013-04-17 10:31:18

comme vous mentionnez dans votre question que vous avez déjà essayé peu de bibliothèque comme Jopendocument, OliveDocLibrary et Apache POI mais pas de chance.

maintenant je veux modifier ce code pour que je puisse afficher des fichiers MS Word(.docx) qui contiennent du texte,des images et des symboles mathématiques entre les deux.

tandis que la recherche je suis tombé sur une bibliothèque de plus nommé Tika , qui a également utilisé pour extraire des données et son support répertoriés documents et même Balance Bureau où vous pouvez lire écrire et gérer des documents.

dernière suggestion:

vous pouvez réaliser en convertissant, doc to html et html to pdf comme mention ici .

convertir doc to html consultez stack overflow réponse

1
répondu RobinHood 2017-05-23 12:01:58