2016-06-02 16 views
0

Ich muss Picture Content Control mit Bild ersetzen. Code läuft in Ordnung, aber wenn Word-Datei zu öffnen versucht, meldet es Catastophic Ausfall:Ersetzt Bild Inhalt Kontrolle mit Bild - Word-Berichte Katastrophaler Fehler beim Öffnen der Datei

enter image description here

Code ist grundsätzlich angepasst Version von ImageAdd Klasse von docx4j Proben. Eine lustige Sache ist, dass das in PDF konvertierte Dokument OK anzeigt.

List<SdtElement> contentControls = findContentControls(wordMLPackage.getMainDocumentPart(InputStream)); 

for (SdtElement contentControl : contentControls) { 
    for (Object ob : contentControl.getSdtContent().getContent()) { 
     traverseEelements(ob, value); 
    } 
} 

static List<SdtElement> findContentControls(ContentAccessor container) throws Docx4JException, JAXBException { 
    List<SdtElement> sdtElements = new LinkedList<SdtElement>(); 
    for (Object o : container.getContent()) { 
     Object unwrapped = XmlUtils.unwrap(o); 
     if (unwrapped instanceof SdtElement) { 
      sdtElements.add((SdtElement) unwrapped); 
     } 
     if (unwrapped instanceof ContentAccessor) { 
      List<SdtElement> list = findContentControls((ContentAccessor) unwrapped); 
      sdtElements.addAll(list); 
     } 
    } 
    return sdtElements; 
} 

private void traverseEelements(Object object, String value) { 
    if (object instanceof org.docx4j.wml.Text) { 
     Text text = (org.docx4j.wml.Text) object; 
     text.setValue(value); 
    } else if (object instanceof ContentAccessor) { 
     ContentAccessor contentAccessor = (ContentAccessor) object; 
     for (Object ob : contentAccessor.getContent()) { 
      traverseEelements(ob, value); 
     } 
    } else if (object instanceof JAXBElement) { 
     Object v = ((JAXBElement<?>) object).getValue(); 
     if (v instanceof ContentAccessor) { 
      ContentAccessor contentAccessor = (ContentAccessor) v; 
      for (Object ob : contentAccessor.getContent()) { 
       traverseEelements(ob, value); 
      } 
     } else if (v instanceof org.docx4j.wml.Text) { 
      Text text = (org.docx4j.wml.Text) v; 
      text.setValue(value); 
     } else if (v instanceof org.docx4j.wml.Drawing) { 
      Drawing drawing = (Drawing) v; 
      try { 
       File file = new File("C://Users//user//Pictures//test.png"); 
       java.io.InputStream is = new java.io.FileInputStream(file); 
       long length = file.length(); 
       if (length > Integer.MAX_VALUE) { 
        System.out.println("File too large!!"); 
       } 
       byte[] bytes = new byte[(int)length]; 
       int offset = 0; 
       int numRead = 0; 
       while (offset < bytes.length 
         && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) { 
        offset += numRead; 
       } 
       // Ensure all the bytes have been read in 
       if (offset < bytes.length) { 
        System.out.println("Could not completely read file "+file.getName()); 
       } 
       is.close(); 
       String filenameHint = null; 
       String altText = null; 
       int id1 = 0; 
       int id2 = 1; 
       BinaryPartAbstractImage imagePart = BinaryPartAbstractImage.createImagePart(wordMLPackage, bytes); 
       Inline inline = imagePart.createImageInline(filenameHint, altText, id1, id2, false); 
       drawing.getAnchorOrInline().add(inline); 
      } catch(Exception e) { 
       logger.error(e); 
      } 
     } else { 
      logger.error("unspupported element found: " + object.getClass()); 
     } 
    } else { 
     logger.error("unspupported element found: " + object.getClass()); 
    } 
} 

EDIT

Link to the file

+0

Den docx irgendwo hochladen? – JasonPlutext

+0

Hallo Jason, ich habe dich erwartet :) Ich habe den Link zur Datei am Ende der Frage hinzugefügt – Miki

Antwort

1

Sie haben ein w: Zeichnung, die sowohl wp: Anker, und wp: inline:

 <w:drawing> 
      <wp:anchor distT="0" distB="0" distL="114300" distR="114300" simplePos="false" relativeHeight="251658240" behindDoc="true" locked="false" layoutInCell="true" allowOverlap="true"> 
      <wp:simplePos x="0" y="0"/> 
      <wp:positionH relativeFrom="column"> 
       <wp:posOffset>0</wp:posOffset> 
      </wp:positionH> 
      <wp:positionV relativeFrom="paragraph"> 
       <wp:posOffset>0</wp:posOffset> 
      </wp:positionV> 
      <wp:extent cx="18288" cy="18288"/> 
      <wp:effectExtent l="0" t="0" r="0" b="0"/> 
      <wp:wrapNone/> 
      <wp:docPr id="1" name="Picture 1"/> 
      <wp:cNvGraphicFramePr> 
       <a:graphicFrameLocks noChangeAspect="true"/> 
      </wp:cNvGraphicFramePr> 
      <a:graphic> 
       <a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/picture"> 
       <pic:pic> 
        <pic:nvPicPr> 
        <pic:cNvPr id="0" name="Picture 1"/> 
        <pic:cNvPicPr> 
         <a:picLocks noChangeAspect="true" noChangeArrowheads="true"/> 
        </pic:cNvPicPr> 
        </pic:nvPicPr> 
        <pic:blipFill> 
        <a:blip cstate="print" r:embed="rId4"> 
         <a:extLst> 
         <a:ext uri="{28A0092B-C50C-407E-A947-70E740481C1C}"> 
          <a14:useLocalDpi xmlns:a14="http://schemas.microsoft.com/office/drawing/2010/main" xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" val="0"/> 
         </a:ext> 
         </a:extLst> 
        </a:blip> 
        <a:srcRect/> 
        <a:stretch> 
         <a:fillRect/> 
        </a:stretch> 
        </pic:blipFill> 
        <pic:spPr bwMode="auto"> 
        <a:xfrm> 
         <a:off x="0" y="0"/> 
         <a:ext cx="18288" cy="18288"/> 
        </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:anchor> 
      <wp:inline distT="0" distB="0" distL="0" distR="0"> 
      <wp:extent cx="952500" cy="333375"/> 
      <wp:effectExtent l="0" t="0" r="0" b="0"/> 
      <wp:docPr id="0" name="" descr=""/> 
      <wp:cNvGraphicFramePr> 
       <a:graphicFrameLocks noChangeAspect="true"/> 
      </wp:cNvGraphicFramePr> 
      <a:graphic> 
       <a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/picture"> 
       <pic:pic> 
        <pic:nvPicPr> 
        <pic:cNvPr id="1" name=""/> 
        <pic:cNvPicPr/> 
        </pic:nvPicPr> 
        <pic:blipFill> 
        <a:blip r:embed="rId7"/> 
        <a:stretch> 
         <a:fillRect/> 
        </a:stretch> 
        </pic:blipFill> 
        <pic:spPr> 
        <a:xfrm> 
         <a:off x="0" y="0"/> 
         <a:ext cx="952500" cy="333375"/> 
        </a:xfrm> 
        <a:prstGeom prst="rect"> 
         <a:avLst/> 
        </a:prstGeom> 
        </pic:spPr> 
       </pic:pic> 
       </a:graphicData> 
      </a:graphic> 
      </wp:inline> 
     </w:drawing> 

, dass der Ausfall verursacht.

+0

Jason, ich habe darüber gelesen [hier] (https://blogs.technet.microsoft.com/hub/2011/ 06/14/use-object-anchors-to-help-place-images-in-word /) und da in meinem Fall die Bildkontrolle so eingestellt ist, dass sie hinter dem Text schwebt (das generiert ein Ankerelement), habe ich versucht ohne zu verwenden diese Option. Jetzt sehe ich denselben Fehler aber innerhalb von w: Zeichnung habe ich zwei wp: inline. Scheint so, als müsste ich kein Bild hinzufügen, sondern existierendes bearbeiten - Code ändern müssen. Weitere Informationen finden Sie unter ... – Miki

+0

Im Allgemeinen sollten Sie Ihr Bild in einem Rich-Text-Content-Steuerelement ablegen, wenn Sie möchten, dass es floatfähig ist, da Microsoft Floating Picture Content Controls nicht unterstützt. Es gab Möglichkeiten, dies in Word zu tun, aber im letzten Jahr oder zwei haben sie einige dieser Ansätze ausgegraut. – JasonPlutext

0

Dank Jasons answer wird klar, was mich nervt. Mein Problem war, dass ich ein neues Inline-Bild hinzufügte, wo ich bereits eines von Picture Content Control hatte. Quick-Win diese Inline ist das Entfernen und Hinzufügen einer programmatisch vorbereitet wie

BinaryPartAbstractImage imagePart = 
    BinaryPartAbstractImage.createImagePart(wordMLPackage, bytesImage); 
Inline inline = imagePart.createImageInline(filenameHint, altText, id1, id2, false); 
Inline inlineOriginal = (Inline) drawing.getAnchorOrInline().get(0);    
drawing.getAnchorOrInline().add(inline);    
drawing.getAnchorOrInline().remove(inlineOriginal); 

Ich werde versuchen, eine diese etwas mehr zu arbeiten und hoffentlich allgemeineren Ansatz sowohl mit Schablone und Code (Ich werde versuchen, bearbeiten diese Antwort). Was ich herausfinden muss, ist, wie man ein verankertes Bild im Dokument behält/hinzufügt, aber das ist ein weiteres spezifisches Problem, mit dem ich mich befassen werde. Danke Jason noch einmal!