28

Androidで.docxファイルを表示したい。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;
    }

このコードは、次に my に表示するテキストを返しますTextView。このようにして、ファイルの名前を動的に変更し、スワイプするとテキストが変更されるだけです。

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

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

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

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

これに関するヘルプは大歓迎です。上記以外のご指摘も大歓迎です。

アップデート:

この質問で始めた最初の報奨金で、 Apache POI (より具体的には HWPF)の使用を伝える提案を受けました。しばらく Apache POI を調べた後、doc ファイルへの書き込み、doc ファイルの読み取り、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ファイルとそのすべてのコンテンツ (画像を含む) を読み取り、それらをカスタム ビューに表示するソリッド ポインターまたはコードを要求します。

Apache POIは素晴らしいものですが、残念ながら、これらのライブラリを実装する良い例やサンプルは見つかりませんでした。良い例の情報源 (MS ワードのみ) を知っている場合は、コメントでそれらを共有してください。

更新 2 :

OliveDocLibraryパッケージでは、提供されたコードは正常に動作します。ただ、ビューにオリーブのウォーターマークがあります。現在、そのコードの実行に取り組んでSwipeいます。しかし、試用版であるという問題が残ります。

更新 3:

OliveDocLibraryが最も効率的な方法だと思います。試用版であるという欠点はありますが、このライブラリよりも私の特定の要件を完全に満たしてくれるライブラリは他にないと思います。詳細な回答は以下に掲載されています。バウンティタイムが過ぎようとしているので。別のより良い解決策を持っている可能性のある人には、できるだけ早く投稿するようお願いします。今のところ、 OliveDocLibraryを使用し、自分の回答を受け入れます。

4

2 に答える 2

7

こんにちは皆さん よく考えて、たくさんのオプションと回避策を検討した結果、 OliveDocLibraryが最適な方法だと思います。DOC、XLS、PPT 用の 3 つの Android ライブラリのダウンロード ページに直接アクセスできるリンクを次に示します。これらはすべて非常にうまく機能します。ダウンロードするパッケージ フォルダーには、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という名前の doc ファイルを配置しました。このファイルには、適切にレンダリングおよび表示される画像と数学記号が含まれています。このアクティビティ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 ファイル形式で記載されています。そのため、人々はこのライブラリを直接使用して、特定の要件に合わせて提供されたメソッドを使用できます。

それが今のところ解決策です。より良い解決策は大歓迎です。報奨金の期限がもうすぐ過ぎますので、できるだけ早く他の解決策を提供してください。ありがとう。

于 2013-04-17T06:38:55.417 に答える
2

あなたの質問で言及したように、あなたはすでにライブラリのようなものをいくつか試しましたが、運はJopendocument, OliveDocLibraryありApache POIませんでした。

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

調査中に、 Tikaという名前の別のライブラリに出くわしました。これは、データとそのサポートリストにあるドキュメントを抽出するために使用され、ドキュメントを読み書きおよび管理できるLibra Officeでさえ使用されました。

最後の提案:

ここで言及されているようにdoc to html、変換することで達成できます。html to pdf

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

于 2013-04-11T05:58:40.760 に答える