https://bz.apache.org/bugzilla/show_bug.cgi?id=69855
Bug ID: 69855
Summary: BUG: Shape with empty paragraph & textrun generates
invalid XML
Product: POI
Version: unspecified
Hardware: PC
OS: Mac OS X 10.1
Status: NEW
Severity: normal
Priority: P2
Component: XSLF
Assignee: [email protected]
Reporter: [email protected]
Target Milestone: ---
See also: https://github.com/apache/poi/issues/919
POI creates invalid pptx files if we call .clearText and do not create a
paragraph and textrun in it. The later is the workaround; however, this IS a
bug.
Test to reproduce below, just open the created file in PowerPoint (on Mac) it
will complain about invalid xml.
import org.apache.poi.sl.usermodel.ShapeType;
import org.junit.jupiter.api.Test;
import java.awt.geom.Rectangle2D;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import static org.junit.jupiter.api.Assertions.*;
public class PoiClearTextPptxTest {
@Test
public void
createShapeClearTextAndSave_pptxShouldBeReportedInvalidByPowerPoint() throws
Exception {
// create a new presentation
try (XMLSlideShow ppt = new XMLSlideShow()) {
// create a slide
XSLFSlide slide = ppt.createSlide();
// create a rectangle auto-shape and position it
XSLFAutoShape rect = slide.createAutoShape();
rect.setShapeType(ShapeType.RECT);
rect.setAnchor(new Rectangle2D.Double(100, 100, 400, 120));
// add text to the shape
XSLFTextParagraph p = rect.addNewTextParagraph();
XSLFTextRun run = p.addNewTextRun();
run.setText("This is a test text that will be cleared.");
// sanity-check text is present
assertTrue(rect.getText().contains("This is a test text"));
// THIS IS THE KEY CALL: remove all text content from the shape
rect.clearText();
// After clearText(), POI leaves the shape without text
runs/paragraphs in its model.
// That can produce a PPTX that PowerPoint flags as "needs repair"
/ invalid.
// write to a temporary file
Path out = Files.createTempFile("poi-cleartext-repro-", ".pptx");
try (FileOutputStream fos = new FileOutputStream(out.toFile())) {
ppt.write(fos);
}
// Basic checks
assertTrue(Files.exists(out));
assertTrue(Files.size(out) > 0);
System.out.println("Wrote test file to: " + out.toAbsolutePath());
// Optional: try to re-open with POI (may succeed even if
PowerPoint complains)
try (FileInputStream fis = new FileInputStream(out.toFile());
XMLSlideShow reopened = new XMLSlideShow(fis)) {
// inspect shapes for missing text bodies
boolean foundTextShape = false;
for (XSLFShape s : reopened.getSlides().get(0).getShapes()) {
if (s instanceof XSLFTextShape) {
foundTextShape = true;
XSLFTextShape ts = (XSLFTextShape) s;
// after clearText(), paragraphs/runs often are empty
System.out.println("Reopened shape text (may be empty):
'" + ts.getText() + "'");
}
}
assertTrue(foundTextShape, "We expected at least one text shape
on the slide");
}
// Note: open the printed file path in MS PowerPoint to reproduce
the "invalid" report.
}
}
}
--
You are receiving this mail because:
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]