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]

Reply via email to