comment append une image à un document .docx avec Apache POI XWPF en java

J’ai créé un document docx simple en utilisant Java POI 3.7. XWPF. Ensuite, j’ai ajouté une image en utilisant la méthode XWPFDocument.addpicture(byte[] arg0, int arg1) .

 XWPFDocument docx = new XWPFDocument(); XWPFParagraph par = docx.createParagraph(); XWPFRun run = par.createRun(); run.setText("Hello, World. This is my first java generated docx-file. Have fun."); run.setFontSize(13); InputStream pic = new FileInputStream("logo.jpg"); byte [] picbytes = IOUtils.toByteArray(pic); docx.addPicture(picbytes, Document.PICTURE_TYPE_JPEG); 

La taille de fichier du docx augmentant, l’image a été ajoutée “physiquement” au document. mais il ne s’affiche pas du tout dans MS Word. On dirait qu’il y a une référence à l’image manquante dans le document.

Quel est le moyen de faire ça? Comment se fait la gestion des images avec Apache POI? Et là où il y a plus de tutoriels sur le Web, il n’existe pratiquement aucun document ni tutoriel pour XWPF, ce qui explique le traitement des paragraphes, des exécutions, etc.

La seule chose que j’ai trouvée à ce sujet se trouve ici: https://issues.apache.org/bugzilla/show_bug.cgi?id=49765 mais cela n’aide en rien.

Merci d’avance.

Je sais que ce message est très ancien, mais je poste toujours la réponse pour que tous ceux qui recherchent cette réponse puissent l’utiliser. Pour insérer l’image dans le document Word, vous devez écrire deux programmes. Le premier est: –

 package org.word.POI; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.xwpf.usermodel.Document; import org.apache.poi.xwpf.usermodel.XWPFDocument; /* Romesh Soni [email protected] */ public class TestCustom { public static void main(Ssortingng []a) throws FileNotFoundException, IOException, InvalidFormatException { CustomXWPFDocument document = new CustomXWPFDocument(new FileInputStream(new File("C:\\Users\\amitabh\\Documents\\Apache POI\\Word File\\new.doc"))); FileOutputStream fos = new FileOutputStream(new File("C:\\Users\\amitabh\\Documents\\Apache POI\\Word File\\new.doc")); Ssortingng blipId = document.addPictureData(new FileInputStream(new File("C:\\Users\\amitabh\\Pictures\\pics\\3.jpg")), Document.PICTURE_TYPE_JPEG); System.out.println(document.getNextPicNameNumber(Document.PICTURE_TYPE_JPEG)); //System.out.println(document.getNextPicNameNumber(Document.PICTURE_TYPE_JPEG)); document.createPicture(blipId,document.getNextPicNameNumber(Document.PICTURE_TYPE_JPEG), 500, 500); document.write(fos); fos.flush(); fos.close(); } } 

Maintenant, ici, j’ai utilisé “CustomeXwPFDocument” dans ce code et vous n’obtiendrez aucune importation via aucun fichier jar, vous devez donc append une autre classe .java dans votre paquet. le code de la classe “CustomXWPFDocument” se présente comme suit: –

 package org.word.POI; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.xmlbeans.XmlException; import org.apache.xmlbeans.XmlToken; import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps; import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D; import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTInline; import java.io.IOException; import java.io.InputStream; public class CustomXWPFDocument extends XWPFDocument { public CustomXWPFDocument(InputStream in) throws IOException { super(in); } public void createPicture(Ssortingng blipId,int id, int width, int height) { final int EMU = 9525; width *= EMU; height *= EMU; //Ssortingng blipId = getAllPictures().get(id).getPackageRelationship().getId(); CTInline inline = createParagraph().createRun().getCTR().addNewDrawing().addNewInline(); Ssortingng picXml = "" + "" + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + ""; //CTGraphicalObjectData graphicData = inline.addNewGraphic().addNewGraphicData(); XmlToken xmlToken = null; try { xmlToken = XmlToken.Factory.parse(picXml); } catch(XmlException xe) { xe.printStackTrace(); } inline.set(xmlToken); //graphicData.set(xmlToken); inline.setDistT(0); inline.setDistB(0); inline.setDistL(0); inline.setDistR(0); CTPositiveSize2D extent = inline.addNewExtent(); extent.setCx(width); extent.setCy(height); CTNonVisualDrawingProps docPr = inline.addNewDocPr(); docPr.setId(id); docPr.setName("Picture " + id); docPr.setDescr("Generated"); } } 

Utilisez les bocaux POI 3.9 pour ce programme. La meilleure URL est: – http://www.apache.org/dyn/closer.cgi/poi/release/bin/poi-bin-3.9-20121203.zip

Maintenant vous êtes prêt à voler. Bonne chance.

La solution élégante est à venir, consultez: https://issues.apache.org/bugzilla/show_bug.cgi?id=55476

Vous pouvez soit attendre que mon correctif soit accepté et publié, soit essayer de l’appliquer à la dernière commande SVI de POI ( http://poi.apache.org/subversion.html , le lien d’access en lecture seule fonctionnera) et de créer des fichiers jar de POI à partir de sources. .

L’approche suggérée par tsd.tom fonctionnera:

 XWPFParagraph par = docx.createParagraph(); XWPFRun run = par.createRun(); run.addPicture(pic, XWPFDocument.PICTURE_TYPE_JPEG, "logo.JPG",300,300); 

Le lien de bogue que vous avez fourni a en fait une solution qui fonctionne: http://soffr.miximages.com/java/show_bug.cgi“); // commons-io.jar byte[] bytes = IOUtils.toByteArray(is); Ssortingng filenameHint = null; Ssortingng altText = null; int id1 = 0; int id2 = 1; org.docx4j.wml.P p = newImage( wordMLPackage, bytes,filenameHint, altText,id1, id2,6000 ); // Now add our p to the document wordMLPackage.getMainDocumentPart().addObject(p); wordMLPackage.save(new java.io.File(“helloworld.docx”) ); is.close(); } public static org.docx4j.wml.P newImage( WordprocessingMLPackage wordMLPackage, byte[] bytes, Ssortingng filenameHint, Ssortingng altText, int id1, int id2, long cx) throws Exception { BinaryPartAbstractImage imagePart = BinaryPartAbstractImage.createImagePart(wordMLPackage, bytes); Inline inline = imagePart.createImageInline(filenameHint, altText,id1, id2, cx,false); // Now add the inline in w:p/w:r/w:drawing org.docx4j.wml.ObjectFactory factory = new org.docx4j.wml.ObjectFactory(); org.docx4j.wml.P p = factory.createP(); org.docx4j.wml.R run = factory.createR(); p.getContent().add(run); org.docx4j.wml.Drawing drawing = factory.createDrawing(); run.getContent().add(drawing); drawing.getAnchorOrInline().add(inline); return p;

}

 @Pradeep Your code public static void main(Ssortingng[] args) throws Exception { WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage(); //wordMLPackage.getMainDocumentPart().addStyledParagraphOfText("Title", "Hello World"); //wordMLPackage.getMainDocumentPart().addParagraphOfText("Text"); java.io.InputStream is = new java.io.FileInputStream("path\\to\\images.jpg"); // commons-io.jar byte[] bytes = IOUtils.toByteArray(is); Ssortingng filenameHint = null; Ssortingng altText = null; int id1 = 0; int id2 = 1; org.docx4j.wml.P p = newImage( wordMLPackage, bytes,filenameHint, altText,id1, id2,6000 ); // Now add our p to the document wordMLPackage.getMainDocumentPart().addObject(p); wordMLPackage.save(new java.io.File("helloworld.docx") ); is.close(); } public static org.docx4j.wml.P newImage( WordprocessingMLPackage wordMLPackage, byte[] bytes, Ssortingng filenameHint, Ssortingng altText, int id1, int id2, long cx) throws Exception { BinaryPartAbstractImage imagePart = BinaryPartAbstractImage.createImagePart(wordMLPackage, bytes); Inline inline = imagePart.createImageInline(filenameHint, altText,id1, id2, cx,false); // Now add the inline in w:p/w:r/w:drawing org.docx4j.wml.ObjectFactory factory = new org.docx4j.wml.ObjectFactory(); org.docx4j.wml.P p = factory.createP(); org.docx4j.wml.R run = factory.createR(); p.getContent().add(run); org.docx4j.wml.Drawing drawing = factory.createDrawing(); run.getContent().add(drawing); drawing.getAnchorOrInline().add(inline); return p; works , but all the above codes does not work, i sortinged it personally thanks, a lot. 

Parce que XWPFRun.addPicture ne fonctionne pas (cela endommage le fichier xdoc), je parviens à afficher l’image suivante:

  private void addPicture(final Ssortingng fileName, final int id, int width, int height, final XWPFRun run) { FileInputStream fileInputStream = null; try { fileInputStream = new FileInputStream("/home/maq/ebworkspace/TeamForge_Tools/" + fileName); final Ssortingng blipId = run.getDocument().addPictureData(fileInputStream, Document.PICTURE_TYPE_JPEG); final int EMU = 9525; width *= EMU; height *= EMU; //Ssortingng blipId = getAllPictures().get(id).getPackageRelationship().getId(); final CTInline inline = run.getCTR().addNewDrawing().addNewInline(); final Ssortingng picXml = "" + "" + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + ""; //CTGraphicalObjectData graphicData = inline.addNewGraphic().addNewGraphicData(); XmlToken xmlToken = null; xmlToken = XmlToken.Factory.parse(picXml); inline.set(xmlToken); //graphicData.set(xmlToken); inline.setDistT(0); inline.setDistB(0); inline.setDistL(0); inline.setDistR(0); final CTPositiveSize2D extent = inline.addNewExtent(); extent.setCx(width); extent.setCy(height); final CTNonVisualDrawingProps docPr = inline.addNewDocPr(); docPr.setId(id); docPr.setName("Picture " + id); docPr.setDescr("Generated"); } catch (final Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { //close streams if (fileInputStream != null) { try { fileInputStream.close(); } catch (final IOException ioEx) { //can be ignored } } } } 

Et exemple courant:

  addPicture(filePath, xdoc.getNextPicNameNumber(Document.PICTURE_TYPE_JPEG), 100, 50, xRun);