2016-07-18 18 views
0

Ich habe eine Legacy-Rails-App, die docx-Datei generieren kann. Es ist nur XML-Vorlage, kein Juwel. Vorlage wird mit ERB-Syntax geschrieben.Generierte docx-Datei ist beschädigt

Das Problem ist, dass generierte Datei von MS Office Word als "beschädigt" markiert wird, obwohl LibreOffice unter Linux es einwandfrei öffnet. Nach der Wiederherstellung von MS Office scheint Word jedoch die Datei ohne irgendwelche Inhaltsverluste zu öffnen.

Ich füge vollständige XML-Vorlage auf pastebin.

Während des Debugging habe ich herausgefunden, dass ohne den Block, ausgehend von der Leitung 602, alles gut funktioniert. Ich kann also nicht verstehen, was mit dieser bestimmten XML-Datei falsch ist. Ich werde es der Einfachheit halber hier einfügen

<% [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 %> 

Ich habe versucht, wiederhergestellte Datei mit meiner Datei zu vergleichen, aber ich habe keine entscheidenden Unterschiede. Ich habe diesen Unterschied jetzt nicht, aber ich kann ihn bei Bedarf reproduzieren.

Kann mir jemand den Weg zeigen? :) Was mache ich falsch?

UPDATE Ich habe versucht, Korrekturen vorzunehmen, vorgeschlagen von Martin P., aber kein Glück. Hier ist ein diff zwischen meiner generierte Datei und wiederhergestellter Version (rechts gestellt)

Diff screenshot

+0

Ich habe festgestellt, dass einige ungültige Unicode-Escape-Sequenzen die Datei ruinieren können. Überprüfen Sie, ob Ihre generierten XML-Dateien "\ uXXXX" enthalten. (wobei X hexadezimal ist, natürlich) –

Antwort

0

Nach vielen Stunden Debuggen wird die Antwort gefunden. Der letzte Teil dieses Puzzles war die Datei [Content_Types].xml. Es enthielt die Zeile <Default Extension="jpeg" ContentType="image/jpeg" />, aber meine Bilder haben .jpg Erweiterung. Ich änderte Extension Attribut zu jpg und der Fehler war weg.

Allerdings sind die von Martin P. vorgeschlagenen Ergänzungen auch notwendig (wie kann ich ihm übrigens gutschreiben?), weil ohne sie die resultierende Datei beschädigt bleibt, aber mit einer anderen Fehlermeldung.

Dank an alle, die versucht haben, mir zu helfen. Ich hoffe, diese Antwort wird jemandem in der Zukunft helfen.

1

Soweit ich sehe, Sie fehlen zwei Elemente und einige Attribute.

(1) Die wp:inline braucht ein wp:docPr Element haben ein id, name und descr Attribut enthält.

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

(2) Das pic:nvPicPr Element braucht ein pic:cNvPr Element haben die gleichen Attribute enthält.

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

Natürlich müssen Sie die fehlenden Variablen (<% .. %>) einfügen.

Hier markierte ich die Linie, wo die Elemente durch Kommentare einzufügen:

<% [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 %> 

Wenn Sie an Ihrem diff aussehen, können Sie diese Elemente hinzugefügt sehen.

+0

Vielen Dank für Ihre Hilfe! Leider ist das Problem immer noch da. Ich habe die ursprüngliche Frage aktualisiert. –

+0

Es sieht so aus, als ob es die zwei Attribute 'wp14: anchorId' und' wp14: editId' zum 'wp: inline' Element hinzufügt. Es würde sie auch in der Vorlage mit den Werten aus dem wiederhergestellten Element hinzufügen. Und ändern Sie den Attributwert "r: embed" für das Element "a: blip" vom Bildnamen in einen Wert, der auch für die wiederhergestellte Datei gilt. Alle anderen Änderungen scheinen nicht relevant zu sein. –

0

Die Tatsache, dass MS Office Word den Wert r:embed ersetzt, deutet darauf hin, dass in der Beziehungsdatei dieses Dokuments keine Definition von @Id="image_1" vorhanden war. Die relevante Beziehungsdatei ist wahrscheinlich word/_rels/document.xml.rels.

Verwandte Themen