日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

c 的word转为html5,word与html互转(1) -- word转html

發(fā)布時(shí)間:2023/12/10 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c 的word转为html5,word与html互转(1) -- word转html 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

使用忠告

使用該方式進(jìn)行xhtml到word的轉(zhuǎn)換, 簡(jiǎn)單轉(zhuǎn)換是可以, 但是可能并沒(méi)有想象中那么滿意, 轉(zhuǎn)換出來(lái)的word格式并不完美, 比如目錄和標(biāo)題都會(huì)丟失, 標(biāo)題顯示看起來(lái)一樣, 但是是用正文加粗和加大字號(hào)來(lái)顯示的. 畢竟word是一種文檔格式, 而html是一種標(biāo)記性語(yǔ)言, 要想實(shí)現(xiàn)完美兼容和轉(zhuǎn)換很難

加上word與html互轉(zhuǎn)(2) -- html轉(zhuǎn)word, 雖然word與html互轉(zhuǎn)都有實(shí)現(xiàn)手段, 但是考慮到轉(zhuǎn)換的格式復(fù)雜度和后期的維護(hù)成本, 我們最后放棄去實(shí)現(xiàn)這個(gè)成本高但是對(duì)項(xiàng)目影響不大的功能

其中word轉(zhuǎn)html功能實(shí)現(xiàn)中, 轉(zhuǎn)出的html的格式并沒(méi)有想象中的好, 某些樣式是通過(guò)class樣式來(lái)顯示的, 并不全是行內(nèi)樣式, 并且html所有文本標(biāo)簽都是使用的p標(biāo)簽, 包括標(biāo)題.

實(shí)現(xiàn)

實(shí)現(xiàn)方式

我在網(wǎng)上搜集了很多實(shí)現(xiàn)方式, 各式各樣的, 最后我決定使用poi+xdocreport來(lái)實(shí)現(xiàn)

poi都熟悉, 這邊我不作介紹

xdocreport是github上的一個(gè)開(kāi)源項(xiàng)目, 他的具體介紹可以去他的項(xiàng)目地址查看--項(xiàng)目地址, 選擇這個(gè)開(kāi)源項(xiàng)目主要有以下幾個(gè)原因:

1. 他是開(kāi)源的(免費(fèi))

2項(xiàng)目本身模塊化, 我們可以只引用需要的功能(輕量化)

3.轉(zhuǎn)換是基于poi的轉(zhuǎn)換進(jìn)行補(bǔ)充擴(kuò)展的,感覺(jué)比poi原生的更好一些(emm...沒(méi)驗(yàn)證)

4.使用簡(jiǎn)單便捷

這里只使用了xdocreport的轉(zhuǎn)換器功能, 可以點(diǎn)這里直接查看對(duì)應(yīng)的wiki

引入相關(guān)程序包

org.apache.poi

poi

3.14

org.apache.poi

poi-scratchpad

3.14

org.apache.poi

poi-ooxml

3.14

fr.opensagres.xdocreport

fr.opensagres.poi.xwpf.converter.xhtml

2.0.1

org.apache.poi

poi-ooxml-schemas

3.14

org.apache.poi

ooxml-schemas

1.3

docx轉(zhuǎn)html

public static void main(String[] args) {

String fileInName = "test.docx";

XWPFDocument document = null;

try {

document = new XWPFDocument(new FileInputStream(fileInName));

XHTMLOptions options = XHTMLOptions.create();

options.setImageManager( new ImageManager(new File(""), "") {

@Override

public void extract(String imagePath, byte[] imageData) throws IOException {

System.out.println("這里上傳圖片到圖片服務(wù)器");

}

@Override

public String resolve(String uri) {

return "https://csdnimg.cn/pubfooter/images/csdn_cs_qr.png";

}

});

StringWriter stringWriter = new StringWriter();

// XHTMLConverter.getInstance().convert( document, out, options );

XHTMLConverter xhtmlConverter = (XHTMLConverter) XHTMLConverter.getInstance();

xhtmlConverter.convert(document, stringWriter, options);

} catch (IOException e) {

e.printStackTrace();

}

}

上面我自己寫的示例跟官方的示例有所區(qū)別, 下面我貼出官方示例然后在進(jìn)行解釋

/**

* 官方示例

*/

import org.apache.poi.xwpf.converter.xhtml.XHTMLOptions;

import org.apache.poi.xwpf.converter.xhtml.XHTMLConverter;

...

// 1) Load DOCX into XWPFDocument

InputStream in= new FileInputStream(new File("HelloWord.docx"));

XWPFDocument document = new XWPFDocument(in);

// 2) Prepare XHTML options (here we set the `ImageManager` to store image and resolve iamge src)

XHTMLOptions options = XHTMLOptions.create().setImageManager( new ImageManager( new File(root), "images" ) );

// 3) Convert XWPFDocument to XHTML

OutputStream out = new FileOutputStream(new File("HelloWord.htm"));

XHTMLConverter.getInstance().convert(document, out, options);

跟官方不一樣的地方的解釋

1.在給XHTMLOption設(shè)置圖片管理器對(duì)象的時(shí)候

官方是直接設(shè)置了一個(gè)圖片路徑, 生成的html里面的圖片引用指向的是設(shè) 置的路徑, 而我這邊有專門的文件服務(wù)器, 所以需要將里面的圖片上傳到圖片服務(wù)器中, 然后將html中圖片的引用指向文件服務(wù)器, 所以我重寫了圖片管理器的代碼, 將其中保存圖片和給html中圖片引用換成了自己的實(shí)現(xiàn)

XHTMLOptions options = XHTMLOptions.create();

options.setImageManager( new ImageManager(new File(""), "") {

@Override

public void extract(String imagePath, byte[] imageData) throws IOException {

System.out.println("這里上傳圖片到圖片服務(wù)器");

}

@Override

public String resolve(String uri) {

return "https://csdnimg.cn/pubfooter/images/csdn_cs_qr.png";

}

});

2.轉(zhuǎn)換并保存html的時(shí)候

官方示例是將html保存成文件到一個(gè)路徑下面, 而我的需求并不是保存文件, 而是要將生成的html分段下沉到DB, 所以可以在這里

StringWriter stringWriter = new StringWriter();

XHTMLConverter xhtmlConverter = (XHTMLConverter) XHTMLConverter.getInstance();

xhtmlConverter.convert(document, stringWriter, options);

將官方示例的文件輸出流換成自己的StringWriter就可以了(你也可以換成自己需要的流), 我這樣替換就可以拿到html的字符串, 接著就可以使用jsoup進(jìn)行html的解析并分段存儲(chǔ)了

doc轉(zhuǎn)html

public String doc2html() throws Exception {

HWPFDocument hwpfDocument = new HWPFDocument(new FileInputStream("test.doc"));

Document newDocument = XMLHelper.getDocumentBuilderFactory().newDocumentBuilder().newDocument();

WordToHtmlConverter wordToHtmlConverter = new WordToHtmlConverter(newDocument);

wordToHtmlConverter.setPicturesManager((content, pictureType, suggestedName, widthInches, heightInches) -> {

//content是圖片內(nèi)容, 這里將圖片保存到圖片服務(wù)器, 然后將保存的圖片路徑返回

//同樣, 你也可以將圖片保存到本地相對(duì)路徑, 然后將相對(duì)路徑返回, html也能正常顯示圖片

return "https://csdnimg.cn/pubfooter/images/csdn_cs_qr.png";

});

wordToHtmlConverter.processDocument(hwpfDocument);

Transformer transformer = TransformerFactory.newInstance()

.newTransformer();

//指定Transformer在輸出結(jié)果樹(shù)時(shí)是否可以添加額外的空格

transformer.setOutputProperty(OutputKeys.INDENT, "yes");

//指定輸出編碼

transformer.setOutputProperty(OutputKeys.ENCODING, "utf-8");

transformer.setOutputProperty(OutputKeys.METHOD, "html");

//這里是希望將轉(zhuǎn)換后的流最終輸出到字符串進(jìn)行返回, 如果你希望直接輸出文件, 你可以創(chuàng)建一個(gè)文件流放進(jìn)下面的參數(shù)

StringWriter stringWriter = new StringWriter();

transformer.transform(new DOMSource(wordToHtmlConverter.getDocument()), new StreamResult(stringWriter));

return stringWriter.toString();

}

示例代碼比較簡(jiǎn)單, 但是已經(jīng)具備轉(zhuǎn)換的功能, 需要注意和可能變動(dòng)的點(diǎn)我在代碼注釋中已經(jīng)說(shuō)明, 可以根據(jù)需求來(lái)修改圖片的保存和最后輸出的結(jié)果

總結(jié)

以上是生活随笔為你收集整理的c 的word转为html5,word与html互转(1) -- word转html的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。