web-dev-qa-db-fra.com

Affichage d'un fichier MS Word dans View (par exemple TextView) dans Android

Je souhaite afficher un fichier . Docx dans un View sous Android. Le fichier contient des symboles mathématiques et également des images entre le texte. Je souhaite afficher de nombreux fichiers de ce type et les parcourir via le geste swipe. J'ai réussi à faire de même pour les fichiers .txt . Et peut maintenant aller très facilement à la page suivante sur le balayage. Le code du fichier .txt est le suivant:

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

Ce code renvoie le texte que j'affiche ensuite dans mon TextView. De cette façon, je n'ai besoin que de changer le nom du fichier dynamiquement et en glissant les modifications de texte.

Maintenant, je veux modifier ce code afin de pouvoir 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 sujets similaires sur ce sujet sur le débordement de pile ainsi que sur d'autres forums: Ce sont les liens que beaucoup de gens ont suggérés comme réponses à des questions similaires et je les ai déjà essayées: Link1 et link2

Aussi sur de nombreux autres threads, les gens ont recommandé Jopendocument . J'ai également lu à ce sujet et appris que Android ne prend pas en charge 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 concernant l'ajout de la bibliothèque JOpenDocument au projet et en affichant du texte enrichi, veuillez partager cette solution, car je l'ai beaucoup recherchée mais je n'en ai pas trouvé.

Il existe également 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 package de téléchargement fonctionne très bien, mais la lib est une version d'essai. J'essaie donc actuellement de travailler avec cette bibliothèque et de voir où elle va. Mais je suis toujours à la recherche de meilleures options.

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

Mise à jour:

J'ai reçu une suggestion qui indiquait l'utilisation de Apache POI (HWPF plus spécifiquement) dans la première prime que j'ai commencée sur cette question. Après avoir exploré le POI Apache pendant un certain temps, j'ai obtenu quelques codes qui écrivaient dans un fichier doc, lisaient le fichier doc, mettaient à jour les feuilles Excel, etc.

Un exemple de code (pour Java) que j'ai trouvé sur Internet ressemble à 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){}
}
}

J'ai donc ajouté cette bibliothèque (Apache POI) à mon Android dans Eclipse et essayé cet exemple de code avec quelques modifications. Et j'ai essayé de l'afficher sur un TextView. Le problème ici cependant est-ce qu'il n'affiche pas les images comme OliveDocLibrary le fait. 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 comprend 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/exemples mettant en œuvre ces bibliothèques. Si vous connaissez une bonne source d'exemples (avec MS Word uniquement), veuillez les partager dans les commentaires.

Mise à jour 2 :

Dans le package OliveDocLibrary , le code fourni fonctionne correctement. Il y a cependant une marque d'eau d'olive sur la vue. 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 que OliveDocLibrary est le moyen le plus efficace de le faire. Bien qu'elle présente l'inconvénient d'être une version d'essai, je pense qu'aucune autre bibliothèque ne fait un meilleur travail que cette bibliothèque pour répondre pleinement à mes besoins spécifiques. La réponse détaillée a été publiée ci-dessous . Alors que le temps des primes est sur le point de se terminer. Je demanderais aux personnes qui pourraient avoir une solution alternative et meilleure de l'afficher dès que possible. Pour l'instant, je vais avec OliveDocLibrary et j'accepte ma propre réponse.

27
D'yer Mak'er

Bonjour les gars. Après beaucoup de considération et après avoir examiné beaucoup d'options et de solutions, je pense que OliveDocLibrary est la meilleure façon de le faire. Voici le lien qui vous dirigera vers la page de téléchargement de trois bibliothèques pour Android qui sont pour DOC, XLS et PPT. Tout cela fonctionne très bien. Le dossier du paquet que vous téléchargerez aura trois dossiers à l'intérieur.

  1. API
  2. lib_trial
  3. Démo

Dans le dossier de démonstration , 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 plus de commodité, je poste ce code ici. J'ai supprimé une partie du code qui, selon moi, n'était pas nécessaire (avec la réponse à ma question ici). Le code a donc deux fichiers, L'activité principale est FileChooser qui est la suivante:

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 comprend des images et des symboles mathématiques qui sont rendus et affichés correctement. Cette activité interagit avec OliveWordTrialDemoActivity, 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 souhaitez 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 forme de pdf fichier très simple à comprendre. afin que les gens puissent simplement utiliser cette bibliothèque directement et utiliser les méthodes fournies selon leurs besoins spécifiques.

C'est donc la solution que j'utilise pour l'instant. Toutes les meilleures solutions sont les bienvenues. Le temps de prime est sur le point de se terminer bientôt, veuillez donc fournir toute autre solution que vous pourriez avoir dès que possible. Merci.

7
D'yer Mak'er

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

Maintenant, je veux modifier ce code afin de pouvoir afficher des fichiers MS Word (.docx) qui contiennent du texte, des images et des symboles mathématiques entre les deux.

Pendant la recherche, je suis tombé sur une autre bibliothèque nommée Tika , qui sert également à extraire les données et leurs support des documents répertoriés et même Libra Office où vous pouvez lire écrire et gérer des documents.

Dernière suggestion:

Vous pouvez y parvenir en convertissant, doc to html et html to pdf comme mention ici .

Convertir doc to html refer réponse de débordement de pile

1
RobinHood