Подтвердить что ты не робот

Отображение файла MS Word в представлении (например, TextView) на Android

Я хочу показать файл .docx в View на Android. Файл имеет математические символы, а также изображения между текстом. Я хочу показать много таких файлов и перевернуть их с помощью жестов 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 в проект и отображения богатого текста, пожалуйста, поделитесь этим решением, потому что я искал его много, но не смог найти.

Существует также другая библиотека, называемая OliveDocLibrary, чтобы отображать богатые текстовые файлы на Android. вот ссылка откуда я загрузил lib. Демонстрация, включенная в этот пакет загрузки, работает просто отлично. Но lib - это пробная версия. Поэтому в настоящее время я пытаюсь работать с этой библиотекой и посмотреть, куда она идет. Но я все еще ищу лучшие варианты.

Любая помощь в этом отношении приветствуется. Любые указатели, кроме упомянутых выше, приветствуются.

Update:

У меня появилось предложение, в котором говорилось об использовании 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) в свой проект Android в eclipse и попробовал этот образец кода с некоторыми изменениями. И попробовал показать его на TextView. Проблема здесь заключается в том, что она не отображает изображения, такие как OliveDocLibrary. Поэтому, если кто-то собирается предложить Apache POI, я запрашиваю для твердого указателя или кода, который читает файл docx и все его содержимое (включая изображения) и отображает их в пользовательском представлении.

Apache POI - отличная вещь, но, к сожалению, я не нашел хороших примеров/примеров, реализующих эти библиотеки. Если вы знаете хороший источник примеров (только w.r.t MS word), то, пожалуйста, поделитесь ими в комментариях.

Обновление 2:

В пакете OliveDocLibrary предоставленный код отлично работает. На снимке есть знак воды Олив. В настоящее время я работаю над выполнением swipe этого кода. Но проблема остается в том, что ее пробная версия.

Обновление 3:

Я думаю, что OliveDocLibrary - самый эффективный способ сделать это. Хотя у него есть недостаток, чтобы быть пробной версией, я думаю, что никакая другая библиотека не будет лучше работать, чем эта библиотека, чтобы полностью заполнить мои конкретные требования. Подробный ответ был опубликован ниже. По мере того, как время щедрости скоро закончится. Я бы попросил людей, у которых может быть альтернативное и лучшее решение, опубликовать его как можно скорее. Пока я собираюсь с OliveDocLibrary и принимаю свой собственный ответ.

4b9b3361

Ответ 1

Привет, ребята. После долгих размышлений и рассмотрения многих вариантов и обходных решений я думаю, что OliveDocLibrary - лучший способ сделать это. Вот ссылка которая даст вам прямую ссылку на страницу загрузки трех библиотек для Android, которые предназначены для DOC, XLS и PPT. Все это отлично работает. Папка пакета, которую вы загрузите, будет иметь три папки внутри. которые:

  • API
  • lib_trial
  • Demo

В папке demo вы найдете образец проекта для Word. Вы можете напрямую импортировать этот проект в свое рабочее пространство в Eclipse и сами проверить код. Для удобства людей я размещаю этот код здесь. Я удалил часть кода, который, по моему мнению, не был необходим (w.r.t ответ на мой вопрос здесь). Таким образом, код имеет два файла. Основное действие - 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();
        }
    }

}

Здесь я разместил файл doc с именем 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 файла, который очень легко понять. поэтому люди могут просто использовать эту библиотеку напрямую и использовать методы, предусмотренные их конкретным требованием.

Итак, решение на данный момент продолжается. Любые лучшие решения приветствуются. Время награды скоро закончится, поэтому, пожалуйста, предоставьте любое другое решение, которое у вас может быть как можно скорее. Спасибо.

Ответ 2

Как вы упомянули в своем вопросе, что вы уже пробовали немного библиотеки типа Jopendocument, OliveDocLibrary и Apache POI, но не повезло.

Теперь я хочу изменить этот код, чтобы отображать файлы MS Word (.docx), которые содержат текст, изображения и математические символы между ними.

Во время исследования я встретил еще одну библиотеку с именем Tika, которая также использовалась для извлечения данных и ее поддержка перечисленных документов и даже Libra Office, где вы можете читать документы для записи и управления.

Последнее предложение:

Вы можете добиться конвертированием, doc to html и html to pdf, как упоминается здесь.

Для преобразования doc to html обратитесь ответ на переполнение стека