sascha08-15 opened a new issue, #919:
URL: 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.xslf.usermodel.*;
   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.
           }
       }
   }
   ```


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to