2017-10-20 4 views
0

Ich fange an zu denken, ich bin nur nicht in der Lage, das Offensichtliche zu sehen.Zeichnen einer Linie zwischen zwei Punkten in PowerPoint Folie mit Apache POI

Mit dem folgenden Code möchte ich eine Linie von den Koordinaten [x1, y1] bis [x2, y2] zeichnen.

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>); 

Von dem, was ich die Linie sehen am Anker beginnt [x1, y1], aber dann muss ich anstelle der Koordinaten des Zielpunktes eine Breite und Höhe ein. Aber die y-Komponente der Zielkoordinate ist kleiner als die der Startkoordinate, also habe ich versucht, die Höhe auf negative Werte zu setzen, was zu einem Fehler führt, wenn PowerPoint versucht, das generierte PPTX-Dokument zu öffnen ("PowerPoint hat ein Problem mit Inhalt gefunden in der Datei out.pptx. ");

Ich bin mir ziemlich sicher, dass ich einfach die offensichtliche Lösung zu diesem Thema übersehen, also kann mir jemand helfen, herauszufinden , wie man eine Linie für einen Punkt innerhalb des Dokuments zu einem anderen Punkt zeichnet?

Antwort

2

SetAnchor() nimmt einen AWT Rectangle2D, die eigentlich nicht, wenn Ihre Breite oder Höhe scheren negativ ist (wenn auch ein Rechteck mit negativer Höhe nicht ein reales Objekt, nachdem alle, oder?). Aber POI interpretiert es nicht so und wirft leider keine Ausnahme aus, um es Ihnen zu sagen.

Wie ich Ihr Szenario zu verstehen, müssen Sie nur der untere Ausgang wählen Koordinaten zwischen x1 und x2, y1 und y2 so dass eine positive Breite und Höhe mit Ihrem gewünschten Endpunkt übereinstimmen.

Etwas wie folgt aus:

// 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

Ihr Code mit dem Rechteck beginnt oben links x, y: 20,5 und endet rechts unten x, y: 30,10. Die Linie ist standardmäßig von oben links nach unten rechts. Also ist die Linie von x, y: 20,5 bis x, y: 30,10. Setzen Sie 'shape.setFlipVertical (true);' nach Ihrem Code. Dann ist die umgedrehte Zeile unten links oben rechts. So ist die Linie von x, y: 20,10 zu x, y: 30,5 nach Bedarf. –

+0

Guter Punkt. Ich habe das jetzt implementiert. Vielen Dank! –

Verwandte Themen