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

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

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

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

在许多其他线程上,人们也推荐了 Jopendocument。我也读过这方面的内容,并了解到 Android 不支持开放文档格式。所以这个选项似乎不太可能。但是,如果您对将 JOpenDocument 库添加到项目并显示富文本有任何解决方法或详细说明,请分享该解决方案,因为我已经搜索了很多但找不到任何解决方案。

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

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

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

更新 2

OliveDocLibrary包中,提供的代码可以正常工作。视图上有橄榄色的水印。目前正在执行Swipe该代码。但问题仍然是它的试用版。

更新 3:

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

4

2 回答 2

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

}

在这里,我放置了一个名为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, OliveDocLibraryApache POI但没有运气。

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

在研究过程中,我发现了另外一个名为Tika的库,它也用于提取数据及其支持列出的文档,甚至还有Libra Office,您可以在其中读写和管理文档。

最后建议:

您可以通过转换来实现,doc to html正如这里html to pdf提到的。

转换doc to html参考堆栈溢出答案

于 2013-04-11T05:58:40.760 回答