Insertar imagen en documento de Word

Esta es la primera vez que estoy trabajando en Apache POI y la pregunta que voy a hacer ya se ha hecho en este sitio, pero no se han recibido respuestas claras, así que no tengo más remedio que solicitar su ayuda.

Estoy tratando de escribir un progtwig Java que toma imágenes de una carpeta e inserta esa imagen en un documento de Word. Estoy usando Apache POI para este progtwig. Aquí estoy publicando mi código.

import java.io.*; import java.util.*; import org.apache.poi.util.IOUtils; import org.apache.poi.xwpf.usermodel.*; public class ImagesDoc { public static void main(String[] args) throws IOException { 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("C:\\Users\\amitabh\\Pictures\\pics\\pool.jpg"); byte [] picbytes = IOUtils.toByteArray(pic); docx.addPicture(picbytes, Document.PICTURE_TYPE_JPEG); FileOutputStream out = new FileOutputStream("C:\\Users\\amitabh\\Pictures\\pics\\simple1.docx"); docx.write(out); out.close(); pic.close(); } } 

Puedo crear el archivo de documento de Word y también puedo insertar el texto pero docx.addPicture(picbytes, Document.PICTURE_TYPE_JPEG); línea me está dando el error como “agregar conversión a docx”. He agregado todos los flasks posibles para este progtwig. Para este error, he buscado en toda la red y he descubierto que muchas personas tienen problemas similares. “addPicture” para referencia de XWPFDocument no funciona. Porfavor ayudame a resolver este problema.

Primero, me gustaría señalar el ejemplo proporcionado por apache poi – Link , es decir, la forma correcta de hacerlo sería

 doc.createParagraph().createRun().addPicture(new FileInputStream(imgFile), format, imgFile, Units.toEMU(200), Units.toEMU(200)); 

Sin embargo, todavía hay un error existente que hace que el archivo .docx sea ilegible después de ejecutar la statement anterior. Podría resolverse pronto, en cuyo caso la statement mencionada hará el trabajo. Mientras tanto, hay una solución alternativa.

Primero, genere el archivo docx sin ninguna imagen. A continuación, agregue esta clase CustomXWPFDocument a su paquete.

 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(String blipId,int id, int width, int height) { final int EMU = 9525; width *= EMU; height *= EMU; //String blipId = getAllPictures().get(id).getPackageRelationship().getId(); CTInline inline = createParagraph().createRun().getCTR().addNewDrawing().addNewInline(); String 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"); } } 

Luego, cree el documento actualizado agregando sus imágenes de esta manera:

 CustomXWPFDocument document = new CustomXWPFDocument(new FileInputStream(new File("C:\\Users\\Avarice\\Desktop\\doc1.docx"))); FileOutputStream fos = new FileOutputStream(new File("C:\\Users\\Avarice\\Desktop\\doc2.docx")); String id = document.addPictureData(new FileInputStream(new File("C:\\Users\\Avarice\\Desktop\\thumbnail.jpg")), Document.PICTURE_TYPE_JPEG); document.createPicture(id,document.getNextPicNameNumber(Document.PICTURE_TYPE_JPEG), 64, 64); document.write(fos); fos.flush(); fos.close(); 

También debe tener los siguientes jar en su ruta de comstackción:

poi-ooxml-schemas

xmlbeans

dom4j

  I have used poi 3.10 to generate word doc and to insert a picture. you need 2 classes.. here is the example import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.List; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.util.Units; import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy; import org.apache.poi.xwpf.usermodel.Document; import org.apache.poi.xwpf.usermodel.ParagraphAlignment; import org.apache.poi.xwpf.usermodel.UnderlinePatterns; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFHeader; import org.apache.poi.xwpf.usermodel.XWPFParagraph; import org.apache.poi.xwpf.usermodel.XWPFRun; import org.apache.xmlbeans.XmlException; import org.openxmlformats.schemas.wordprocessingml.x2006.main.*; public class ImageAttachmentInDocument { /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { DateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy"); Calendar cal = Calendar.getInstance(); String date = dateFormat.format(cal.getTime()); // Create a document file CustomXWPFDocument document = new CustomXWPFDocument(); // Adding a file try { // Working addPicture Code below... XWPFParagraph paragraphX = document.createParagraph(); paragraphX.setAlignment(ParagraphAlignment.CENTER); String blipId = paragraphX.getDocument().addPictureData( new FileInputStream(new File("D://c2//WLB.jpg")), Document.PICTURE_TYPE_JPEG); System.out.println("4" + blipId); System.out.println(document .getNextPicNameNumber(Document.PICTURE_TYPE_JPEG)); document.createPicture(blipId, document.getNextPicNameNumber(Document.PICTURE_TYPE_JPEG), 200, 75); System.out.println("5"); } catch (InvalidFormatException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } // insert doc details // Createa a para -1 XWPFParagraph paragraphOne = document.createParagraph(); paragraphOne.setAlignment(ParagraphAlignment.CENTER); XWPFRun paragraphOneRunOne = paragraphOne.createRun(); paragraphOneRunOne.setBold(true); paragraphOneRunOne.setFontSize(20); paragraphOneRunOne.setFontFamily("Verdana"); paragraphOneRunOne.setColor("000070"); paragraphOneRunOne.setText("Daily Status Report"); // Createa a para -2 XWPFParagraph paragraphTwo = document.createParagraph(); paragraphTwo.setAlignment(ParagraphAlignment.CENTER); XWPFRun paragraphTwoRunOne = paragraphTwo.createRun(); paragraphTwoRunOne.setFontSize(12); paragraphTwoRunOne.setFontFamily("Verdana"); paragraphTwoRunOne.setColor("000070"); paragraphTwoRunOne.setText(date); paragraphTwoRunOne.addBreak(); // Createa a para -3 XWPFParagraph paragraphThree = document.createParagraph(); paragraphThree.setAlignment(ParagraphAlignment.LEFT); XWPFRun paragraphThreeRunOne = paragraphThree.createRun(); paragraphThreeRunOne.setFontSize(14); paragraphThreeRunOne.setFontFamily("Verdana"); paragraphThreeRunOne.setColor("000070"); paragraphThreeRunOne.setText("5.30 AM PST"); paragraphThreeRunOne.addBreak(); // Createa a para -4 XWPFParagraph paragraphFour = document.createParagraph(); paragraphFour.setAlignment(ParagraphAlignment.LEFT); XWPFRun paragraphFourRunOne = paragraphFour.createRun(); paragraphFourRunOne.setBold(true); paragraphFourRunOne.setUnderline(UnderlinePatterns.SINGLE); paragraphFourRunOne.setFontSize(10); paragraphFourRunOne.setFontFamily("Verdana"); paragraphFourRunOne.setColor("000070"); paragraphFourRunOne.setText("ABCD"); // insert doc details end XWPFParagraph paragraphFive = document.createParagraph(); paragraphFive.setAlignment(ParagraphAlignment.RIGHT); XWPFRun paragraphFiveRunOne = paragraphFive.createRun(); paragraphFiveRunOne.addBreak(); paragraphFourRunOne.setBold(true); paragraphFourRunOne.setUnderline(UnderlinePatterns.SINGLE); paragraphFourRunOne.setFontSize(10); paragraphFourRunOne.setFontFamily("Verdana"); paragraphFourRunOne.setColor("000070"); paragraphFourRunOne.setText("ABCD00000000000"); FileOutputStream outStream = null; try { double x = Math.random(); String fileName = "D:\\c2\\" + String.valueOf(x) + ".docx"; outStream = new FileOutputStream(fileName); } catch (FileNotFoundException e) { System.out.println("First Catch"); e.printStackTrace(); } try { document.write(outStream); outStream.close(); } catch (FileNotFoundException e) { System.out.println("Second Catch"); e.printStackTrace(); } catch (IOException e) { System.out.println("Third Catch"); e.printStackTrace(); } } } 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() { super(); } public CustomXWPFDocument(InputStream in) throws IOException { super(in); } public void createPicture(String blipId,int id, int width, int height) { final int EMU = 9525; width *= EMU; height *= EMU; //String blipId = getAllPictures().get(id).getPackageRelationship().getId(); CTInline inline = createParagraph().createRun().getCTR().addNewDrawing().addNewInline(); String 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"); } }