使用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) {
+ "<p:nvSpPr><p:cNvPr id=\"5\" name=\"TextBox 4\"/><p:cNvSpPr txBox=\"1\"/><p:nvPr/></p:nvSpPr>"
+ "<p:spPr><a:xfrm><a:off x=\""
+ x
+ "\" y=\""
+ y
+ "\"/><a:ext cx=\""
+ cx
+ "\" cy=\""
+ cy
+ "\"/>"
+ "</a:xfrm><a:prstGeom prst=\"rect\"><a:avLst/></a:prstGeom><a:noFill/></p:spPr><p:txBody>"
+ "<a:bodyPr wrap=\"square\" rtlCol=\"0\"><a:spAutoFit/></a:bodyPr><a:lstStyle/><a:p>"
+ "<a:r><a:rPr lang=\"en-US\" altLang=\"zh-CN\" dirty=\"0\" err=\"1\" smtClean=\"0\">"
+ "<a:latin typeface=\"微軟雅黑\" pitchFamily=\"34\" charset=\"-122\"/>"
+ "<a:ea typeface=\"微軟雅黑\" pitchFamily=\"34\" charset=\"-122\"/>"
+ "</a:rPr><a:t>"
+ preset
+ "</a:t></a:r>"
+ "<a:endParaRPr lang=\"zh-CN\" altLang=\"en-US\" dirty=\"0\">"
+ "<a:ea typeface=\"微軟雅黑\" pitchFamily=\"34\" charset=\"-122\"/></a:endParaRPr>"
+ "</a:p></p:txBody></p:sp>";
通過上面的代碼,我們就可以得到如圖中的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中加黑的部分
"<p:nvSpPr><p:cNvPr id=\"5\" name=\"TextBox 4\"/><p:cNvSpPr txBox=\"1\"/><p:nvPr/></p:nvSpPr>"
OK,以上是這一部分的全部内容,在下一章中我們将學習如何在PPT中插入一張圖檔。
本文轉自william_xu 51CTO部落格,原文連結:http://blog.51cto.com/williamx/769277,如需轉載請自行聯系原作者