2017-10-20 12 views
0

Je commence à penser que je ne suis tout simplement pas capable de voir l'évidence. Étant donné le code suivant, je voudrais tirer une ligne des coordonnées [x1, y1] à [x2, y2].Tracer une ligne entre deux points dans la diapositive PowerPoint à l'aide d'Apache POI

int x1 = 20; 
int y1 = 10; 
int x2 = 30; 
int y2 = 5; 

XSLFSlide pptSlide = ... 

XSLFAutoShape shape = pptSlide.createAutoShape(); 
shape.setShapeType(ShapeType.LINE); 
shape.setAnchor(x1, y1, <width>, <height>); 

D'après ce que je peux voir la ligne commence à l'ancre [x1, y1] mais je dois entrer une largeur et la hauteur au lieu des coordonnées du point cible. Mais le composant y de la coordonnée cible est inférieur à celui de la coordonnée de démarrage, donc j'ai essayé de définir la hauteur à une valeur négative, ce qui entraîne une erreur lorsque PowerPoint essaie d'ouvrir le document PPTX généré ("PowerPoint a trouvé un problème avec le contenu dans le fichier out.pptx. ");

Je suis assez sûr que je suis simplement en train de négliger la solution évidente à ceci alors quelqu'un peut-il m'aider à trouver comment dessiner une ligne pour un point dans le document à un autre point?

Répondre

2

SetAnchor() prend un AWT Rectangle2D, qui ne se soucie pas vraiment si votre largeur ou la hauteur est négative (si un rectangle avec une hauteur négative n'est pas un objet réel après tout, est-il?). Mais POI ne l'interprète pas comme ça, et ne lance malheureusement pas d'exception pour vous le faire savoir.

Si je comprends bien votre scénario, il vous suffit de choisir les coordonnées de départ plus faible entre x1 et x2, y1 et y2 de sorte qu'une largeur positive et la hauteur d'accord avec votre point final souhaité.

Quelque chose comme ceci:

// using Apache POI ooxml 3.17 
static void drawBetweenTwoPoints(XSLFAutoShape shape, double x1, double x2, double y1, double y2) { 
    shape.setAnchor(new Rectangle2D.Double(
      x1 <= x2 ? x1 : x2, // choose the lowest x value 
      y1 <= y2 ? y1 : y2, // choose the lowest y value 
      Math.abs(x2 - x1), // get the actual width 
      Math.abs(y2 - y1) // get the actual height 
    )); 

    shape.setFlipVertical(y2 < y1); // lines are drawn from rectangle top-left to 
            // bottom right by default. 
            // When y2 is less than y1, flip the shape. 
} 
+1

En utilisant votre code le rectangle commence à haut x gauche, y: 20,5 et se termine à x en bas à droite, y: 30,10. La ligne est en haut à gauche en bas à droite par défaut. Donc, la ligne est de x, y: 20,5 à x, y: 30,10. Mettez un 'shape.setFlipVertical (true);' après votre code. Ensuite, la ligne retournée est en bas à gauche en haut à droite. Donc, la ligne est de x, y: 20,10 à x, y: 30,5 selon les besoins. –

+0

Bon point. J'ai mis en place cela maintenant. Merci! –