1. 程式人生 > >數學公式是如何實現的?

數學公式是如何實現的?

數學公式實現大方向

青優網

有個軟體可以做到轉換公式:word2tex和tex2word

後臺上傳檔案–>系統識別出公式,將其轉換為Latex程式碼–>前臺用Mathjax進行渲染。

梯子網

Aspose,它是美國開發商的商業包,具體詳情登入外網才能知道。google搜到了官網,看了下產品資訊,發現它近乎完美支援Java/.net生成word文件,涵括了字型大小、主標題副標題、表格、顏色等等等等。

分析了一下局勢,原來是和微軟的word不開源有關係的。雖然我們在word裡寫了一段話、傳了一張圖片、編輯了一個公式,但是它底層到底經過了哪些步驟,是以什麼形式儲存的,這些大家都不知道。所以雖然有工具可以將word公式轉成tex以及轉回去,但是有時候還是會生成亂碼,說明穩定性還是不容樂觀。具體問題我就不深入研究了。

猿題庫:

猿題庫主打學生端的線上刷題app,雖然它也有題庫系統,但是僅從手機app端來說很難看出來它是怎麼設計和維護的。不過我們可以從手機app端能瞭解到他們的題的構成。

將題目分享到微信朋友之後,再用微信電腦端開啟,我們就可以在pc端拿到手機app上猿題庫的試題連結了!

這樣一看就明顯了:猿題庫的公式都是用圖片進行儲存的。

解析word並切圖並不複雜,是可以實現的,具體就不贅述了

最理想的題庫管理方案是:支援在線上傳以及word上傳,支援線上編輯,支援下載,並且下載的word公式是可以進行編輯的。

然而現實卻不能完全實現,所以只能在設計自己的題庫時有所取捨。

Mathjax可以解析Latex、mathml等程式碼。

word2tex可以將word裡的公式轉換為tex程式碼。

Latex是基於tex的,理論上是相通的。

Aspose是商業包,近乎完美地支援Java/.NET線上編輯生成word文件。

題庫是線上K12教育的基礎,而題的實現則是題庫的基礎。在設計自家題庫之初要想到所有的可能性以及解決方案,有了方向做起來就不難了。

好吧,其實後面的打賞顯示是手敲上去的,簡書目前並沒有支援打賞顯示隱藏資訊。

既然大家都對如何實現比較好奇,那麼我簡單地說一下吧。

首先要看你的公司支不支援一個專門錄題團隊。有錢,有精力,這樣生成的題質量是最好的。

其次是不是有必要下載成word。目前網上有很多賣題的,題裡面帶有html標籤,很不規範,下載下來的題也不能看。

再次下載成word的公式有沒有必要可以編輯。也有賣word版的,他們的題的公式都是圖片。

還有網上買的題有一小部分的題需要人工稽核修改,後期有一定的工作量,不能保證買完全部能用。而且買的程式碼標籤格式的題,不能下載成word。

我家題庫大概就是通過上面幾點然後做的決策。具體細節涉及商業機密不便透露了。

三種方式:1.輸出公式圖片、2.輸出公式html、3.輸出Latex讓前端渲染

我們曾經敲出一塊伺服器資源專門做公式的後臺渲染,然後把渲染出來的公式html儲存到資料庫,客戶端請求時直接推送過去,連渲染都省了,比圖片要輕便。 唯一的壞處是公式太多時,文字因為包含了太多公式標籤導致體積過大。

數學公式實現之——解析world

android 解析docx檔案

總結

使用poi解析docx檔案
流程:
呼叫介面將docx轉化為html,然後app中通過webview載入該html即可顯示

在自己的應用中實現word文件查閱功能,整合app閱讀word功能也可以通過幾種方式實現
例如:購買專門的sdk包,像Aspose等(money啊)或者伺服器端處理成圖片或者html,然後android端去請求訪問等方式。對於大部分個人開發者而言,這兩種方式就顯得比較重量級了。
下面介紹兩種專門解析docx檔案的方式:docx4j 以及poi

Docx4j

Docx4j
github地址:https://github.com/plutext/AndroidDocxToHtml
這個是官網demo,基本可以直接使用,解析出來的格式比較全,樣式也比較接近原文件,就是解析速度令人不敢恭維,手機上測試的話,一般一份兒docx文件都需要30s以上甚至更多,有時候測試文件明明就只有幾十k大小而已,對於比較大,比較複雜的文件,時間就更是讓人崩潰。解析速度不是令人滿意。

解析測試中遇到的bug
1.表格丟失,內容丟失:內嵌表格(表格中還有表格的這種)的內容和樣式會有部分丟失現象
2.表格(又是我?)樣式:假如文件中的表格在word文件中排版時超出了該文件的邊界線,你會發現超出邊界的內容又不見了
3.目錄亂碼:如果文件中有目錄,目錄會被加上一些超連結,需要手工處理去掉
4.圖片無法解析:有一些格式的圖片無法解析,比如EMF,WMF這種型別的
5.批註無法顯示:目前沒有找到批註顯示的地方,暫且算丟失吧,後面在試試
6.。。。其它暫時還沒被發現的問題

POI

POI
poi是apache的一個開源專案,不多說,直接上官網去下載就可以
官網地址:http://poi.apache.org/
如果你是android studio使用者:那就很簡單了
只需要引入依賴(版本號不一定哦,gradle會自己把相關依賴包下載到位):

compile 'fr.opensagres.xdocreport:org.apache.poi.xwpf.converter.xhtml:1.0.5'

那如果你是eclipse使用者(夥計,趕緊用studio吧)
需要手工引入以下jar包,包括:

poi , poi-ooxml , ooxml-schema,org.apache.poi.xwpf.converter.xhtml,org.apache.poi.xwpf.converter.core
實現程式碼如下

 {    
    InputStream is = new FileInputStream(file);
    XWPFDocument docx = new 
          XWPFDocument(is);
    OutputStream os = new ByteArrayOutputStream();
    String imgDesPath = "/sdcard/img";
    File imgFile = new File("/sdcard/img");
    this.baseUrl = this.getDir("image", Context.MODE_PRIVATE).toURL().toString();
    if (!imgFile.exists()) {
        file.mkdirs();
    }

poi解析的問題
速度比docx4j要稍快一點,會有文件內容解析不全樣式丟失的情況

流程:
呼叫介面將docx轉化為html,然後app中通過webview載入該html即可顯示
轉化程式碼如下(我就想問下,這程式碼格式到底該怎麼調啊~好煩躁):

try { 
    InputStream is = new FileInputStream(file);
    XWPFDocument docx = new 
          XWPFDocument(is);
    OutputStream os = new ByteArrayOutputStream();
    String imgDesPath = "/sdcard/img";
    File imgFile = new File("/sdcard/img");
    this.baseUrl = this.getDir("image", Context.MODE_PRIVATE).toURL().toString();
    if (!imgFile.exists()) {
        file.mkdirs();
    }
    XHTMLOptions options = XHTMLOptions.create().URIResolver(new BasicURIResolver(imgDesPath));
    options.setExtractor(new FileImageExtractor(imgFile));
    options.setIgnoreStylesIfUnused(false);
    options.setFragment(true);
    XHTMLConverter.getInstance().convert(docx, os, options);
    **os.write("/sdcard/xxx/html檔案")**
     } catch (Exception e) {
        Log.d(TAG, "catch " + e.getMessage());
    }

webview 裡面直接load 上面生成的html檔案就可以了

poi將word2007轉化成html

1:匯入jar包依賴

 <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-scratchpad</artifactId>
            <version>3.10.1</version>
        </dependency>
       <dependency>
            <groupId>org.apache.xmlbeans</groupId>
            <artifactId>xmlbeans</artifactId>
            <version>2.6.0</version>
       </dependency>
       <dependency>
            <groupId>fr.opensagres.xdocreport</groupId>
            <artifactId>org.apache.poi.xwpf.converter.core</artifactId>
            <version>1.0.6</version>
       </dependency>
       <dependency>
            <groupId>fr.opensagres.xdocreport</groupId>
            <artifactId>org.apache.poi.xwpf.converter.xhtml</artifactId>
            <version>1.0.6</version>
        </dependency>

2:建立工具類,便於後面直接呼叫即可

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.poi.xwpf.converter.core.FileImageExtractor;
import org.apache.poi.xwpf.converter.core.FileURIResolver;
import org.apache.poi.xwpf.converter.xhtml.XHTMLConverter;
import org.apache.poi.xwpf.converter.xhtml.XHTMLOptions;
import org.apache.poi.xwpf.usermodel.XWPFDocument;

public class WordtoHtml07 {

    public static void word07ToHtml(String fileName ,String imageFile , String htmFile) throws IOException{
        File f = new File(fileName);
        if (!f.exists()) {
            System.out.println("sorry file does not exists");
        }else{
            if (f.getName().endsWith(".docx")|| f.getName().endsWith(".DOCX") || f.getName().endsWith(".doc")) {
                //1:載入文件到XWPFDocument
                InputStream in = new FileInputStream(f);
                XWPFDocument document = new XWPFDocument(in);
                //2:載入圖片到指定資料夾
                File imgFile = new File(imageFile);
                XHTMLOptions options = XHTMLOptions.create().URIResolver(new FileURIResolver(imgFile));
                options.setExtractor(new FileImageExtractor(imgFile));

                //3:轉換XWPFDocument to XHTML 
                  OutputStream out = new FileOutputStream(new File(htmFile));  
                    XHTMLConverter.getInstance().convert(document, out, options);  
            }else{
                  System.out.println("Enter only MS Office 2007+ files");              
            }            
        }            
    }      
    public static void main(String args[]) {  
        try {             
            word07ToHtml("F:/51/1.doc","F:/51/media","F:/51/1.htm");
        } catch (IOException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
    }      
}

解析doc並顯示

package com.lattice.sodocument.attachment;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.List;

import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.usermodel.CharacterRun;
import org.apache.poi.hwpf.usermodel.Paragraph;
import org.apache.poi.hwpf.usermodel.Picture;
import org.apache.poi.hwpf.usermodel.Range;
import org.apache.poi.hwpf.usermodel.Table;
import org.apache.poi.hwpf.usermodel.TableCell;
import org.apache.poi.hwpf.usermodel.TableIterator;
import org.apache.poi.hwpf.usermodel.TableRow;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;

import android.annotation.SuppressLint;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.KeyEvent;
import android.view.View;
import android.webkit.SslErrorHandler;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.ScrollView;
import android.widget.TextView;

import com.lattice.sodocument.main.BaseActivity;
import com.lattice.sodocument.main.R;
import com.lattice.sodocument.util.CompressionOfImage;
import com.lattice.sodocument.util.ConversionUtil;
import com.lattice.sodocument.util.FileUtil;
import com.lattice.sodocument.util.FunctionUtil;
import com.lattice.sodocument.util.LogUtil;

//doc和docx有問題
@SuppressLint({ "SetJavaScriptEnabled", "HandlerLeak" })
public class AttachmentView extends BaseActivity {
    ScrollView scrollView;
    TextView textView;
    ImageView imageView;
    Bitmap bitmap;
    Handler mHandler;
    ProgressBar mBar;
    Runnable runnable = new Runnable() {

        public void run() {
            // 最終版
            bitmap = ConversionUtil.string2Bitmap(attachmentString);
            // 測試版
            // bitmap = BitmapFactory.decodeResource(
            // AttachmentView.this.getResources(), R.drawable.welcome);
            bitmap = CompressionOfImage.comp(bitmap);
            Message message = new Message();
            mHandler.sendMessage(message);
        }
    };
    StringBuffer text = new StringBuffer();
    private Range range = null;
    private HWPFDocument hwpf = null;

    private String htmlPath;
    private String picturePath;

    @SuppressWarnings("rawtypes")
    private List pictures;
    private TableIterator tableIterator;
    private int presentPicture = 0;
    private int screenWidth;
    private FileOutputStream output;
    private File myFile;
    String xml;
    protected WebView mWebView;
    public static final int ERROR = 0;
    public static final int DOC = 1;
    public static final int DOCX = 2;
    public static final int IMAGE = 3;
    public static final int TXT = 4;
    private int attachmentType = 0;
    private String attachmentString = "0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAEAAAAgAAAAEAAAD+////AAAAAAAAAAD////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9////BQAAAP7///8EAAAABgAAAP7///8HAAAACAAAAAkAAAAKAAAACwAAAAwAAAANAAAADgAAAA8AAAAQAAAAEQAAABIAAAD+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1IAbwBvAHQAIABFAG4AdAByAHkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAUA//////////8BAAAABgkCAAAAAADAAAAAAAAARgAAAAAAAAAAAAAAAODafPelbc8BAwAAAEAcAAAAAAAABQBTAHUAbQBtAGEAcgB5AEkAbgBmAG8AcgBtAGEAdABpAG8AbgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAgEEAAAAAgAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AEAAAAAAAAFAEQAbwBjAHUAbQBlAG4AdABTAHUAbQBtAGEAcgB5AEkAbgBmAG8AcgBtAGEAdABpAG8AbgAAAAAAAAAAAAAAOAACAf///////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAADwAQAAAAAAAFcAbwByAGQARABvAGMAdQBtAGUAbgB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaAAIA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAADMOAAAAAAAAAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAP7///8JAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAA/v///xEAAAASAAAAEwAAABQAAAAVAAAAFgAAABcAAAAYAAAAGQAAABoAAAAbAAAAHAAAAB0AAAAeAAAAHwAAACAAAAAhAAAAIgAAACMAAAAkAAAAJQAAACYAAAAnAAAAKAAAACkAAAAqAAAAKwAAACwAAAAtAAAALgAAAC8AAAAwAAAAMQAAADIAAAAzAAAANAAAADUAAAA2AAAANwAAADgAAAA5AAAAOgAAADsAAAA8AAAAPQAAAD4AAAA/AAAAQAAAAEEAAABCAAAAQwAAAEQAAABFAAAARgAAAEcAAABIAAAA/v///0oAAABLAAAATAAAAE0AAABOAAAATwAAAFAAAABRAAAAUgAAAFMAAABUAAAAVQAAAFYAAABXAAAAWAAAAFkAAABaAAAAWwAAAFwAAABdAAAAXgAAAF8AAABgAAAAYQAAAGIAAABjAAAAZAAAAGUAAABmAAAAZwAAAGgAAABpAAAAagAAAGsAAABsAAAAbQAAAG4AAABvAAAAcAAAAP7////////////////////////////////////////////////////////////////////////////////////+/wAABgMCAAAAAAAAAAAAAAAAAAAAAAABAAAA4IWf8vlPaBCrkQgAKyez2TAAAADMAQAAEQAAAAEAAACgAAAAAAAAgKgAAAACAAAAsAAAAAMAAADgAAAABAAAAOwAAAAFAAAABAEAAAYAAAAQAQAABwAAABwBAAAIAAAAPAEAAAkAAABUAQAADAAAAGABAAANAAAAbAEAAA4AAAB4AQAADwAAAIABAAAQAAAAiAEAABIAAACQAQAAEwAAAMQBAAAAAAAAAAAAAAAAAAAAAAAAAgAAALAEAAATAAAABAgAAB8AAAATAAAA2Y8vZgBOKk5LbdWLRJb2TgIw2Y8vZgBOKk5LbdWLRJb2TgIwAAAAAB8AAAABAAAAAAAAAB8AAAAHAAAAZgBlAGkAZgBlAGkAAAAAAB8AAAABAAAAAAAAAB8AAAABAAAAAAAAAB8AAAALAAAATgBvAHIAbQBhAGwALgB3AHAAdAAAAAAAHwAAAAcAAABmAGUAaQBmAGUAaQAAAAAAHwAAAAIAAAAyAAAAQAAAAABOozw2Z8kBQAAAAADyHfelbc8BAwAAAAEAAAADAAAAAAAAAAMAAAAAAAAAHwAAABYAAABNAGkAYwByAG8AcwBvAGYAdAAgAE8AZgBmAGkAYwBlACAAVwBvAHIAZAAAAAMAAAAAAAAAAAAAAP7/AAAGAwIAAAAAAAAAAAAAAAAAAAAAAAIAAAAC1c3VnC4bEJOXCAArLPmuRAAAAAXVzdWcLhsQk5cIACss+a5cAQAAGAEAABAAAAABAAAAiAAAAAAAAICQAAAADwAAAJgAAAACAAAApAAAAA4AAACwAAAABgAAALwAAAAFAAAAxAAAABEAAADMAAAAAwAAANQAAAAEAAAA4AAAAAcAAADoAAAACAAAAPAAAAAJAAAA+AAAAAoAAAAAAQAACwAAAAgBAAAQAAAAEAEAAAIAAACwBAAAEwAAAAQIAAAfAAAAAQAAAAAAAAAfAAAAAQAAAAAAAAAfAAAAAQAAAAAAAAADAAAAAQAAAAMAAAABAAAAAwAAAAAAAAAfAAAAAQAAAAAAAAADAAAAAAAAAAMAAAAAAAAAAwAAAAAAAAADAAAAAAAAAAMAAAAAAAAACwAAAAAAAAALAAAAAAAAAJQAAAAEAAAAAAAAACgAAAABAAAAXAAAAAAAAIBkAAAAAgAAAGwAAAABAAAAAgAAABMAAABLAFMATwBQAHIAbwBkAHUAYwB0AEIAdQBpAGwAZABWAGUAcgAAAAAAAgAAALAEAAATAAAABAgAAB8AAAAQAAAAMgAwADUAMgAtADkALgAxAC4AMAAuADQANAAwADUAAAAAAAAAAAAAAAAAAAAAAAAAMABUAGEAYgBsAGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAgEFAAAAAwAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJAAAA3AkAAAAAAABEAGEAdABhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgACAP///////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADspcEAiYgJBAAAFFC/AAAAAAAAEAAAAAAACAAAJggAAA4AS1NLU8MACAAAAAAAAAAAAAAAAAAAAAAAAAAECBYAMw4AAAAAAAAAAAAAEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//w8AAAAAAAAAAAD//w8AAAAAAAAAAAD//w8AAAAAAAAAAAAAAAAAAAAAAKQAAAAAANoDAAAAAAAA2gMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7wgAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2gMAAAwAAADmAwAADAAAAAAAAAAAAAAABwQAAPYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2gkAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAywgAACQAAABjBgAAaAIAAP0FAABmAAAA8gMAABUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMJAADXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIADAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANmPL2YATipOS23Vi0SW9k4CMNmPL2YATipOS23Vi0SW9k4CMA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAACQIAAAmCAAA/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADbygBAAIACAAAJggAAP0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAATEAH7CCLiCwxkEhsAgHI5CgBSKwCAckkKAFJbAAABewUwMYsOADMlACADGQOAH/0QIAAAAAAAAAAAAAAAAAAACGAhEAEgABAJwADwAEAAAAAQAAAAAABAAAAAAAmAAAAJ4AAACeAAAAngAAAJ4AAACeAAAAngAAAJ4AAACeAAAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAAdgIAAHYCAAB2AgAAdgIAAHYCAAB2AgAAdgIAAHYCAAB2AgAANgYAADYGAAA2BgAABAAAAAQAAAA2BgAAPgIAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAAKgAAAA2BgAANgYAAAQAAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAALgAAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAABoAQAASAEAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAABGAABA8f8CAEYAAAAAAAAAAAAAAAIAY2uHZQAACwAAAGEkAwMkAzEkAAAcAENKFQBQSgEAS0gCAG1ICQRzSAkEbkgECHRIBAgAAAAAAAAAAAAAAAAAAAAAAAAkAEFA8v+hACQAAAgAAAAAAAAAAAYA2J6ki7VrPYRXW1NPAAAAAAAAAAAAAAAAjgAfQAEA8gCOAAAIAAAAAAAAAAACAHWYCXcAAGMADwASZPAAAQBhJAMDJANHJABAJgkkZAAAAAFOxggAAAD/AAABACVkAAAABE/GCAAAAP8AAAQA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";

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_attachment);
        initViews();
        initEvents();
        // Intent intent = getIntent();
        // attachmentType = intent.getIntExtra("attachmentType", 0);
        // attachmentString = intent.getStringExtra("attachmentString");
        switch (attachmentType) {
        case ERROR:
//            toastShow("附件開啟錯誤,請重試");
//            finish();
//            overridePendingTransition(R.anim.activity_in_from_left,
//                    R.anim.activity_out_to_right);
            dialogChoose(new String[]{"1","2","3"});
            break;
        case DOC:
            // 可以用一個handle統一處理所有訊息,也可以分開
            final Handler handler2 = new Handler() {
                public void handleMessage(Message msg) {
                    if (msg.what == 1) {
                        mWebView.loadUrl(xml);
                        dialogDismiss();
                    }
                }
            };
            mWebView.setVisibility(View.VISIBLE);
            final byte[] buf = FunctionUtil.stringToByte(attachmentString);
            dialogShow("正在載入中");
            new Thread() {
                public void run() {
                    try {
                        // 測試長的doc文件顯示
                        test();
                        // getRange(buf);
                    } catch (Exception e) {
                        e.printStackTrace();
                        toastShow("附件開啟錯誤,請重試");
                        finish();
                        overridePendingTransition(R.anim.activity_in_from_left,
                                R.anim.activity_out_to_right);
                    }
                    makeFile();
                    readAndWrite();
                    xml = "file://" + htmlPath;
                    Message msg = new Message();
                    msg.what = 1;
                    handler2.sendMessage(msg);
                }
            }.start();

            break;
        case DOCX:
            break;

        case IMAGE:
            imageView.setVisibility(View.VISIBLE);
            mHandler = new Handler() {
                public void handleMessage(Message msg) {
                    imageView.setImageBitmap(bitmap);
                }
            };
            new Thread(runnable).start();
            break;
        case TXT:
            scrollView.setVisibility(View.VISIBLE);
            textView.setVisibility(View.VISIBLE);
            String fileName = android.os.Environment
                    .getExternalStorageDirectory() + "/DCIM/README.txt";
            try {
                FileInputStream fin = new FileInputStream(fileName);
                String string = ConversionUtil.stream2String(fin);
                textView.setText(string);
            } catch (Exception e) {
            }
            break;
        }
    }

    public void onClick(View arg0) {
    }

    protected void initViews() {
        scrollView = (ScrollView) findViewById(R.id.scrollView1);
        textView = (TextView) findViewById(R.id.textView1);
        imageView = (ImageView) findViewById(R.id.testpic);
        mWebView = (WebView) findViewById(R.id.webView1);
        mWebView.getSettings().setJavaScriptEnabled(true);
        // 將圖片調整到適合webview的大小
        mWebView.getSettings().setUseWideViewPort(false);
        // 支援縮放
        mWebView.getSettings().setSupportZoom(true);
        // 設定支援各種不同的裝置
        mWebView.getSettings()
                .setUserAgentString(
                        "Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X;en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334bSafari/531.21.10");

    }

    protected void initEvents() {
        mWebView.setWebChromeClient(new WebChromeClient() {
            public void onProgressChanged(WebView view, int newProgress) {
                super.onProgressChanged(view, newProgress);
            }

        });
        mWebView.setWebViewClient(new WebViewClient() {
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                mWebView.loadUrl(url);
                return true;
            }

            public void onReceivedSslError(WebView view,
                    SslErrorHandler handler, android.net.http.SslError error) {
                handler.proceed();
            }

        });
    }

    protected void onDestroy() {
        super.onDestroy();
        FileUtil.deleteDir(android.os.Environment.getExternalStorageDirectory()
                + "/tempDoc");
    }

    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
            mWebView.goBack();
            return true;
        } else {
            FileUtil.deleteDir(android.os.Environment
                    .getExternalStorageDirectory() + "/tempDoc");
            finish();
            overridePendingTransition(R.anim.activity_in_from_left,
                    R.anim.activity_out_to_right);

        }

        return true;
    }

    // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^//

    public void makeFile() {
        String sdStateString = android.os.Environment.getExternalStorageState();
        if (sdStateString.equals(android.os.Environment.MEDIA_MOUNTED)) {
            try {
                File sdFile = android.os.Environment
                        .getExternalStorageDirectory();
                String path = sdFile.getAbsolutePath() + File.separator
                        + "tempDoc";
                File dirFile = new File(path);
                if (!dirFile.exists()) {
                    dirFile.mkdir();
                }
                File myFile = new File(path + File.separator + "my.html");
                if (!myFile.exists()) {
                    myFile.createNewFile();
                }
                htmlPath = myFile.getAbsolutePath();
            } catch (Exception e) {

            }
        }
    }

    public void makePictureFile() {
        String sdString = android.os.Environment.getExternalStorageState();
        if (sdString.equals(android.os.Environment.MEDIA_MOUNTED)) {
            try {
                File picFile = android.os.Environment
                        .getExternalStorageDirectory();
                String picPath = picFile.getAbsolutePath() + File.separator
                        + "tempDoc";
                File picDirFile = new File(picPath);
                if (!picDirFile.exists()) {
                    picDirFile.mkdir();
                }
                File pictureFile = new File(picPath + File.separator
                        + presentPicture + ".jpg");
                if (!pictureFile.exists()) {
                    pictureFile.createNewFile();
                }
                picturePath = pictureFile.getAbsolutePath();
            } catch (Exception e) {
                System.out.println("PictureFile Catch Exception");
            }
        }
    }

    // 讀取word中的內容寫到sdcard上的.html檔案中
    public void readAndWrite() {
        try {
            myFile = new File(htmlPath);
            output = new FileOutputStream(myFile);
            String head = "<html><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" /> <body>";
            String tagBegin = "<p>";
            String tagEnd = "</p>";
            output.write(head.getBytes());
            int numParagraphs = range.numParagraphs();
            for (int i = 0; i < numParagraphs; i++) {
                Paragraph p = range.getParagraph(i);
                if (p.isInTable()) {
                    int temp = i;
                    if (tableIterator.hasNext()) {
                        String tableBegin = "<table style=\"border-collapse:collapse\" border=1 bordercolor=\"black\">";
                        String tableEnd = "</table>";
                        String rowBegin = "<tr>";
                        String rowEnd = "</tr>";
                        String colBegin = "<td>";
                        String colEnd = "</td>";
                        Table table = tableIterator.next();
                        output.write(tableBegin.getBytes());
                        int rows = table.numRows();

                        for (int r = 0; r < rows; r++) {
                            output.write(rowBegin.getBytes());
                            TableRow row = table.getRow(r);
                            int cols = row.numCells();
                            int rowNumParagraphs = row.numParagraphs();
                            int colsNumParagraphs = 0;
                            for (int c = 0; c < cols; c++) {
                                output.write(colBegin.getBytes());
                                TableCell cell = row.getCell(c);
                                int max = temp + cell.numParagraphs();
                                colsNumParagraphs = colsNumParagraphs
                                        + cell.numParagraphs();
                                for (int cp = temp; cp < max; cp++) {
                                    Paragraph p1 = range.getParagraph(cp);
                                    output.write(tagBegin.getBytes());
                                    writeParagraphContent(p1);
                                    output.write(tagEnd.getBytes());
                                    temp++;
                                }
                                output.write(colEnd.getBytes());
                            }
                            int max1 = temp + rowNumParagraphs;
                            for (int m = temp + colsNumParagraphs; m < max1; m++) {
                                range.getParagraph(m);
                                temp++;
                            }
                            output.write(rowEnd.getBytes());
                        }
                        output.write(tableEnd.getBytes());
                    }
                    i = temp;
                } else {
                    output.write(tagBegin.getBytes());
                    writeParagraphContent(p);
                    output.write(tagEnd.getBytes());
                }
            }
            String end = "</body></html>";
            output.write(end.getBytes());
            output.close();
        } catch (Exception e) {
            System.out.println("readAndWrite Exception");
        }
    }

    // 以段落的形式來往html檔案中寫內容
    public void writeParagraphContent(Paragraph paragraph) {
        Paragraph p = paragraph;
        int pnumCharacterRuns = p.numCharacterRuns();
        for (int j = 0; j < pnumCharacterRuns; j++) {
            CharacterRun run = p.getCharacterRun(j);
            if (run.getPicOffset() == 0 || run.getPicOffset() >= 1000) {
                if (presentPicture < pictures.size()) {
                    writePicture();
                }
            } else {
                try {
                    // StringBuffer text = new StringBuffer();
                    String text = run.text();
                    // boolean b = run.text().startsWith(" ");
                    // if (b) {
                    // text.append("    ");
                    // }
                    // text.append(run.text());
                    //
                    //
                    // output.write(text.toString().getBytes());
                    if (text.length() >= 2 && pnumCharacterRuns < 2) {
                        output.write(text.getBytes());
                    } else {
                        int size = run.getFontSize();
                        int color = run.getColor();
                        String fontSizeBegin = "<font size=\""
                                + decideSize(size) + "\">";
                        String fontColorBegin = "<font color=\""
                                + decideColor(color) + "\">";
                        String fontEnd = "</font>";
                        String boldBegin = "<b>";
                        String boldEnd = "</b>";
                        String islaBegin = "<i>";
                        String islaEnd = "</i>";
                        output.write(fontSizeBegin.getBytes());
                        output.write(fontColorBegin.getBytes());
                        if (run.isBold()) {
                            output.write(boldBegin.getBytes());
                        }
                        if (run.isItalic()) {
                            output.write(islaBegin.getBytes());
                        }
                        output.write(text.getBytes());

                        if (run.isBold()) {
                            output.write(boldEnd.getBytes());
                        }
                        if (run.isItalic()) {
                            output.write(islaEnd.getBytes());
                        }
                        output.write(fontEnd.getBytes());
                        output.write(fontEnd.getBytes());
                    }

                } catch (Exception e) {
                    System.out.println("Write File Exception");
                }
            }
        }
    }

    // 將word中的圖片寫入到.jpg檔案中
    public void writePicture() {
        Picture picture = (Picture) pictures.get(presentPicture);
        byte[] pictureBytes = picture.getContent();
        Bitmap bitmap = BitmapFactory.decodeByteArray(pictureBytes, 0,
                pictureBytes.length);
        makePictureFile();
        presentPicture++;
        File myPicture = new File(picturePath);
        try {
            FileOutputStream outputPicture = new FileOutputStream(myPicture);
            outputPicture.write(pictureBytes);
            outputPicture.close();
        } catch (Exception e) {
            System.out.println("outputPicture Exception");
        }

        String imageString = "<img src=\"" + picturePath + "\"";
        if (bitmap.getWidth() > screenWidth) {
            imageString = imageString + " " + "width=\"" + screenWidth + "\"";
        }
        imageString = imageString + ">";
        try {
            output.write(imageString.getBytes());
        } catch (Exception e) {
            System.out.println("output Exception");
        }
    }

    // 處理word和html字型的轉換
    public int decideSize(int size) {

        if (size >= 1 && size <= 8) {
            return 1;
        }
        if (size >= 9 && size <= 11) {
            return 2;
        }
        if (size >= 12 && size <= 14) {
            return 3;
        }
        if (size >= 15 && size <= 19) {
            return 4;
        }
        if (size >= 20 && size <= 29) {
            return 5;
        }
        if (size >= 30 && size <= 39) {
            return 6;
        }
        if (size >= 40) {
            return 7;
        }
        return 3;

    }

    // 處理word和html顏色的轉換
    private String decideColor(int a) {
        int color = a;
        switch (color) {
        case 1:
            return "#000000";
        case 2:
            return "#0000FF";
        case 3:
        case 4:
            return "#00FF00";
        case 5:
        case