当前位置: 首页 > 知识库问答 >
问题:

如何通过阿帕奇POI将文本轮廓添加到PowerPoint中的文本:

欧阳勇军
2023-03-14

有没有人知道如何使用Apache POI在powerpoint模板(ppxt)中为文本(文本大纲)添加大纲?到目前为止,我收集到的是XSLFTextRun类没有方法来获取/设置给定run元素的文本大纲。

因此,我只能保留以下字体/文本样式:

def fontStyles(textBox: XSLFTextBox, textRun: XSLFTextRun): Unit = {
    val fontFamily = textRun.getFontFamily
    val fontColor = textRun.getFontColor
    val fontSize = textRun.getFontSize
    val fontBold = textRun.isBold
    val fontItalic = textRun.isItalic
    val textAlign = textRun.getParagraph.getTextAlign

    textBox.getTextParagraphs.foreach { p =>
      p.getTextRuns.foreach { tr =>
        tr.setFontFamily(fontFamily)
        tr.setFontColor(fontColor)
        tr.setFontSize(fontSize)
        tr.setBold(fontBold)
        tr.setItalic(fontItalic)
        tr.getParagraph.setTextAlign(textAlign)
      }
    }
  }

可以添加文字大纲吗?

任何帮助/建议将不胜感激。

共有1个答案

吕扬
2023-03-14

Apache poi使用底层的ooxml-Schemas类。这些是根据Office Open XML标准自动生成的。所以它们比高级XSLF类更完整。当然它们不太方便。

因此,如果在高级<code>XSLF</code>类中没有实现某些功能,我们可以获取底层<code>CT</code>类并使用它们来实现。在<code>XSLFTextRun</code>的情况下,我们可以获得<code>CTRegularTextRun对象。然后我们可以查看是否已经存在运行属性。如果没有,我们添加一个。然后我们看看是否已经有了大纲集。如果是这样,我们将其取消设置,因为我们希望将其设置为新的。然后我们设定了一个新的大纲。这只是一条有特殊颜色的线。该行由CTLineProperties对象表示。因此,我们需要有方法来创建CTLineProperties,将CTLineProperties设置为 ,并从

使用< code>Java代码的完整示例:

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

import org.apache.poi.xslf.usermodel.*;
import org.apache.poi.sl.usermodel.*;

import java.awt.Rectangle;

public class PPTXTextRunOutline {
    
 static org.openxmlformats.schemas.drawingml.x2006.main.CTLineProperties createSolidFillLineProperties(java.awt.Color color) {
  // create new CTLineProperties
  org.openxmlformats.schemas.drawingml.x2006.main.CTLineProperties lineProperties 
   = org.openxmlformats.schemas.drawingml.x2006.main.CTLineProperties.Factory.newInstance();
  // set line solid fill color
  lineProperties.addNewSolidFill().addNewSrgbClr().setVal(new byte[]{(byte)color.getRed(), (byte)color.getGreen(), (byte)color.getBlue()});
  return lineProperties;
 }
    
 static void setOutline(XSLFTextRun run, org.openxmlformats.schemas.drawingml.x2006.main.CTLineProperties lineProperties) {
  // get underlying CTRegularTextRun object
  org.openxmlformats.schemas.drawingml.x2006.main.CTRegularTextRun ctRegularTextRun 
   = (org.openxmlformats.schemas.drawingml.x2006.main.CTRegularTextRun)run.getXmlObject();
  // Are there run properties already? If not, add one.
  if (ctRegularTextRun.getRPr() == null) ctRegularTextRun.addNewRPr();
  // Is there outline set already? If so, unset it, because we are creating it new.
  if (ctRegularTextRun.getRPr().isSetLn()) ctRegularTextRun.getRPr().unsetLn();
  // set a new outline
  ctRegularTextRun.getRPr().setLn(lineProperties);  
 }
 
  static org.openxmlformats.schemas.drawingml.x2006.main.CTLineProperties getOutline(XSLFTextRun run) {
  // get underlying CTRegularTextRun object
  org.openxmlformats.schemas.drawingml.x2006.main.CTRegularTextRun ctRegularTextRun 
   = (org.openxmlformats.schemas.drawingml.x2006.main.CTRegularTextRun)run.getXmlObject();
  // Are there run properties already? If not, return null.
  if (ctRegularTextRun.getRPr() == null) return null;
  // get outline, may be null
  org.openxmlformats.schemas.drawingml.x2006.main.CTLineProperties lineProperties = ctRegularTextRun.getRPr().getLn();
  // make a copy to avoid orphaned exceptions or value disconnected exception when set to its own XML parent
  if (lineProperties != null) lineProperties = (org.openxmlformats.schemas.drawingml.x2006.main.CTLineProperties)lineProperties.copy();
  return lineProperties;
 }

 // your method fontStyles taken to Java code
 static void fontStyles(XSLFTextRun templateRun, XSLFTextShape textShape) {
  String fontFamily = templateRun.getFontFamily();
  PaintStyle fontColor = templateRun.getFontColor();
  Double fontSize = templateRun.getFontSize();
  boolean fontBold = templateRun.isBold();
  boolean fontItalic = templateRun.isItalic();
  TextParagraph.TextAlign textAlign = templateRun.getParagraph().getTextAlign();
  org.openxmlformats.schemas.drawingml.x2006.main.CTLineProperties lineProperties = getOutline(templateRun);
  for (XSLFTextParagraph paragraph : textShape.getTextParagraphs()) {
   for (XSLFTextRun run : paragraph.getTextRuns()) {
    run.setFontFamily(fontFamily);
    if(run != templateRun) run.setFontColor(fontColor); // set PaintStyle has the issue which I am avoiding by using a copy of the underlying XML
    run.setFontSize(fontSize);
    run.setBold(fontBold);
    run.setItalic(fontItalic);
    run.getParagraph().setTextAlign(textAlign);
       
    setOutline(run, lineProperties);
   }
  }   
 }

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

  XMLSlideShow slideShow = new XMLSlideShow(new FileInputStream("./PPTXIn.pptx"));

  XSLFSlide slide = slideShow.getSlides().get(0);
  
  //as in your code, get a template text run and set its font style to all other runs in text shape
  if (slide.getShapes().size() > 0) {
   XSLFShape shape = slide.getShapes().get(0); 
   if (shape instanceof XSLFTextShape) {
    XSLFTextShape textShape = (XSLFTextShape) shape;
    XSLFTextParagraph paragraph = null;
    if(textShape.getTextParagraphs().size() > 0) paragraph = textShape.getTextParagraphs().get(0);
    if (paragraph != null) {
     XSLFTextRun run = null;
     if(paragraph.getTextRuns().size() > 0) run = paragraph.getTextRuns().get(0);
     if (run != null) {
      fontStyles(run, textShape);  
     }
    }        
   }
  }

  //new text box having outlined text from scratch
  XSLFTextBox textbox = slide.createTextBox(); 
  textbox.setAnchor(new Rectangle(100, 300, 570, 80));
  XSLFTextParagraph paragraph = null;
  if(textbox.getTextParagraphs().size() > 0) paragraph = textbox.getTextParagraphs().get(0);
  if(paragraph == null) paragraph = textbox.addNewTextParagraph(); 
  XSLFTextRun run = paragraph.addNewTextRun();
  run.setText("Test text outline");
  run.setFontSize(60d);
  run.setFontColor(java.awt.Color.YELLOW);
  setOutline(run, createSolidFillLineProperties(java.awt.Color.BLUE));
  
  FileOutputStream out = new FileOutputStream("./PPTXOit.pptx");
  slideShow.write(out);
  out.close();
 }
}

已测试并使用当前apache poi 5.0.0工作。

 类似资料:
  • 我想将现有的excel-table添加到幻灯片中。使用成功地将excel-file添加到表示中。现在我想用下面的xml代码将它添加到幻灯片中... ...使用下面几行Java代码:

  • 我创建了此代码以使用Apache POI读取excel文件的内容。我使用eclipse作为编辑器,但当我运行代码时,我的粗体行出现问题。有什么问题?excel的内容如下:

  • 有没有一种蜡染兼容的方法可以用SVG做自动文本换行? 我在网上找遍了,找不到确切的东西与HTML不兼容。我看到和朋友应该可以工作,但我似乎无法让他们正常工作。我也找不到一个确切有效的例子。 一个有效的 SVG 示例将不胜感激。

  • 我们需要的是直接的API来设置和使用集群消息队列。我们最初的计划是使用Camel在集群JMS或ActiveMQ队列上进行消费/生产。Kafka如何使这项任务变得更容易?在任何一种情况下,应用程序本身都将在WebLogic服务器上运行。 消息传递将是点对点类型,其中有多个相同服务的实例在运行,但根据负载平衡策略,只有一个实例应该处理消息并发出结果。消息队列也是群集的,因此服务实例或队列实例的失败都不

  • 如何通过ApachePOI或其他java框架将背景图像添加到docx文档中。我想在这样的结果文档中有一些xml块,其中定义了背景

  • Apache Kafka:分布式消息传递系统 Apache Storm:实时消息处理 我们如何在实时数据管道中使用这两种技术来处理事件数据? 在实时数据管道方面,我觉得两者做的工作是一样的。如何在数据管道上同时使用这两种技术?