天天看點

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

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

                                                    —— 使用xml 添加标題與副标題

在上一章節中我們嘗試了建立一個新的PPT檔案,并且在檔案中添加了一個新頁,在本章中我們将會了解到,如何在這些頁面中添加标題。

首先我們來看下面的圖檔

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

這是一個典型的PPT封面,接下來我們就要通過xml來向封面中的标題框内添加内容。代碼如下:

public static void main(String[] args) {

  try {

   // 加載一個ppt檔案作為模闆

   PresentationMLPackage presentationMLPackage = PresentationMLPackage

     .load(new File(PSMSConstants.REPORT_PPT2007_TEMPLATE_PATH));

   SlidePart slidePart = (SlidePart) presentationMLPackage.getParts()

     .getParts().get(new PartName("/ppt/slides/slide1.xml"));

   // 讀取XML生成形狀

   Shape title = (Shape) XmlUtils.unmarshalString(

     getSlideTitle("使用Docx4j操作PPT指南系列(二)"), Context.jcPML);

   // 注意,主标題與副标題的xml是不同的

   Shape subtitle = (Shape) XmlUtils.unmarshalString(

     getSubSlideTitle("使用xml 添加标題與副标題"), Context.jcPML);

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

     .getSpOrGrpSpOrGraphicFrame().add(title);

     .getSpOrGrpSpOrGraphicFrame().add(subtitle);

   String path = "c://test.pptx";

   presentationMLPackage.save(new java.io.File(path));

  } catch (Docx4JException e) {

   // TODO Auto-generated catch block

   e.printStackTrace();

  } catch (JAXBException e) {

  } catch (Exception e) {

  }

 }

/**

  * 生成标題

  * 

  * @param preset

  * @return

  */

 public static String getSlideTitle(String preset) {

    + "&lt;p:nvSpPr&gt;&lt;p:cNvPr id=\"2\" name=\"标題 1\"/&gt;"

    + "&lt;p:cNvSpPr&gt;&lt;a:spLocks noGrp=\"1\"/&gt;"

    + "&lt;/p:cNvSpPr&gt;&lt;p:nvPr&gt;&lt;p:ph type=\"title\"/&gt;"

    + "&lt;/p:nvPr&gt;&lt;/p:nvSpPr&gt;&lt;p:spPr/&gt;&lt;p:txBody&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: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:p&gt;"

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

 /**

  * 添加副标題

 public static String getSubSlideTitle(String preset) {

    + "&lt;p:nvSpPr&gt;&lt;p:cNvPr id=\"4\" name=\"副标題 3\"/&gt;"

    + "&lt;/p:cNvSpPr&gt;&lt;p:nvPr&gt;&lt;p:ph type=\"subTitle\" idx=\"1\"/&gt;"

    + "&lt;/p:nvPr&gt;&lt;/p:nvSpPr&gt;&lt;p:spPr/&gt;&lt;p:txBody&gt;&lt;a:bodyPr&gt;"

    + "&lt;a:normAutofit lnSpcReduction=\"10000\"/&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\" smtClean=\"0\"/&gt;"

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

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

Docx4j通過XmlUtils.unmarshalString方法為我們提供了xml轉換對象的功能,實際上這也是我們操作PPT的一種主要的方式。xml字元串可以通過将PPT另存為XML格式的檔案中擷取(ppt2007),大家可以多嘗試一下。值得注意的是,通過另存XML檔案擷取的字元串是不包括XML命名空間的,需要我們自己加上。

執行代碼最終的結果如下圖所示:

OK, 在這一章,我們學習了如何向PPT中添加标題與副标題,在下一章中我們将會學習如何在PPT頁中插入文本框以及其他的圖形元素,而且我們将會同時介紹XML方式與代碼兩種不同方式。

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