在Android中显示视图中的MS Word文件(比如TextView)

D'y*_*'er 27 android rtf ms-word textview

我想在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;
    }
Run Code Online (Sandbox Code Playgroud)

此代码返回我随后显示的文本TextView.这样我只需要动态更改文件的名称,然后滑动文本更改.

现在我想修改此代码,以便我可以显示包含文本,图像和数学符号的MS Word文件(.docx).

我已经在堆栈溢出以及其他论坛上检查了许多关于此主题的类似线程:这些是许多人建议作为类似问题的答案的链接,我已经尝试过这些:Link1link2

在许多其他线程上,人们也推荐了Jopendocument.我也读到了这一点,并了解到Android不支持开放文档格式.所以选项似乎不太可能.但是,如果你有任何解决方法或关于将JOpenDocument库添加到项目并显示富文本的详细解释,那么请分享该解决方案,因为我已经搜索了很多但却找不到.

还有另一个名为OliveDocLibrary的库,用于在android上显示丰富的word文件.这是我下载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){}
}
}
Run Code Online (Sandbox Code Playgroud)

所以我在eclipse中将这个库(Apache POI)添加到了我的Android项目中,并尝试了这个示例代码并进行了一些更改.并尝试在一个显示它TextView.这里的问题是它没有像OliveDocLibrary那样显示图像.因此,如果有人要建议Apache POI,那么我会请求一个实体指针或代码来读取docx文件及其所有内容(包括图像)并在自定义视图中显示它们.

Apache POI是一件好事,但遗憾的是我没有找到任何实现这些库的好示例/示例.如果你知道一个很好的例子来源(仅限MS字),请在评论中分享.

更新2:

OliveDocLibrary包中,提供的代码工作正常.虽然在视图上有Olive的水印.目前正在努力执行Swipe该代码.但问题仍然是它的试用版.

更新3:

我认为OliveDocLibrary是最有效的方法.虽然它有一个试用版的缺点,但我认为没有其他图书馆比这个图书馆做得更好,以满足我的特定要求.详细答案已在下面发布.随着赏金时间即将结束.我会请求可能有替代和更好解决方案的人尽快发布.现在我要使用OliveDocLibrary并接受我自己的答案.

D'y*_*'er 7

大家好,经过深思熟虑,看看很多选项和解决方法,我认为OliveDocLibrary是最好的方法.这里的链接将引导您访问Android的三个库的下载页面,这些库用于DOC,XLS和PPT.所有这些都非常好.您将下载的包文件夹中将包含三个文件夹.哪个是:

  1. API
  2. lib_trial
  3. 演示

演示文件夹中,您将找到Word的示例项目.您可以直接将此项目导入Eclipse中的工作区并自行测试代码.为方便人们,我在这里发布该代码.我删除了一些我认为没有必要的代码部分(这里是我的问题的答案).所以代码有两个文件,主要活动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();
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

在这里,我放置了一个名为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) {

    }

}
Run Code Online (Sandbox Code Playgroud)

lib_trial文件夹中,如果要单独使用它,可以找到可以添加到libs文件夹的库.

API文件夹中,您将以pdf文件的形式找到库及其方法的详细说明,这非常容易理解.所以人们可以直接使用这个库,并使用提供给他们特定要求的方法.

所以这就是我现在要解决的问题.欢迎任何更好的解决方案.赏金时间即将结束,所以请尽快提供您可能拥有的任何其他解决方案.谢谢.