2017-03-07 1 views
0

Je souhaite implémenter une fonctionnalité pour dessiner un nuage sur la bordure d'un rectangle à l'aide de pdfbox 1.8.2 C# wrapper.J'ai la possibilité de dessiner un seul demi-cercle en utilisant le code mentionné dans ce link . Mais le problème est que, je suis capable de dessiner seulement un seul demi-cercle. Cela ne fonctionne pas lorsque j'essaie de dessiner plusieurs demi-cercles adjacents. Voici le code que j'utilise.Impossible de dessiner plusieurs demi-cercles à l'aide de PDPageContentStream

(createSmallArc() est par Hans Muller, license: Creative Commons Attribution 3.0 Les modifications apportées:.. D'origine mis en oeuvre comme code dans java algorithme est par Aleksas Riškus)

public void addCloud(PDRectangle rect,PDDocument doc) 
      { 
       PDGamma yellow = new PDGamma(); 
       yellow.setR(255); 
       yellow.setG(255); 
       yellow.setB(0); 
       PDPage page = (PDPage)doc.getDocumentCatalog().getAllPages().get(pageNum); 
       float width = 215; 
       float height = 156; 
       int noXSemiCircles = 21; 
       int noYSemiCircles = 15; 
       float leftX = 203; 
       float bottomY = 424; 
       int index = 0; 
       PDPageContentStream cs = new PDPageContentStream(doc, page,true,false); 
       Matrix mt = Matrix.getTranslatingInstance(leftX + (index * 10), bottomY); 
       AffineTransform at = mt.createAffineTransform(); 
       cs.concatenate2CTM(at); 
       cs.setStrokingColor(255, 0, 0); 
       while (index<noXSemiCircles) 
       { 
        cs.moveTo(leftX + (index * 10), bottomY); 
        DrawSlice(cs, 5, 180,270, true); 
        DrawSlice(cs, 5, 270, 360, false); 
        index++; 
       } 
       cs.stroke(); 
       cs.close(); 
       doc.save(System.IO.Path.Combine(FilePath)); 
       doc.close(); 
      } 
      private void DrawSlice(PDPageContentStream cs, float rad, float startDeg, float endDeg,bool move) 
      { 
       try 
       { 
        List<float> smallArc = CreateSmallArc(rad, ConvertDegreesToRadians(startDeg), ConvertDegreesToRadians(endDeg)); 
        if (move) 
        { 
         cs.moveTo(smallArc[0], smallArc[1]); 
        } 
        cs.addBezier312(smallArc[2], smallArc[3], smallArc[4], smallArc[5], smallArc[6], smallArc[7]); 
       } 
       catch (Exception ex) 
       { 

       } 
      } 
+0

S'il vous plaît modifier pour ajouter du code qui crée votre rectangle, à savoir avec des nombres réels. –

+0

@Tilman J'ai ajouté des valeurs au code.S'il vous plaît, jetez un oeil.Seulement un seul demi-cercle est en cours d'élaboration. –

Répondre

1

la méthode concatenate2CTM() est relative à la position actuelle et non absolue. Et déplacez votre appel stroke() à l'intérieur ou il ne sera pas affiché dans Adobe Reader (PDFBox l'affiche). Ainsi changer votre code comme ceci:

while (index < noXSemiCircles) 
    { 
     cs.saveGraphicsState(); 
     Matrix mt = Matrix.getTranslatingInstance(leftX + (index * 10), bottomY); 
     AffineTransform at = mt.createAffineTransform(); 
     cs.concatenate2CTM(at); 
     DrawSlice(cs, 5, 180, 270, true); 
     DrawSlice(cs, 5, 270, 360, true); 
     cs.stroke(); 
     cs.restoreGraphicsState(); 
     index++; 
    } 

Et voici ce que je reçois:

semicircles

+0

Il ne dessine aucun demi-cercle en utilisant ce code. –

+0

Il fait pour moi ... pourrait-il être que la forme est en dehors de votre écran? C'est à dire. effectuez un zoom arrière pour être sûr. –

+0

Désolé cela fonctionne.Problème était que, j'appelais la méthode du coup en dehors de la boucle. Merci pour l'aide. –