天天看點

使用Docx4j操作PPT指南系列(三)

使用Docx4j操作PPT指南系列(三)

                                                     —— 添加文本框與其他圖形元素

上一章介紹了如何使用Docx4j向PPT中添加标題元素,本章我們來嘗試向PPT中加入文本框與其他的圖形元素,與上一章不同,本章中将會增加“使用代碼建立圖形元素”的部分。

還是先來看一頁PPT:

<a href="http://blog.51cto.com/attachment/201201/100232808.png" target="_blank"></a>

我們接下來将會在紅框的位置添加一個文本框,并在文本框中增加“插入一個文本框 ”這樣一段文字。

先使用Xml方式插入:

 private final int tTextAyX = 539552;

 private final int tTextAyY = 1556792;

 private final int tTextAyCX = 8064896;

 private final int tTextAyCY = 396332;

private void createStChartSlide(

   PresentationMLPackage presentationMLPackage,

   String title) {

  String partTitle = title;

  String partName = "/ppt/slides/" + getRandomID()+ ".xml";

  SlidePart slidePart = createCommonSlide(presentationMLPackage,

    partTitle, partName);

  Shape descShape;

  try {

   descShape = (Shape) XmlUtils.unmarshalString(

     getTextArea("插入一個文本框",tTextAyX, tTextAyY,

       tTextAyCX, tTextAyCY), Context.jcPML);

   ((Sld) slidePart.getJaxbElement()).getCSld().getSpTree()

     .getSpOrGrpSpOrGraphicFrame().add(descShape);

  } catch (JAXBException e1) {

   e1.printStackTrace();

  }

 }

 private String getRandomID(){

  return Math.abs(ran.nextInt()) +"";

/**

  * 建立一頁

  * 

  * @param presentationMLPackage

  * @param title

  * @param partName

  * @return

  */

 private SlidePart createCommonSlide(

   PresentationMLPackage presentationMLPackage, String title,

   String partName) {

  MainPresentationPart mainPart = presentationMLPackage

    .getMainPresentationPart();

  SlideLayoutPart layoutPart;

   layoutPart = (SlideLayoutPart) presentationMLPackage.getParts()

     .getParts()

     .get(new PartName("/ppt/slideLayouts/slideLayout2.xml"));

   SlidePart slidePart = PresentationMLPackage.createSlidePart(

     mainPart, layoutPart, new PartName(partName));

   Shape titleShape = (Shape) XmlUtils.unmarshalString(

     getSlideTitle(title), Context.jcPML);

     .getSpOrGrpSpOrGraphicFrame().add(titleShape);

   return slidePart;

  } catch (InvalidFormatException e) {

   e.printStackTrace();

  } catch (JAXBException e) {

   // TODO Auto-generated catch block

  return null;

  * @param preset

  * @param x

  * @param y

  * @param cx

  * @param cy

 private String getTextArea(String preset, int x, int y, int cx, int cy) {

    + "&lt;p:nvSpPr&gt;&lt;p:cNvPr id=\"5\" name=\"TextBox 4\"/&gt;&lt;p:cNvSpPr txBox=\"1\"/&gt;&lt;p:nvPr/&gt;&lt;/p:nvSpPr&gt;"

    + "&lt;p:spPr&gt;&lt;a:xfrm&gt;&lt;a:off x=\""

    + x

    + "\" y=\""

    + y

    + "\"/&gt;&lt;a:ext cx=\""

    + cx

    + "\" cy=\""

    + cy

    + "\"/&gt;"

    + "&lt;/a:xfrm&gt;&lt;a:prstGeom prst=\"rect\"&gt;&lt;a:avLst/&gt;&lt;/a:prstGeom&gt;&lt;a:noFill/&gt;&lt;/p:spPr&gt;&lt;p:txBody&gt;"

    + "&lt;a:bodyPr wrap=\"square\" rtlCol=\"0\"&gt;&lt;a:spAutoFit/&gt;&lt;/a:bodyPr&gt;&lt;a:lstStyle/&gt;&lt;a:p&gt;"

    + "&lt;a:r&gt;&lt;a:rPr lang=\"en-US\" altLang=\"zh-CN\" dirty=\"0\" err=\"1\" smtClean=\"0\"&gt;"

    + "&lt;a:latin typeface=\"微軟雅黑\" pitchFamily=\"34\" charset=\"-122\"/&gt;"

    + "&lt;a:ea typeface=\"微軟雅黑\" pitchFamily=\"34\" charset=\"-122\"/&gt;"

    + "&lt;/a:rPr&gt;&lt;a:t&gt;"

    + preset

    + "&lt;/a:t&gt;&lt;/a:r&gt;"

    + "&lt;a:endParaRPr lang=\"zh-CN\" altLang=\"en-US\" dirty=\"0\"&gt;"

    + "&lt;a:ea typeface=\"微軟雅黑\" pitchFamily=\"34\" charset=\"-122\"/&gt;&lt;/a:endParaRPr&gt;"

    + "&lt;/a:p&gt;&lt;/p:txBody&gt;&lt;/p:sp&gt;";

通過上面的代碼,我們就可以得到如圖中的PPT頁。如果我們不想采用XML方式的話,Docx4j還支援使用代碼方式插入,代碼相對複雜一些,但不難了解(完全符合Microsoft OOXml的結構),我們隻需要将上面生成Shape部分的代碼替換為下面的代碼即可:

private void createShape(SlidePart slidePart, String value) {

  Shape shape = graphicObjectFactory.createShape();

  NvSpPr nvSpPr = graphicObjectFactory.createShapeNvSpPr();

  CTNonVisualDrawingProps cnvpr = objectFactory

    .createCTNonVisualDrawingProps();

  cnvpr.setId(1);

  nvSpPr.setCNvPr(cnvpr);

  nvSpPr.setCNvSpPr(objectFactory.createCTNonVisualDrawingShapeProps());

  nvSpPr.setNvPr(graphicObjectFactory.createNvPr());

  shape.setNvSpPr(nvSpPr);

  CTShapeProperties ctShapePr = objectFactory.createCTShapeProperties();

  CTTransform2D ctTransform2D = objectFactory.createCTTransform2D();

  CTPoint2D ctPoint2D = objectFactory.createCTPoint2D();

  CTPositiveSize2D ctPositiveSize2D = objectFactory

    .createCTPositiveSize2D();

  ctTransform2D.setOff(ctPoint2D);

  ctTransform2D.setExt(ctPositiveSize2D);

  ctShapePr.setXfrm(ctTransform2D);

  CTPresetGeometry2D ctPresetGeometry2D = objectFactory

    .createCTPresetGeometry2D();

  ctPresetGeometry2D.setPrst(STShapeType.RECT);

  ctPresetGeometry2D.setAvLst(objectFactory.createCTGeomGuideList());

  ctShapePr.setPrstGeom(ctPresetGeometry2D);

  ctShapePr.setNoFill(objectFactory.createCTNoFillProperties());

  CTTextBody txBody = objectFactory.createCTTextBody();

  CTTextBodyProperties bodyPr = objectFactory

    .createCTTextBodyProperties();

  bodyPr.setWrap(STTextWrappingType.SQUARE);

  bodyPr.setRtlCol(false);

  bodyPr.setSpAutoFit(objectFactory.createCTTextShapeAutofit());

  txBody.setBodyPr(bodyPr);

  txBody.setLstStyle(objectFactory.createCTTextListStyle());

  CTTextParagraph ctTextPr = objectFactory.createCTTextParagraph();

  CTRegularTextRun run = objectFactory.createCTRegularTextRun();

  CTTextCharacterProperties ctTpr = objectFactory

    .createCTTextCharacterProperties();

  // 14号字型

  ctTpr.setSz(1400);

  TextFont font = objectFactory.createTextFont();

  font.setTypeface("微軟雅黑");

  ctTpr.setLatin(font);

  ctTpr.setEa(font);

  run.setRPr(ctTpr);

  // 設定内容

  run.setT(value);

  ctTextPr.getEGTextRun().add(run);

  ctTextPr.setEndParaRPr(objectFactory.createCTTextCharacterProperties());

  txBody.getP().add(ctTextPr);

  shape.setTxBody(txBody);

  shape.setSpPr(ctShapePr);

其他圖形元素的操作方式與文本框基本一緻,在XML中加黑的部分

"&lt;p:nvSpPr&gt;&lt;p:cNvPr id=\"5\" name=\"TextBox 4\"/&gt;&lt;p:cNvSpPr txBox=\"1\"/&gt;&lt;p:nvPr/&gt;&lt;/p:nvSpPr&gt;"

OK,以上是這一部分的全部内容,在下一章中我們将學習如何在PPT中插入一張圖檔。

本文轉自william_xu 51CTO部落格,原文連結:http://blog.51cto.com/williamx/769277,如需轉載請自行聯系原作者