web-dev-qa-db-ja.com

Androidでビュー(たとえばTextView)にMS Wordファイルを表示する

。docxファイルをAndroidのViewに表示したい。ファイルには、数学記号とテキストの間にある画像が含まれています。このようなファイルをたくさん表示して、swipeジェスチャーでファイルをめくりたいと思います。 。txtファイルに対して同じことを正常に実行しました。スワイプで次のページに簡単に移動できるようになりました。 。txtファイルのコードは次のとおりです。

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

このコードは、TextViewに表示するテキストを返します。この方法では、ファイルの名前を動的に変更し、スワイプでテキストの変更を変更するだけで済みます。

次に、このコードを変更して、テキスト、画像、数学記号を含むMS Wordファイル(.docx)を表示できるようにします。

私はすでにスタックオーバーフローと他のフォーラムでこのトピックについて多くの同様のスレッドをチェックしました:これらは同様の質問への回答として多くの人々が提案したリンクであり、私はすでにこれらを試しました: Link1 および link2

また、他の多くのスレッドで、人々はJopendocumentを推奨しています。私はそれについても読み、Androidはオープンドキュメント形式をサポートしていないため、そのオプションはありそうにありません。ただし、JOpenDocumentライブラリの追加に関する回避策または詳細な説明がある場合プロジェクトにリッチテキストを表示してから、その解決策を共有してください。私はそれを頻繁に検索しましたが、見つかりませんでした。

AndroidでリッチなWordファイルを表示するためのOliveDocLibraryという別のライブラリもあります。これが link です。ここから、私がlibをダウンロードしました。そのダウンロードパッケージに含まれているデモは問題なく動作しますが、libは試用版です。現在、このライブラリを使用して、どこに行くのかを確認しようとしています。しかし、まだより良いオプションを探しています。

これに関するどんな助けでもありがたいです。上記以外のポインタは大歓迎です。

更新:

私はこの質問で始めた最初の賞金でApache POI(より具体的にはHWPF)を使用することを示唆する提案を得ました。しばらくの間、Apache POIを調査した後、ドキュメントファイルへの書き込み、ドキュメントファイルの読み取り、Excelシートの更新などのコードを取得しました。

私がインターネットから見つけたそのようなサンプルコード(Java用)は次のようなものです:

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

そこで、このライブラリ(Apache POI)をEclipseのAndroid=プロジェクトに追加し、いくつかの変更を加えてこのサンプルコードを試しました。それをTextViewに表示してみました。ここでの問題はOliveDocLibraryのように画像が表示されないので、誰かがApache POIを提案する場合は、固体のポインタまたはコードを要求しますこれはdocxファイルとallその内容(画像を含む)を読み取りますカスタムビューに表示します。

Apache POIは素晴らしいことですが、残念ながら、これらのライブラリを実装する適切な例やサンプルが見つかりませんでした。良い例のソース(w.r.t MS Wordのみ)を知っている場合は、コメントで共有してください。

更新2

OliveDocLibraryパッケージでは、提供されたコードは正常に機能します。ビューにはオリーブのウォーターマークがあります。現在、そのコードでSwipeを実行しています。しかし、問題はその試用版であることに変わりはありません。

更新3:

OliveDocLibraryが最も効率的な方法だと思います。試用版であるという欠点はありますが、私の特定の要件を完全に満たすには、このライブラリよりも優れたライブラリは他にないでしょう。詳細な回答が投稿されました 。恵みの時がもうすぐ終わります。代わりのより良い解決策を持っているかもしれない人々に、それをできるだけ早く投稿するようにお願いします。今のところOliveDocLibraryを使用して、自分の答えを受け入れます。

27
D'yer Mak'er

こんにちはみんな多くの検討と地獄の多くのオプションと回避策を見た後、私はOliveDocLibraryがそれを行う最良の方法だと思います。こちらが link です。Android DOC、XLS、PPT用の3つのライブラリのダウンロードページに直接アクセスできます。これらはすべてうまく機能します。ダウンロードするパッケージフォルダーには、次の3つのフォルダーがあります。

  1. API
  2. lib_trial
  3. デモ

demoフォルダーには、Wordのサンプルプロジェクトがあります。このプロジェクトをEclipseのワークスペースに直接インポートして、コードを自分でテストできます。人々の便宜のために、そのコードをここに投稿しています。必要ないと感じたコードの一部を削除しました(私の質問に対する回答はここにあります)。したがって、コードには2つのファイルがあります。主なアクティビティはFileChooserで、次のとおりです。

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

}

ここに、simple.docxという名前のドキュメントファイルを配置しました。これには、適切にレンダリングおよび表示される画像と数学記号が含まれています。このアクティビティは、次のようにOliveWordTrialDemoActivityと相互作用します。

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

    }

}

lib_trialフォルダーには、個別に使用する場合にlibsフォルダーに追加できるライブラリがあります。

[〜#〜] api [〜#〜]フォルダーには、ライブラリとそのメソッドの詳細な説明がpdfファイル形式であり、非常に簡単です。理解する。そのため、人々はこのライブラリを直接使用し、特定の要件に提供されているメソッドを使用できます。

それが今のところ解決策です。より良い解決策があれば歓迎します。バウンティタイムが間もなく終了するので、できるだけ早く他の解決策を提供してください。ありがとう。

7
D'yer Mak'er

質問で述べたように、Jopendocument,OliveDocLibraryおよびApache POI運がありません。

次に、このコードを変更して、テキスト、画像、数学記号を間に含むMS Wordファイル(.docx)を表示できるようにします。

調査中に、私は Tika という名前のライブラリをもう1つ見つけました。このライブラリは、データとその サポートリストのドキュメント を抽出するためにも使用されました Libra Office ドキュメントの読み取り、書き込み、管理。

最後の提案:

あなたは変換することで達成できます、doc to htmlおよびhtml to pdf言及 ここ

変換する doc to html参照 スタックオーバーフローの回答

1
RobinHood