2017-03-15 3 views
0

Ich versuche, die Apache PDFBox Bibliothek zu verwenden, um ein PDF-Dokument programmgesteuert zu erstellen. Die Klasse PDPageContentStream enthält Methoden zum Schreiben von Text, Zeichnen von Linien, Bezierkurven, Rechtecken. Aber ich finde keine Möglichkeit, einen einfachen ausgefüllten Kreis zu zeichnen. Gibt es eine Möglichkeit, es mithilfe dieser Bibliothek zu zeichnen? Wenn nicht, können Sie bitte eine kostenlose Java-Bibliothek vorschlagen, die eine flexible API zum programmgesteuerten Erstellen von PDF-Dokumenten bietet? Danke im Voraus.Hinzufügen von gefüllten Kreisen zu PDF-Seite mit Apache PDFBox

+1

Meistens von https://stackoverflow.com/questions/40781610/how-to-draw-a-pie-chart-in-pdfbox/ PDF duplizieren nicht über einen Operator für Kreise, Sie müssen es mit Bezier-Kurven annähern. –

+0

@TilmanHausbringer Wie füllt man den von 4 Bezierkurven umschriebenen Bereich? Ich bin genau auf dieses Problem gestoßen und musste Anmerkungen verwenden, um es zu umgehen. – mstorkson

+3

@mstorkson Nach dem Zeichnen Ihrer Form mit entsprechenden Bezier-Kurven rufen Sie fill() auf. –

Antwort

3

OK, dankt allen für Antworten. Ich mag die Lösung mit Bezierkurven. Dieser Ansatz funktioniert gut für mich:

private void drawCircle(PDPageContentStream contentStream, int cx, int cy, int r, int red, int green, int blue) throws IOException { 
    final float k = 0.552284749831f; 
    contentStream.setNonStrokingColor(red, green, blue); 
    contentStream.moveTo(cx - r, cy); 
    contentStream.curveTo(cx - r, cy + k * r, cx - k * r, cy + r, cx, cy + r); 
    contentStream.curveTo(cx + k * r, cy + r, cx + r, cy + k * r, cx + r, cy); 
    contentStream.curveTo(cx + r, cy - k * r, cx + k * r, cy - r, cx, cy - r); 
    contentStream.curveTo(cx - k * r, cy - r, cx - r, cy - k * r, cx - r, cy); 
    contentStream.fill(); 
} 
0

Also, ich stieß auf dieses Problem, und es gibt einen Weg, aber es ist eine Art Cheaty und je nachdem, was Sie tun möchten, keine gute Lösung. Sie können die Vorteile von PDF „Anmerkungen“ nehmen, die einen Kreis Typ umfassen zum Beispiel:

PDAnnotationSquareCircle circle = new PDAnnotationSquareCircle(PDAnnotationSquareCircle.SUB_TYPE_CIRCLE); 
PDRectangle position = new PDRectangle(); 
position.setLowerLeftX(0); 
position.setLowerLeftY(0; 
position.setUpperRightX(100); 
position.setUpperRightY(100); 
circle.setRectangle(position); 

und dann

circle.SetInteriorColor(someCOSColor);

mit einer Farbe als Argument nennen es zu füllen. Das Problem dabei ist, dass es eine "Annotation" ist, es sei denn, Sie sperren das Dokument für die Bearbeitung, die Leute können sie ziehen. Wenn Benutzer unter Windows versuchen, sie zu drucken, sehen sie die Anmerkungen nicht. Verwenden Sie auf Ihr eigenes Risiko, aber es wird Ihnen farbige Kreise filled

Edit: hat ein vollständigeres Beispiel als Reaktion auf einen Kommentar

+0

Das ist eine Anmerkung. Es ist nicht das, wonach das OP gefragt hat. –

+0

"Aber ich finde keinen Weg, einen einfachen gefüllten Kreis zu zeichnen." ist das Zitat aus der Frage. Dadurch wird ein gefüllter Kreis in seinem Dokument erstellt. Ich denke, ich habe die Nachteile angemessen erklärt. Eigentlich, wenn es einen anderen Weg gäbe, es zu tun, würde ich daran interessiert sein, davon zu hören, weil ich das in einer Anwendung benutzt habe und es die Probleme verursacht, die ich beschrieben habe. – mstorkson

Verwandte Themen