2016-07-18 7 views
0

私は、docxファイルを生成することができる従来のRailsアプリケーションを持っています。これはXMLテンプレートを使用しているだけで、宝石ではありません。テンプレートはERB構文を使用して記述されます。生成されたdocxファイルが壊れています

問題は、Linux上のLibreOfficeが完全に開いても、生成されたファイルがMS Office Wordによって「破損している」とマークされていることです。しかし、MS Office Wordをリカバリした後も、コンテンツを失うことなくファイルを開くことができます。

pastebinに完全なXMLテンプレートを貼り付けます。

デバッグ中に、ブロックなしで、602行目から開始すると、すべて正常に動作します。だから私は、その特定のXML部分に何が間違っているのかを知ることはできません。私は私が私のファイルを回復したファイルを比較してみましたが、私は任意の決定的な違いを見ていない利便

<% [task[:design_front], task[:design_back]].compact.each do |img_data| %> 

      <w:r> 
       <w:rPr> 
       <w:rFonts w:ascii="Arial" w:eastAsia="Times New Roman" w:hAnsi="Arial" w:cs="Arial" /> 
       <w:noProof /> 
       <w:sz w:val="18" /> 
       <w:szCs w:val="18" /> 
       <w:lang w:eastAsia="ru-RU" /> 
       </w:rPr> 
       <w:drawing> 
       <wp:inline distT="0" distB="0" distL="0" distR="0"> 
        <wp:extent cx="<%= img_data[:width] * 7400 %>" cy="<%= img_data[:height] * 7400 %>" /> 
        <wp:effectExtent l="0" t="0" r="0" b="0" /> 
        <wp:cNvGraphicFramePr> 
        <a:graphicFrameLocks xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" noChangeAspect="0" /> 
        </wp:cNvGraphicFramePr> 
        <a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"> 
        <a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/picture"> 
         <pic:pic xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture"> 
         <pic:nvPicPr> 
          <pic:cNvPicPr> 
          <a:picLocks noChangeAspect="0" noChangeArrowheads="0" /> 
          </pic:cNvPicPr> 
         </pic:nvPicPr> 
         <pic:blipFill> 
          <a:blip r:embed="<%= img_data[:id] %>" cstate="print"> 
          <a:extLst> 
           <a:ext uri="{28A0092B-C50C-407E-A947-70E740481C1C}"> 
           <a14:useLocalDpi xmlns:a14="http://schemas.microsoft.com/office/drawing/2010/main" val="0" /> 
           </a:ext> 
          </a:extLst> 
          </a:blip> 
         </pic:blipFill> 
         <pic:spPr bwMode="auto"> 
          <a:xfrm> 
          <a:off x="0" y="0" /> 
          <a:ext cx="<%= img_data[:width] * 7400 %>" cy="<%= img_data[:width] * 7400 %>" /> 
          </a:xfrm> 
          <a:prstGeom prst="rect"> 
          <a:avLst /> 
          </a:prstGeom> 
          <a:noFill /> 
          <a:ln> 
          <a:noFill /> 
          </a:ln> 
         </pic:spPr> 
         </pic:pic> 
        </a:graphicData> 
        </a:graphic> 
       </wp:inline> 
       </w:drawing> 
      </w:r> 

      <% end %> 

のために右ここに貼り付けます。私は今はdiffを持っていませんが、必要ならばそれを再現することができます。

誰かが私に道を示すことができますか? :)私は間違って何をしていますか?

更新 私はMartin P.が提案した修正を試みましたが、運はありませんでした。ここでは私の知る限り見るように私の生成されたファイル間の差分であり、バージョンを回復(右側の回復)

Diff screenshot

+0

ユニコードのエスケープシーケンスが無効になると、ファイルが破損することがあります。生成されたXMLファイルに '\ uXXXX'が含まれているかどうかを確認してください。 (Xは16進数字です) –

答えて

0

何時間ものデバッグの後、答えが見つかりました。

このパズルの最後の部分は、ファイル[Content_Types].xmlです。それには<Default Extension="jpeg" ContentType="image/jpeg" />という行が含まれていましたが、私の画像には.jpgという拡張子が付きました。 Extension属性をjpgに変更しました。エラーはなくなりました。

しかし、Martin P.が提案した追加情報も必要です(途中で彼をどのように認めることができますか?)、結果のファイルは破損したままですが、別のエラーメッセージが残っているためです。

誰もが私を助けてくれたおかげです。私はこの答えが将来誰かを助けることを願っています。

1

、次の2つの要素といくつかの属性が欠落しています。

(1)wp:inlineidname、及びdescr属性を含むwp:docPr要素を有する必要があります。

<wp:docPr id="<% id %>" name="<% picture_name %>" descr="<% full_file_path_to_the_picture %>"/> 

(2)pic:nvPicPr要素は同じ属性を含むpic:cNvPr要素を有する必要があります。もちろん

<pic:cNvPr id="<% id %>" name="<% picture_name %>" descr="<% full_file_path_to_the_picture %>"/> 

あなたが不足している変数(<% .. %>)を挿入する必要があります。

ここで私は、コメントを使用して要素を挿入する行をマーク:あなたはあなたの差分を見れば

<% [task[:design_front], task[:design_back]].compact.each do |img_data| %> 
      <w:r> 
       <w:rPr> 
       <w:rFonts w:ascii="Arial" w:eastAsia="Times New Roman" w:hAnsi="Arial" w:cs="Arial" /> 
       <w:noProof /> 
       <w:sz w:val="18" /> 
       <w:szCs w:val="18" /> 
       <w:lang w:eastAsia="ru-RU" /> 
       </w:rPr> 
       <w:drawing> 
       <wp:inline distT="0" distB="0" distL="0" distR="0"> 
        <wp:extent cx="<%= img_data[:width] * 7400 %>" cy="<%= img_data[:height] * 7400 %>" /> 
        <wp:effectExtent l="0" t="0" r="0" b="0" /> 
<!-- insert wp:docPr here --> 
        <wp:cNvGraphicFramePr> 
        <a:graphicFrameLocks xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" noChangeAspect="0" /> 
        </wp:cNvGraphicFramePr> 
        <a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"> 
        <a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/picture"> 
         <pic:pic xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture"> 
         <pic:nvPicPr> 
          <pic:cNvPicPr> 
<!-- insert pic:cNvPr here --> 
          <a:picLocks noChangeAspect="0" noChangeArrowheads="0" /> 
          </pic:cNvPicPr> 
         </pic:nvPicPr> 
         <pic:blipFill> 
          <a:blip r:embed="<%= img_data[:id] %>" cstate="print"> 
          <a:extLst> 
           <a:ext uri="{28A0092B-C50C-407E-A947-70E740481C1C}"> 
           <a14:useLocalDpi xmlns:a14="http://schemas.microsoft.com/office/drawing/2010/main" val="0" /> 
           </a:ext> 
          </a:extLst> 
          </a:blip> 
         </pic:blipFill> 
         <pic:spPr bwMode="auto"> 
          <a:xfrm> 
          <a:off x="0" y="0" /> 
          <a:ext cx="<%= img_data[:width] * 7400 %>" cy="<%= img_data[:width] * 7400 %>" /> 
          </a:xfrm> 
          <a:prstGeom prst="rect"> 
          <a:avLst /> 
          </a:prstGeom> 
          <a:noFill /> 
          <a:ln> 
          <a:noFill /> 
          </a:ln> 
         </pic:spPr> 
         </pic:pic> 
        </a:graphicData> 
        </a:graphic> 
       </wp:inline> 
       </w:drawing> 
      </w:r> 

      <% end %> 

、あなたはこれらの要素が追加されることがあります。

+0

ありがとうございました!残念ながら問題はまだ残っています。私は元の質問を更新しました。 –

+0

'wp14:anchorId'と' wp14:editId'という2つの属性を 'wp:inline'要素に追加するようです。回収された要素の値を使用してテンプレートにも追加されます。そして、 'a:blip'要素の' r:embed'属性値をイメージ名から回復されたファイルのような値に変更します。他のすべての変更は関連していないようです。 –

0

MS Office Wordがr:embedの値を置き換えたという事実は、このドキュメントのリレーションシップファイルに@Id="image_1"の定義がなかったことを示しています。関連関係ファイルはおそらくword/_rels/document.xml.relsです。

関連する問題