Ruby:从docx文件解析/提取图像和对象

时间:2017-09-18 15:14:52

标签: ruby parsing docx document-conversion

我正在尝试使用Ruby打开并读取.docx文件,并提取部分文本和对象/图像并保存到另一个(非.docx)文件中。

使用Nokogiri,我能够正确地提取文本并将文档分区到我想要的部分:

zip = Zip::File.open file_path
doc = zip.find_entry("word/document.xml")
xml = Nokogiri::XML.parse(doc.get_input_stream)
wt  = xml.root.xpath("//w:t", {"w" => 
"http://schemas.openxmlformats.org/wordprocessingml/2006/main"})

如果我改为:

xml.root.xpath("//w:body", {"w" => "http://schemas.openxmlformats.org/wordprocessingml/2006/main"})

我可以在xml中看到对象:

  <w:object w:dxaOrig="1440" w:dyaOrig="400">
    <v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f">
      <v:stroke joinstyle="miter"/>
      <v:formulas>
        <v:f eqn="if lineDrawn pixelLineWidth 0"/>
        <v:f eqn="sum @0 1 0"/>
        <v:f eqn="sum 0 0 @1"/>
        <v:f eqn="prod @2 1 2"/>
        <v:f eqn="prod @3 21600 pixelWidth"/>
        <v:f eqn="prod @3 21600 pixelHeight"/>
        <v:f eqn="sum @0 0 1"/>
        <v:f eqn="prod @6 1 2"/>
        <v:f eqn="prod @7 21600 pixelWidth"/>
        <v:f eqn="sum @8 21600 0"/>
        <v:f eqn="prod @7 21600 pixelHeight"/>
        <v:f eqn="sum @10 21600 0"/>
      </v:formulas>
      <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
      <o:lock v:ext="edit" aspectratio="t"/>
    </v:shapetype>
    <v:shape id="_x0000_i1025" type="#_x0000_t75" style="width:1in;height:20.4pt" o:ole="">
      <v:imagedata r:id="rId4" o:title=""/>
    </v:shape>
    <o:OLEObject Type="Embed" ProgID="Equation.DSMT4" ShapeID="_x0000_i1025" DrawAspect="Content" ObjectID="_1563800156" r:id="rId5"/>
  </w:object>

但不确定如何将其转换为以后可用于在html中显示的内容。转换为svg使其可以与html中的文本一起显示将是理想的。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

看起来可能是VML,将它与MSDN上Using the Formulas Element的示例进行比较:

<v:shape style='width:1in;height:1in;' strokecolor="red"
strokeweight="2pt" coordsize="21600,21600" adj="17520"
path="m10800,0qx0,10800,10800,21600,21600,10800,10800,0xe
m7340,6445qx6215,7570,7340,8695,8465,7570,7340,6445xnfe
m14260,6445qx13135,7570,14260,8695,15385,7570,14260,6445xnfe
m4960@0c8853@3,12747@3,16640@0nfe">
  <v:formulas>
    <v:f eqn="sum 33030 0 #0"/>
    <v:f eqn="prod #0 4 3"/>
    <v:f eqn="prod @0 1 3"/>
    <v:f eqn="sum @1 0 @2"/>
  </v:formulas>
</v:shape>

在该页面上有一个链接到VML specification以查看所有内容,但是对于预编写的工具,我找不到很多,尽管有几个问题,大多数他们看起来像是标记重复,或者以其他方式所有引用回来的问题Are there any tools to convert legacy VML to SVG?