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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Word文档转html并提取标题

發布時間:2025/5/22 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Word文档转html并提取标题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近做了一個功能,需要將word文檔轉化成html的格式,并提取出標題生成導航??紤]到功能的復雜程度,將需要降低為對“標題1”這種格式進行提取。

docx為后綴的文檔(word2007)支持XML的文件格式,本質上是一個zip壓縮包,解壓出來就可以看到所有信息,可能正因為如果,使用XHTMLConverter便可以得到對應的html文檔,且標題元素的class屬性被標注為"X"+n(n為標題層級)。

但doc文檔但相對麻煩,doc文檔一般使用poi讀取,用的比較多的html轉換方式是使用poi中的WordToHtmlConverter進行轉換,這個轉換器并不會對標題進行特殊處理,將其當做普通有樣式的一個段落(Paragraph)進行處理,因此會和其他普通段落混合在一起。對此有兩種處理方法:

方案一:重寫processParagraph方法,在注釋的判斷處加上對標題的判斷,對標題進行特殊處理,但由于WordToHtmlConverter的成員變量均聲明為private,因此我采用了另一種方案。

?

protected void processParagraph(HWPFDocumentCore hwpfDocument, Element parentElement, int currentTableLevel, Paragraph paragraph, String bulletText) {Element pElement = this.htmlDocumentFacade.createParagraph();parentElement.appendChild(pElement);StringBuilder style = new StringBuilder();WordToHtmlUtils.addParagraphProperties(paragraph, style);int charRuns = paragraph.numCharacterRuns();if(charRuns != 0) {CharacterRun characterRun = paragraph.getCharacterRun(0);String pFontName;int pFontSize;if(characterRun != null) {Triplet triplet = this.getCharacterRunTriplet(characterRun);pFontSize = characterRun.getFontSize() / 2;pFontName = triplet.fontName;WordToHtmlUtils.addFontFamily(pFontName, style);WordToHtmlUtils.addFontSize(pFontSize, style);} else {pFontSize = -1;pFontName = "";}this.blocksProperies.push(new WordToHtmlConverter.BlockProperies(pFontName, pFontSize));try {if(WordToHtmlUtils.isNotEmpty(bulletText)) {if(bulletText.endsWith("\t")) {float defaultTab = 720.0F;float firstLinePosition = (float)(paragraph.getIndentFromLeft() + paragraph.getFirstLineIndent() + 20);float nextStop = (float)(Math.ceil((double)(firstLinePosition / 720.0F)) * 720.0D);float spanMinWidth = nextStop - firstLinePosition;Element span = this.htmlDocumentFacade.getDocument().createElement("span");this.htmlDocumentFacade.addStyleClass(span, "s", "display: inline-block; text-indent: 0; min-width: " + spanMinWidth / 1440.0F + "in;");pElement.appendChild(span);Text textNode = this.htmlDocumentFacade.createText(bulletText.substring(0, bulletText.length() - 1) + '\u200b' + '?');span.appendChild(textNode);} else {Text textNode = this.htmlDocumentFacade.createText(bulletText.substring(0, bulletText.length() - 1));pElement.appendChild(textNode);}}this.processCharacters(hwpfDocument, currentTableLevel, paragraph, pElement);} finally {this.blocksProperies.pop();}
     // 此處需要修改if(style.length() > 0) {this.htmlDocumentFacade.addStyleClass(pElement, "p", style.toString());}WordToHtmlUtils.compactSpans(pElement);} }

  方案二:在word文檔中進行埋點,然后在處理過后的html文檔中根據itTitleMap進行再處理

private Map<String,String> setTitleElements(HWPFDocument wordObject ){// 獲取樣式表StyleSheet styleSheet = wordObject.getStyleSheet();int styleTotal = wordObject.getStyleSheet().numStyles();// 使用map映射存儲標題信息Map<String,String> idTitleMap = Maps.newHashMap();Range range = wordObject.getRange();for (int i = 0; i < range.numParagraphs(); i++) {// 獲取樣式信息Paragraph paragraph = range.getParagraph(i);int styleIndex = paragraph.getStyleIndex();if (styleTotal > styleIndex) {StyleDescription styleDescription = styleSheet.getStyleDescription(styleIndex);String descriptionName = styleDescription.getName();if ( descriptionName != null && descriptionName.contains(FIRST_LEVEL_TITLE_DESCRIPTION)) {String uuid = UUIDHelper.getUuid();String text = paragraph.text().replaceAll( "[\r\n]", "" );paragraph.replaceText( uuid, false );idTitleMap.put( uuid, text );}}}return idTitleMap; }

  

轉載于:https://www.cnblogs.com/channingwong/p/9698924.html

總結

以上是生活随笔為你收集整理的Word文档转html并提取标题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。