https://bz.apache.org/bugzilla/show_bug.cgi?id=69522

            Bug ID: 69522
           Summary: XmlComplexContentImpl cannot be cast to
                    CTPath2DQuadBezierTo
           Product: POI
           Version: 5.3.0-FINAL
          Hardware: PC
            Status: NEW
          Severity: blocker
          Priority: P2
         Component: XSLF
          Assignee: dev@poi.apache.org
          Reporter: yudal...@ucas.edu.cn
  Target Milestone: ---

Created attachment 39963
  --> https://bz.apache.org/bugzilla/attachment.cgi?id=39963&action=edit
The reproduce class

This is a blocker problem for user can NOT use the export functionality.

Call me if need any other staffs.

# The error output:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException:
org.apache.xmlbeans.impl.values.XmlComplexContentImpl cannot be cast to
org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DQuadBezierTo
        at
org.openxmlformats.schemas.drawingml.x2006.main.impl.CTPath2DImpl.addNewQuadBezTo(CTPath2DImpl.java:555)
        at
org.apache.poi.xslf.usermodel.XSLFFreeformShape.addQuadBezierTo(XSLFFreeformShape.java:204)
        at
org.apache.poi.xslf.usermodel.XSLFFreeformShape.setPath(XSLFFreeformShape.java:90)
        at org.apache.poi.sl.draw.SLGraphics.fill(SLGraphics.java:330)
        at
poi.test.general.path.TriangleDrawingExample$TrianglePanel.drawShape(TriangleDrawingExample.java:94)
        at
poi.test.general.path.TriangleDrawingExample$TrianglePanel.paintComponent(TriangleDrawingExample.java:49)
        at javax.swing.JComponent.paint(JComponent.java:1050)
        at
poi.test.general.path.TriangleDrawingExample.lambda$0(TriangleDrawingExample.java:125)

# how to reproduce the problem

So see the attachment.

package poi.test.general.path;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Arc2D;
import java.awt.geom.GeneralPath;
import java.awt.geom.Point2D;
import java.awt.geom.QuadCurve2D;
import java.awt.geom.Rectangle2D;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

import org.apache.poi.sl.draw.SLGraphics;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFGroupShape;
import org.apache.poi.xslf.usermodel.XSLFSlide;

public class TriangleDrawingExample extends JFrame {

        TrianglePanel comp = new TrianglePanel();

        public TriangleDrawingExample() {
                // 设置 JFrame 的标题
                setTitle("Triangle Drawing Example");
                // 设置 JFrame 的大小
                setSize(400, 400);
                // 设置 JFrame 的关闭操作
                setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                // 将自定义面板添加到 JFrame

                add(comp);
                // 设置 JFrame 可见
                setVisible(true);
        }

        // 自定义 JPanel 用于绘制三角形
        class TrianglePanel extends JPanel {
                @Override
                protected void paintComponent(Graphics g) {
                        super.paintComponent(g);
                        Graphics2D g2d = (Graphics2D) g;
                        g2d.setColor(Color.BLUE);
                        drawShape(g2d);
                }

                private void drawShape(Graphics2D g2d) {

                        int centerX = getWidth() / 2;
                        int centerY = getHeight() / 2;
                        int innerRadius = 50;
                        int sourceStartAngle = 0;
                        int targetStartAngle = 100;
                        int targetEndAngle = 145;
                        int sourceEndAngle = 40;
                        Point2D.Double sourceEndPoint = new Point2D.Double(0,
0);
                        Point2D.Double sourceStartPoint = new Point2D.Double(0,
0);
                        Point2D.Double targetStartPoint = new
Point2D.Double(getWidth(), getHeight());
                        Point2D.Double targetEndPoint = new
Point2D.Double(getWidth(), getHeight());

                        GeneralPath path = new GeneralPath();

                        {

                                Arc2D arc2 = new Arc2D.Double(centerX -
innerRadius, centerY - innerRadius, 2 * innerRadius,
                                                2 * innerRadius,
sourceStartAngle, sourceEndAngle - sourceStartAngle, Arc2D.OPEN);
                                path.append(arc2, true);

                                QuadCurve2D chord = new
QuadCurve2D.Double(sourceEndPoint.getX(), sourceEndPoint.getY(), centerX,
                                                centerY,
targetStartPoint.getX(), targetStartPoint.getY());

                                path.append(chord, true);

                        }
                        {
                                Arc2D arc2 = new Arc2D.Double(centerX -
innerRadius, centerY - innerRadius, 2 * innerRadius,
                                                2 * innerRadius,
targetStartAngle, targetEndAngle - targetStartAngle, Arc2D.OPEN);

                                path.append(arc2, true);

                                QuadCurve2D chord = new
QuadCurve2D.Double(targetEndPoint.getX(), targetEndPoint.getY(), centerX,
                                                centerY,
sourceStartPoint.getX(), sourceStartPoint.getY());
                                path.append(chord, true);

                        }
                        path.closePath();

                        g2d.setColor(Color.BLACK);
                        g2d.fill(path);

                }
        }

        public static void main(String[] args) {
                // 创建并运行 JFrame 实例
                Runnable doRun = () -> {
                        TriangleDrawingExample triangleDrawingExample = new
TriangleDrawingExample();
                        TrianglePanel comp2 = triangleDrawingExample.comp;

                        try (XMLSlideShow ppt = new XMLSlideShow();
                                        FileOutputStream out = new
FileOutputStream("C:\\Users\\yudal\\Desktop\\a.pptx")) {

                                Dimension size = comp2.getSize();
                                // Set the size of the slide to match JPanel
size
                            ppt.setPageSize(size);

                                // bar chart data. The first value is the bar
color, the second is the width
                                XSLFSlide slide = ppt.createSlide();

                                XSLFGroupShape group = slide.createGroup();
                                // define position of the drawing in the slide

                                Rectangle2D bounds = new Rectangle2D.Double(0,
0, size.getWidth(), size.getHeight());
                                group.setAnchor(bounds);
                                group.setInteriorAnchor(bounds);

                                Graphics2D graphics = new SLGraphics(group);


                                comp2.paint(graphics);

                                //这是用来辅助定位的一个Anchor 矩形,先不绘制了
                                //graphics.draw(group.getInteriorAnchor());

                                graphics.dispose();


                                ppt.write(out);

                        } catch (IOException e) {
                                e.printStackTrace();
                        }
                };
                SwingUtilities.invokeLater(doRun);
        }
}

-- 
You are receiving this mail because:
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@poi.apache.org
For additional commands, e-mail: dev-h...@poi.apache.org

Reply via email to