用Python將word檔案轉換成html
用Python將word檔案轉換成html
https://mp.weixin.qq.com/s/aAbsu4VIwEPnOs_hJUpk_Q
序
最近公司一個客戶大大購買了一堆醫療健康方面的科普文章,希望能放到我們正在開發的健康檔案管理軟體上。客戶大大說,要智慧推送!要掌握節奏!要深度學習!要讓使用者留戀網站無法自拔!
話說符合以上特點的我也只能聯想到某榴了。
當然,萬里長征的第一步是把文章匯入我們的資料庫。專案使用的是AWS的dynamoDB,是非關係型資料庫,所有內容都是以json的形式儲存的。而客戶大大購買來的文章,一共600多篇,要麼是word要麼是Adobe indesign的indd。找了一圈,沒有發現合適的應用可以把word或indd轉化成乾淨的html。所以我只能自己造輪子啦~聽說python很擅長文字處理,所以就是你了,python!這是我第一次用python寫專案,不符合規範的地方歡迎大神提點。
太長不看
用逆天的python 模組mammoth和docx 處理你的word檔案;把indd批次轉化成pdf然後用layout_scanner轉化成html。
word批次轉化為html
1、 建立檔案結構並批次讀取檔案
在根目錄下建立幾個資料夾,用來放不同格式的檔案,我把所有要處理的word檔案放在docfiles 這個子目錄裡。word.py裡寫轉化程式。
1. ├── docfiles
2.
3. ├── imgs
4.
5. ├── inddfiles
6.
7. ├── output
8.
9. └── pdfs
10.
11. └── word.py
2、引入模組和申明檔案路徑
1. import mammoth
2. import mammoth.transforms
3. import os
4. from docx import Document
5. from bson import json_util
6. import zipfile
7. import json
8. import unidecode
9. import requests
10.
11. guidUrl = ""
12. inputPath = '/Users/admin/cwell/parser/docfiles/'
13. imgPath = "/Users/admin/cwell/parser/imgs/"
14. outputFile = '/Users/admin/cwell/parser/output/output.json'
mammoth: 核心元件,用來做轉化工作
docx: 另一個做轉化工作的模組,用來補充mammoth
os: 用來在系統中讀取寫入檔案
zipfile: 用來解壓word文件以提取圖片
json: 用來把資料轉化成json
bson: 用來配置寫入json檔案
unicode:用來處理字元
requests:用來呼叫api
3、轉換單個檔案
1. styleMap = """
2. p[style-name='Title'] => h1.hide
3. p[style-name='Subhead 1'] => h3
4. p[style-name='List Bullet'] => ul.first > li:fresh
5. p[style-name='List Bullet 2'] => ul.second > li:fresh
6. p[style-name='Hyperlink']=>a.link
7. """
8. def convert_image(image):
9. return {
10. "src":""
11. }
12.
13. def parseFile(f):
14. document = Document(inputPath+f)
15. article = {"Title":document.core_properties.title,"Content":""}
16. with open(inputPath+f,"rb") as docFile:
17. html = mammoth.convert_to_html(docFile,style_map=styleMap,convert_image=mammoth.images.img_element(convert_image))
18. decoded = unidecode.unidecode(html.value)
19.
20.
21. if not article["Title"]:
22. for para in document.paragraphs:
23. if para.style.name == 'Title':
24. if para.text:
25. article["Title"] = para.text
26.
27. article["Content"]=decoded
28. return article
parseFile就是核心功能了。傳遞進來的引數f是檔名,和檔案路徑合在一起能夠幫我們準確定位要轉化的檔案。首先用docx找到文件的標題,並建立一個dictionary,裡面包含標題和內容。然後用mammoth轉化整個檔案。注意命令中要用到stylemap和convertimage。前者用來規定轉化規則:'style-name'是word裡的式樣名稱,用word開啟文件,點選任意一個元素可以檢視其式樣名稱;這裡規定標題轉化為h1,副標題轉化為h2等等。關於列表的轉化規則這裡就不詳細敘述了,具體可以參考下面的文章:
參考連結
1. Converting docx to clean HTML: handling the XML structure mismatch
'convert_image' 是用來規定圖片的轉化方式的,由於我準備之後批處理所有文件中的圖片,在這裡就告訴程式不儲存任何圖片資訊。但是於此同時保留圖片的img tag以便標註圖片在文件中的位置。如果不規定任何轉化方式,生成的html裡面會包含一大長串base64的圖片資訊。
mammoth轉化出來的html是含有unicode的,不知道為什麼python裡跑一直報錯,就用unicode解碼了一下。
這之後,如果前面的程式沒有抓取到文件標題,用docx換個姿勢再抓取一下。
最後返回article這個dictionary。
4、抓取圖片
1. def extractImage(f):
2. ziped = zipfile.ZipFile(inputPath+f)
3. allFiles = ziped.namelist()
4. imgs = filter(lambda x: x.startswith('word/media/'), allFiles)
5. imgNameArr = []
6. for img in imgs:
7. res = requests.post(guidUrl)
8. if res.status_code is 200:
9. guid = res.text
10. data = ziped.read(img,imgPath)
11. idxStr = os.path.basename(img).split(".")[0][-1:]
12. imgDict = {}
13. imgDict["index"] = int(idxStr)-1
14. imgDict["fileName"] = guid+".jpg"
15. imgNameArr.append(imgDict)
16. targetPath = os.path.join(imgPath,guid+".jpg")
17. target = open(targetPath,"wb")
18. target.write(data)
19. target.close()
20. ziped.close()
21. return imgNameArr
沒想到word文件其實是一個壓縮檔案吧?如果直接把word文件的字尾名改成zip然後再用解壓軟體檢視,會看到一個media資料夾,裡面就包含所有插入的圖片。
用ziped讀取文件,然後找到存放圖片的media資料夾,每一個圖片重新用guid命名,生成一個dictionary,裡面包含的資訊有“此圖片在文件中出現的順序”和檔名。話說media中的圖片都被按照順序重新命名為image1.png, image2.png,剛好為我們抓取順序資訊提供了方便。
(python也有生成guid的模組,我在這裡呼叫api有點多此一舉,但是為了和專案中其他圖片需要用到的uuidv4保持一致還是用了)
之後就是把圖片存在‘imgs’這個資料夾下。
5、生成json
1. def processDocs(path):
2. result = []
3. for f in os.listdir(path):
4. if not f.startswith('.'):
5. imgNameArr = extractImage(f)
6. article = parseFile(f)
7. fileName = os.path.basename(f)
8. contentArr = article["Content"].split("<img")
9. for idx, section in enumerate(contentArr):
10. for info in imgNameArr:
11. if idx is info["index"]:
12. contentArr[idx] = section+"<img alt='"+info["fileName"]+"' data-fileName='"+info["fileName"]+"'"
13.
14. article["Content"] = ''.join(contentArr)
15. result.append(article)
16.
17.
18. with open(outputFile,'w+') as f:
19. json.dump(result,f,default=json_util.default)
最後要用到的一個function就是寫個迴圈挨個處理docfiles資料夾底下的檔案了。針對每一個檔案,記得把之前生成的圖片資訊的陣列map到html裡,然後在寫入到json檔案裡就大功告成了!
indd轉化為html
話說,到現在為止,我還沒有找到一個完美的解決方案。我使用了相同的思路,把indd先批次生成為pdf(有一個indesign 指令碼就是專門批次轉化pdf的),然後用了一個叫做layout_scanner的github專案抓取pdf資訊並轉化為html。最後生成的html包含了文字和圖片,但是圖示和排版就儲存不下來了。客戶大大表示不滿意。我也很惆悵啊!機智的小夥伴們如果有更好的思路請務必告訴我!如果需要我詳細說明一下這一塊內容,我會更新在這篇文章中。
參考連結
1. dpapathanasiou/pdfminer-layout-scanner
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29829936/viewspace-2149846/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 如何將檔案PDF格式轉換成Word格式
- Caj檔案怎樣整篇轉換成Word
- Word將文字轉換成表格技巧
- 輕鬆將Word文件快速轉成Flash檔案(轉)
- aspose word轉換pdf檔案後將pdf檔案轉換為圖片png
- caj如何轉化為word檔案 caj免費轉換成word方法
- caj檔案怎麼轉換成word文件,簡單的檔案格式轉換教程
- Java 將Markdown檔案轉換為Word和PDF文件Java
- python 將 CVS檔案轉為HTML檔案PythonHTML
- pdf轉換成word,非常實用
- 用py2exe將python檔案轉換成exe可執行程式Python行程
- 用Aspose-Java免費實現 PDF、Word、Excel、Word互相轉換並將轉換過得檔案上傳OSS,返回轉換後的檔案路徑JavaExcel
- Linux下批量將md檔案轉換為html檔案LinuxHTML
- 蘋果手機如何將PDF檔案轉換為Word文件蘋果
- ubuntu下使用sratoolkit將sra檔案轉換成fastq檔案UbuntuAST
- 用Java寫一個PDF,Word檔案轉換工具Java
- 如何用Python把pdf轉換成wordPython
- html5中將圖片的絕對路徑轉換成檔案物件HTML物件
- Java 將HTML轉為WordJavaHTML
- 四種將Word轉換為HTML的線上工具HTML
- pdf轉換成word,免費轉換
- 使用UiBot實現批次html轉換成PDF檔案UIHTML
- WOR檔案轉換成GST檔案
- pdf轉換成word文件
- window下使用sratoolkit將sra檔案轉換成fastqAST
- WPS演示將演示文件轉換成Flash檔案
- Python:將utf-8格式的檔案轉換成gbk格式的檔案Python
- PDF to Word Document Converter Mac(PDF轉Word檔案轉換器)Mac
- stirlingpdf PDF 工具將PDF轉換成Word
- 把 .xyz 檔案轉換成 .ply 檔案
- 將bmp檔案轉換成JPEG(待修改,目前可轉換但圖片倒轉)
- 有哪些免費的方法可以將PDF轉換成Word?
- 如何實現將markdown檔案實時轉換為html文件HTML
- 將Schema檔案轉換為Java檔案Java
- Python 將Word轉換為JPG、PNG、SVG圖片PythonSVG
- 用VB將WORD文件(或其他的二進位制資料)生成xml檔案並互相轉換 (轉)XML
- Java 將Word轉為HTML的方法JavaHTML
- ppt轉換word文件怎麼操作 把ppt轉換成word純文字