把docx文檔轉換成markdown格式發布


有些Word文檔想搬到博客上來,而博客用的是markdown的格式。最簡單的辦法是在Word里轉成html格式另存為,因為markdown和html是兼容的。不過word直接另存為的html里面帶有“海量”的無聊樣式,實在不方便之后我們再用vim的工具編輯。所以還是想辦法整整。

相對來說,Word的docx格式比doc格式要容易處理,因為docx是微軟特意推出的open xml格式。其實就是記錄了文本內容的content.xml、附件media/*和對應附件路徑的_ref.xml等的zip包而已。所以相對必須在Windows平台上調用WIN32OLE的API來處理的doc來說,我們在linux平台上也可以很容易的處理docx文件了。比如rubygems上就有一個很不錯的gem叫ydocx。一般的docx庫都是只抽取docx里的content文字,而這個ydocx很負責的把media/*也復制到docxname_files/images/*下面,並且在html里生成<img>標簽了。

然后另一步就是把html轉換成markdown,這在github上也有現成的repo叫downmark_it。嗯,這名字一目了然就是反過來……

(ydocx用的是nokogiridownmark\_it用的是hpricot,或許應該也改用nokogiri比較好~不過nokogiri官網可恥的被牆了)

首先安裝依賴

apt-get install libxslt1-dev libxml2-dev
  gem install rubyzip htmlentities rmagick ydocx hpricot
  wget https://raw.github.com/cousine/downmark_it/master/downmark_it.rb

編寫轉換腳本

require 'rubygems'
  require 'ydocx'
  $: << File.dirname(__FILE__)
  require 'downmark_it'
  filename = ARGV.shift
  ydocx = YDocx::Document.open(filename)
  html = ydocx.to_html.gsub(/\n/, '')
  puts DownmarkIt.to_markdown(html)

這樣就能看到輸出了。目錄里的每個章節都有引用格式凸現,美中不足是對word里的標題樣式識別不太好,本來期望是可以自己生成<h1><h2>的,但是ydocx生成的html里只把第一個標題一變成<h1>,其他的都是普通的<p>

另一個問題是上面腳本里直接調用to_html的方法,不會保存住unzip出來的images文件夾。自己再另寫一段unzip的代碼:

require 'fileutils'  
  require 'zip/zip'  
  require 'zip/zipfilesystem'  
    
  def unzip(zip_file, dest_dir)
    Zip::ZipFile.open(zip_file) do |zf|
      zf.each do |e|
        path = File.join(dest_dir, e.name)
        FileUtils.mkdir_p(File.dirname(path))
        zf.extract(e, path) { true }
      end  
    end  
  end
  dirname = File.basename(filename, '.docx')
  unzip(filename, "/tmp/#{dirname}")
  FileUtils.mv("/tmp/#{dirname}/media/", "/images/")
  FileUtils.rm_rf("/tmp/#{dirname}")

比較普通的辦法,是直接使用ydocx自帶的腳本docx2html --format none file.docx,會在docx文檔的同級目錄下生成同名html和_files目錄。然后再寫一個單行腳本轉成markdown的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM