当前位置: 首页 > 面试题库 >

使用POI XWPF将图像添加到Word .docx文档标题中

傅恺
2023-03-14
问题内容

我一直在尝试使用Apache POI将.png图片添加到.docx文件头中。我没有找到对我有帮助的方法。有人知道怎么做吗?这段代码我只能添加文本。

XWPFDocument docc = new XWPFDocument(); 
CTP ctpHeader = CTP.Factory.newInstance(); 
CTR ctrHeader = ctpHeader.addNewR(); 
CTText ctHeader = ctrHeader.addNewT(); 
String headerText = "mi encabezado"; 
ctHeader.setStringValue(headerText);

XWPFParagraph headerParagraph = new XWPFParagraph(ctpHeader, docc); XWPFParagraph[] parsHeader = new XWPFParagraph[1]; 
parsHeader[0] = headerParagraph; header.createHeader(XWPFHeaderFooterPolicy.DEFAULT, parsHeader);

问题答案:

Word使用页眉和页脚以及页眉中的图像创建文档的示例:

import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.IOException;

import org.apache.poi.util.Units;

import org.apache.poi.xwpf.usermodel.*;

import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy;

import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSectPr;

import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTabStop;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTabJc;

import java.math.BigInteger;

public class CreateWordHeaderFooter {

 public static void main(String[] args) throws Exception {

  XWPFDocument doc= new XWPFDocument();

  // the body content
  XWPFParagraph paragraph = doc.createParagraph();
  XWPFRun run=paragraph.createRun();  
  run.setText("The Body:");

  paragraph = doc.createParagraph();
  run=paragraph.createRun();  
  run.setText("Lorem ipsum....");

  // create header start
  CTSectPr sectPr = doc.getDocument().getBody().addNewSectPr();
  XWPFHeaderFooterPolicy headerFooterPolicy = new XWPFHeaderFooterPolicy(doc, sectPr);

  XWPFHeader header = headerFooterPolicy.createHeader(XWPFHeaderFooterPolicy.DEFAULT);

  paragraph = header.getParagraphArray(0);
  paragraph.setAlignment(ParagraphAlignment.LEFT);

  CTTabStop tabStop = paragraph.getCTP().getPPr().addNewTabs().addNewTab();
  tabStop.setVal(STTabJc.RIGHT);
  int twipsPerInch =  1440;
  tabStop.setPos(BigInteger.valueOf(6 * twipsPerInch));

  run = paragraph.createRun();  
  run.setText("The Header:");
  run.addTab();

  run = paragraph.createRun();  
  String imgFile="Koala.png";
  run.addPicture(new FileInputStream(imgFile), XWPFDocument.PICTURE_TYPE_PNG, imgFile, Units.toEMU(50), Units.toEMU(50));


  // create footer start
  XWPFFooter footer = headerFooterPolicy.createFooter(XWPFHeaderFooterPolicy.DEFAULT);

  paragraph = footer.getParagraphArray(0);
  paragraph.setAlignment(ParagraphAlignment.CENTER);

  run = paragraph.createRun();  
  run.setText("The Footer:");


  doc.write(new FileOutputStream("test.docx"));

 }
}

编辑2016年3月29日:

这一直有效,直到Apache poi 3.13。现在,在3.14版本中,它的工作方式不再更多。原因:POI将不再在标题段落中保存图像的blip参考。

/word/header1.xml

使用3.13编译并运行的代码:

...
<pic:blipFill><a:blip r:embed="rId1"/>
...

使用3.14编译并运行的相同代码:

...
<pic:blipFill><a:blip r:embed=""/>
...

编辑2016年3月31日:

找到了问题。有人认为public final PackageRelationship getPackageRelationship()需要弃用。因此在XWPFRun.java代码中public XWPFPicture addPicture(...)已更改

从3.13版开始:

...
            CTBlipFillProperties blipFill = pic.addNewBlipFill();
            CTBlip blip = blipFill.addNewBlip();
            blip.setEmbed(picData.getPackageRelationship().getId());
...

到版本3.14:

...
            CTBlipFillProperties blipFill = pic.addNewBlipFill();
            CTBlip blip = blipFill.addNewBlip();
            blip.setEmbed(parent.getDocument().getRelationId(picData));
...

parent.getDocument()就是XWPFDocument永远,而picData可能是关系到XWPFHeaderFooter

public XWPFPicture addPicture(...)程序员一开始就已经知道这一点。

...
        if (parent.getPart() instanceof XWPFHeaderFooter) {
            XWPFHeaderFooter headerFooter = (XWPFHeaderFooter)parent.getPart();
            relationId = headerFooter.addPictureData(pictureData, pictureType);
            picData = (XWPFPictureData) headerFooter.getRelationById(relationId);
        } else {
            XWPFDocument doc = parent.getDocument();
            relationId = doc.addPictureData(pictureData, pictureType);
            picData = (XWPFPictureData) doc.getRelationById(relationId);
        }
...

因此,如果确实应执行折旧,if..else则在设置blipID时也必须使用此折旧。但是为什么要贬值呢?

Apache POI 3.14版本 大声笑

import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.IOException;

import org.apache.poi.util.Units;

import org.apache.poi.xwpf.usermodel.*;

import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy;

import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSectPr;

import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTabStop;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTabJc;

import java.math.BigInteger;

public class CreateWordHeaderFooter {

 public static void main(String[] args) throws Exception {

  XWPFDocument doc= new XWPFDocument();

  // the body content
  XWPFParagraph paragraph = doc.createParagraph();
  XWPFRun run=paragraph.createRun();  
  run.setText("The Body:");

  paragraph = doc.createParagraph();
  run=paragraph.createRun();  
  run.setText("Lorem ipsum....");

  // create header start
  CTSectPr sectPr = doc.getDocument().getBody().addNewSectPr();
  XWPFHeaderFooterPolicy headerFooterPolicy = new XWPFHeaderFooterPolicy(doc, sectPr);

  XWPFHeader header = headerFooterPolicy.createHeader(XWPFHeaderFooterPolicy.DEFAULT);

  paragraph = header.getParagraphArray(0);
  paragraph.setAlignment(ParagraphAlignment.LEFT);

  CTTabStop tabStop = paragraph.getCTP().getPPr().addNewTabs().addNewTab();
  tabStop.setVal(STTabJc.RIGHT);
  int twipsPerInch =  1440;
  tabStop.setPos(BigInteger.valueOf(6 * twipsPerInch));

  run = paragraph.createRun();  
  run.setText("The Header:");
  run.addTab();

  run = paragraph.createRun();  
  String imgFile="Koala.png";
  XWPFPicture picture = run.addPicture(new FileInputStream(imgFile), XWPFDocument.PICTURE_TYPE_PNG, imgFile, Units.toEMU(50), Units.toEMU(50));
  System.out.println(picture); //XWPFPicture is added
  System.out.println(picture.getPictureData()); //but without access to XWPFPictureData (no blipID)

  String blipID = "";
  for(XWPFPictureData picturedata : header.getAllPackagePictures()) {
   blipID = header.getRelationId(picturedata);
   System.out.println(blipID); //the XWPFPictureData are already there
  }
  picture.getCTPicture().getBlipFill().getBlip().setEmbed(blipID); //now they have a blipID also
  System.out.println(picture.getPictureData());

  // create footer start
  XWPFFooter footer = headerFooterPolicy.createFooter(XWPFHeaderFooterPolicy.DEFAULT);

  paragraph = footer.getParagraphArray(0);
  paragraph.setAlignment(ParagraphAlignment.CENTER);

  run = paragraph.createRun();  
  run.setText("The Footer:");


  doc.write(new FileOutputStream("test.docx"));

 }
}

编辑2017年3月28日:

apache poi3.16 Beta 2版中,此问题似乎已解决,因为以下代码在apache poi3.16 Beta 2版中有效:

import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.IOException;

import org.apache.poi.util.Units;

import org.apache.poi.xwpf.usermodel.*;

import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy;

import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSectPr;

import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTabStop;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTabJc;

import java.math.BigInteger;

public class CreateWordHeaderFooter2 {

 public static void main(String[] args) throws Exception {

  XWPFDocument doc= new XWPFDocument();

  // the body content
  XWPFParagraph paragraph = doc.createParagraph();
  XWPFRun run=paragraph.createRun();  
  run.setText("The Body:");

  paragraph = doc.createParagraph();
  run=paragraph.createRun();  
  run.setText("Lorem ipsum....");

  // create header start
  CTSectPr sectPr = doc.getDocument().getBody().addNewSectPr();
  XWPFHeaderFooterPolicy headerFooterPolicy = new XWPFHeaderFooterPolicy(doc, sectPr);

  XWPFHeader header = headerFooterPolicy.createHeader(XWPFHeaderFooterPolicy.DEFAULT);

  paragraph = header.createParagraph();
  paragraph.setAlignment(ParagraphAlignment.LEFT);

  CTTabStop tabStop = paragraph.getCTP().getPPr().addNewTabs().addNewTab();
  tabStop.setVal(STTabJc.RIGHT);
  int twipsPerInch =  1440;
  tabStop.setPos(BigInteger.valueOf(6 * twipsPerInch));

  run = paragraph.createRun();  
  run.setText("The Header:");
  run.addTab();

  run = paragraph.createRun();  
  String imgFile="Koala.png";
  run.addPicture(new FileInputStream(imgFile), XWPFDocument.PICTURE_TYPE_PNG, imgFile, Units.toEMU(50), Units.toEMU(50));


  // create footer start
  XWPFFooter footer = headerFooterPolicy.createFooter(XWPFHeaderFooterPolicy.DEFAULT);

  paragraph = footer.createParagraph();
  paragraph.setAlignment(ParagraphAlignment.CENTER);

  run = paragraph.createRun();  
  run.setText("The Footer:");


  doc.write(new FileOutputStream("test.docx"));

 }
}


 类似资料:
  • 我正在使用Python FastAPI编写一些Rest API。需要在Swagger-OpenAPI文档中添加许多自定义部分。这包括每个API的联系信息字段、作者信息、显示数据模型的图像、数据库字段等。 有没有办法使用快速API内置的OpenAPI功能来完成所有这些工作?我知道可以托管我们自己的自定义 json 文件。但是我不知道如何将图像添加到招摇的json文件中。我也不知道如何将自定义字段添加

  • 我正在尝试使用Docx4j库将图像添加到Document(. docx),代码如下。该图像已经存在于本地机器中,最初我教它不支持png,然后我将图像重命名为jpg,但它仍然会引发错误 下面是错误消息。

  • 我不确定是有什么明显的东西逃过了我的视线,还是根本不可能,但我正试图用docker hub的图像组成一个完整的应用程序堆栈。 其中之一是mysql,它支持通过卷添加自定义配置文件并运行。装载目录中的sql文件。 但是,我在运行docker compose的机器上有这些文件,而不是在主机上。在运行entrypoint/cmd之前,是否无法指定要从本地计算机复制到容器中的文件?我真的需要为这种情况创建

  • 问题内容: 我想在标题栏中添加图像(小图标)。 我该怎么做? 问题答案: 由于没有标题栏,因此我假设您是指。话虽这么说,使用。 这是使用的示例。

  • 我想将图像添加到FastAPI自动留档(由Swagger UI提供),但我不知道如何做到这一点。这是代码: 正如您从代码中看到的那样,我正在尝试使用 URL 执行此操作,我在 ReDoc 和 Swagger UI 中得到的只是作为文本的 URL,而不是实际图像。另外,我想使用存储在本地驱动器中的图像。 我如何才能做到这一点? 先谢谢你。

  • 我正在尝试添加一个背景图像到标题在一个Squarespace网站我正在工作。我成功地使用了他们论坛中建议的以下代码: 然而,它只覆盖主导航区域,而不是整个头部区域。我希望它看起来像这样: 然而,在这个示例页面中,它看起来是这样的,我将代码添加到: https://matthew-kern-drzz.squarespace.com/paints-new 有人有解决办法吗? 干杯, M. 附注。我只是