gpt4 book ai didi

java - 在 Java 中设置 pptx 主题

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:26:24 24 4
gpt4 key购买 nike

我正在尝试使用 java 以编程方式合并一些 pptx 文档。我想出了如何使用 Apache POI 从本质上做到这一点,但我尝试合并的文档不起作用。

经过大量搜索和反复试验后,我发现这是因为 pptx 文档没有主题信息(即,如果我单击 powerpoint 并检查幻灯片母版 View ,它是空白的)。如果我转到设计功能区中的主题并选择“办公室主题”或其他主题,然后保存。这些文件将迷人地合并。否则,我会遇到以下错误:

Exception in thread "main" java.lang.IllegalArgumentException: Failed to fetch default style for otherStyle and level=0
at org.apache.poi.xslf.usermodel.XSLFTextParagraph.getDefaultMasterStyle(XSLFTextParagraph.java:1005)
at org.apache.poi.xslf.usermodel.XSLFTextParagraph.fetchParagraphProperty(XSLFTextParagraph.java:1029)
at org.apache.poi.xslf.usermodel.XSLFTextParagraph.isBullet(XSLFTextParagraph.java:654)
at org.apache.poi.xslf.usermodel.XSLFTextParagraph.copy(XSLFTextParagraph.java:1044)
at org.apache.poi.xslf.usermodel.XSLFTextShape.copy(XSLFTextShape.java:631)
at org.apache.poi.xslf.usermodel.XSLFSheet.appendContent(XSLFSheet.java:358)
at com.apsiva.main.Snippet.main(Snippet.java:28)

下面是我运行的代码:

package com.apsiva.main;

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

import org.apache.poi.xslf.usermodel.SlideLayout;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFSlide;
import org.apache.poi.xslf.usermodel.XSLFSlideLayout;

public class Snippet {
/** Merge the pptx files in the array <decks> to the desired destination
* chosen in <outputPath> */
public static void main(String[] args) {
try {
FileInputStream empty = new FileInputStream("C:/Users/Alex/workspace/OutputWorker/tmp/base2.pptx");
XMLSlideShow pptx;

pptx = new XMLSlideShow(empty);
XSLFSlideLayout defaultLayout = pptx.getSlideMasters()[0].getLayout(SlideLayout.TITLE_AND_CONTENT);

FileInputStream is = new FileInputStream("C:/Users/Alex/workspace/OutputWorker/tmp/noWork.pptx");
// FileInputStream is = new FileInputStream("C:/Users/Alex/workspace/OutputWorker/tmp/works2.pptx");
XMLSlideShow src = new XMLSlideShow(is);
is.close();
for (XSLFSlide srcSlide: src.getSlides()){
pptx.createSlide(defaultLayout).appendContent(srcSlide);
}
FileOutputStream out = new FileOutputStream("C:/POI-TEST-OUTPUT.pptx");
pptx.write(out);
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

我想让这些文件合并,我相信解决方案是以编程方式将主题分配给文件。怎么做到的?

感谢您的考虑!

最佳答案

在某些情况下,当您生成 pptx 文件(例如 JasperReport exports)时,可能会为不同的字段添加一些无效值。例如行间距,可以是百分比,和特殊字符,而 apache poi xslf 不知道如何处理这些值。打开文件时,PowerPoint 会自动将这些值调整为有效值。使用 apache poi 时,您必须单独识别这些字段并手动调整它们。我有一个类似的问题,但有行间距,并通过设置每个段落的值来解决这个问题:

List<XSLFShape> shapes = srcSlide.getShapes();                
for (XSLFShape xslfShape: shapes) {
if (xslfShape instanceof XSLFTextShape){
List<XSLFTextParagraph> textParagraphs = ((XSLFTextShape) xslfShape).getTextParagraphs();
for (XSLFTextParagraph textParagraph: textParagraphs) {
textParagraph.setLineSpacing(10d);
}
}
}

这就像一个魅力。

更有效的方法是直接在 XML 对象上执行:

 List<CTShape> ctShapes = srcSlide.getXmlObject().getCSld().getSpTree().getSpList();
for (CTShape ctShape : ctShapes) {
List<CTTextParagraph> ctTextParagraphs = ctShape.getTxBody().getPList();
for (CTTextParagraph paragraph : ctTextParagraphs) {
if (paragraph.getPPr().getLnSpc() != null) {
paragraph.getPPr().unsetLnSpc();
}
}
}

关于java - 在 Java 中设置 pptx 主题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19327041/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com