2017-03-15 1 views
0

J'essaie d'utiliser la bibliothèque Apache PDFBox pour créer un document PDF par programmation. La classe PDPageContentStream contient des méthodes pour écrire du texte, dessiner des lignes, des courbes de Bézier, des rectangles. Mais je ne peux pas trouver un moyen de dessiner un cercle simple rempli. Y at-il un moyen de le dessiner en utilisant cette bibliothèque? Si non, pouvez-vous suggérer une bibliothèque Java gratuite qui fournit une API flexible pour créer des documents PDF par programme? Merci d'avance.Ajout de cercles pleins à la page PDF à l'aide d'Apache PDFBox

+1

duplicate La plupart du temps de PDF https://stackoverflow.com/questions/40781610/how-to-draw-a-pie-chart-in-pdfbox/ ne dispose pas d'un opérateur cercles, vous devez l'approximer avec des courbes de Bézier. –

+0

@TilmanHausherr Comment remplir la zone circonscrite par 4 courbes bezier? J'ai rencontré ce problème et j'ai dû utiliser des annotations pour le contourner – mstorkson

+3

@mstorkson Après avoir dessiné votre forme avec les courbes bezier appropriées, vous appelez fill(). –

Répondre

3

OK, merci à tous pour les réponses. J'aime la solution avec des courbes bezier. Cette approche fonctionne pour moi:

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

Donc, j'ai rencontré ce problème, et il y a un moyen, mais son genre de triche et selon ce que vous voulez faire, pas une bonne solution. Vous pouvez profiter de PDF "annotations" qui comprennent un type de cercle, par exemple:

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

puis appelez

circle.SetInteriorColor(someCOSColor);

avec une couleur comme argument pour le remplir. Le problème avec ceci, c'est que c'est une "annotation" à moins que vous ne verrouilliez le document pour le modifier, les gens peuvent les faire glisser. En outre, si les utilisateurs de Windows essaient de les imprimer, ils ne verront pas les annotations. Utilisez à vos propres risques, mais il vous donnera comblee cercles colorés

Edit: ajouté un exemple plus complet en réponse à un commentaire

+0

C'est une annotation. Ce n'est pas ce que le PO a demandé. –

+0

"Mais je ne trouve pas un moyen de dessiner un cercle simple rempli." est la citation de la question. Cela va créer un cercle rempli sur son document. Je pense que j'ai expliqué les inconvénients de manière adéquate. En fait, s'il y a une autre façon de le faire, je serais intéressé à en entendre parler, parce que j'ai utilisé cela dans une demande et cela cause les problèmes que j'ai décrits. – mstorkson