2016-06-06 7 views
1

Je travaille avec iTextSharp sur Visual Studio. J'ai créé un Pdfannotation comme ça:Comment marquer/décocher, écrire comme une annotation de texte en utilisant iTextSharp C#

PdfAnnotation annotation = PdfAnnotation.CreateText(stamper.Writer, rect, "Author", "I write my text", true, "New Paragraph"); 
stamper.AddAnnotation(annotation, 1); 

donc mon contenu d'annotation d'un texte «J'écris mon texte ». Quand je vais sur Adobe Acrobat Reader pour ouvrir mon pdf, et quand je clique sur le bouton "Commentaire" pour voir tous les commentaires que j'ai écrits sur mon pdf, je vois mon commentaire et à côté de mon commentaire "J'écris mon texte", Je vois un petit carré que je peux cocher ou décocher. Il s'agit d'une petite case à cocher qui a été créée automatiquement lorsque j'ai créé mon annotation Pdf. Je ne l'ai pas créé moi-même.

Je voudrais cocher ou décocher cette petite case en utilisant iTextSharp.

Je pensais à le faire, mais il ne fonctionne pas:

RadioCheckField checkbox = new RadioCheckField(stamper.Writer, rect, "bonjour", "on"); 
     checkbox.CheckType = RadioCheckField.TYPE_CHECK; 
     checkbox.Checked = true; 
     PdfFormField field = checkbox.CheckField; 

     annotation.Put(PdfName.A, field); 

Est-ce que quelqu'un sait comment faire?

Merci beaucoup!

Passez une bonne journée! :)

+0

Vous créez une annotation de texte. Vous ne pouvez pas cocher ou décocher une annotation de texte. S'il vous plaît nous montrer comment vous créez une case à cocher. –

+0

Si vous regardez sur Adobe Acrobat Reader, vous verrez qu'après avoir ajouté votre annotation, vous pouvez choisir de la cocher ou de la décocher. Je ne peux pas ajouter une photo, le site ne me le permet pas (parce que je suis nouveau dessus). – Caryluna

+0

Votre question est inexacte. Vous créez une annotation de texte (aka sticky note). Vous pouvez changer la représentation à une coche comme indiqué [ici] (http://itextpdf.org/documents/stickynote.png), mais ce n'est pas ce que vous demandez. Vous demandez de cocher/décocher une case à cocher. Une case à cocher est un champ de formulaire représenté par une annotation de widget, * pas * une annotation de texte. Soyez plus précis! –

Répondre

0

La question était quelque peu confuse à cause de la terminologie "cocher/décocher" dans le contexte d'une annotation de texte (ou Sticky Note). La terminologie correcte aurait été: Comment marquer/annoter une annotation de texte?

Checking/décochant nous a immédiatement fait penser à des cases à cocher, mais la capture d'écran ci-dessous montre ce que l'on entend quand on parle de marquer une annotation de texte:

enter image description here

Marquage d'une annotation de texte n'est pas une question de cocher une case à cocher. Le marquage d'une annotation de texte est effectué en ajoutant une annotation "En réponse à" (IRT) masquée. Voir How to add an "In Reply To" annotation? sur le site officiel pour plus d'informations sur les annotations "En réponse à".

J'ai adapté l'exemple AddInReplyTo avec le AddMarked comme résultat:

public void manipulatePdf(String src, String dest) throws IOException, DocumentException { 
    PdfReader reader = new PdfReader(src); 
    PdfDictionary page = reader.getPageN(1); 
    PdfArray annots = page.getAsArray(PdfName.ANNOTS); 
    PdfDictionary sticky = annots.getAsDict(0); 
    PdfArray stickyRect = sticky.getAsArray(PdfName.RECT); 
    PdfDictionary popup = annots.getAsDict(1); 
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest)); 
    PdfWriter writer = stamper.getWriter(); 
    Rectangle stickyRectangle = new Rectangle(
     stickyRect.getAsNumber(0).floatValue(), stickyRect.getAsNumber(1).floatValue(), 
     stickyRect.getAsNumber(2).floatValue(), stickyRect.getAsNumber(3).floatValue() 
    ); 
    PdfAnnotation replySticky = PdfAnnotation.createText(
      writer, stickyRectangle, "Bruno", "Marked set by Bruno", false, "Comment"); 
    replySticky.put(PdfName.IRT, annots.getAsIndirectObject(0)); 
    replySticky.put(PdfName.STATE, new PdfString("Marked")); 
    PdfNumber n = sticky.getAsNumber(PdfName.F); 
    replySticky.put(PdfName.F, new PdfNumber(n.intValue() | PdfAnnotation.FLAGS_HIDDEN)); 
    replySticky.put(new PdfName("StateModel"), new PdfString("Marked")); 
    stamper.addAnnotation(replySticky, 1); 
    stamper.close(); 
} 

L'exemple est en Java, mais il devrait être assez facile à adapter à C#. Il est important de savoir que le marquage de l'annotation originale sticky est effectué en ajoutant une annotation supplémentaire replySticky. La différence avec une annotation IRT ordinaire, est que nous allons cacher l'annotation en ajoutant FLAGS_HIDDEN aux drapeaux de l'annotation. Nous avons également défini le /State sur Marked et le /StateModel sur Marked.

Ce code devient hello_sticky_note.pdf en hello_marked.pdf comme demandé, mais il y a un problème! La case à cocher ne sera visible que si vous êtes connecté en tant qu'utilisateur "Bruno". Cette case à cocher est réservée à un usage personnel.

Si vous voulez que d'autres personnes voient l'état d'un avis, vous ne devez pas utiliser la fonction "Marqué". Au lieu de cela, vous devriez utiliser "Review". Ceci est mal documenté dans ISO-32000.Voir le tableau avec le titre "entrées supplémentaires spécifiques à une annotation de texte":

enter image description here

Ce tableau fait référence à la table avec le titre "Annotation Etats":

enter image description here

Nous avons utilisé la combinaison StateModel = marqué; Etat = Marqué, ce qui signifie que l'annotation a été marquée par l'utilisateur. Je n'ai trouvé aucune référence dans la spécification que cette marque est seulement visible sur la machine de l'utilisateur qui a marqué le document.

Après avoir découvert, je l'ai créé l'exemple AddAccepted:

PdfAnnotation replySticky = PdfAnnotation.createText(
     writer, stickyRectangle, "Bruno", "Accepted by Bruno", false, "Comment"); 
replySticky.put(PdfName.IRT, annots.getAsIndirectObject(0)); 
replySticky.put(PdfName.STATE, new PdfString("Accepted")); 
PdfNumber n = sticky.getAsNumber(PdfName.F); 
replySticky.put(PdfName.F, new PdfNumber(n.intValue() | PdfAnnotation.FLAGS_HIDDEN)); 
replySticky.put(new PdfName("StateModel"), new PdfString("Review")); 
stamper.addAnnotation(replySticky, 1); 
stamper.close(); 

Cet exemple est identique à ce que nous avions avant, sauf que nous utilisons maintenant la combinaison: StateModel = examen; Etat = Accepté. Comme vous pouvez le constater dans le tableau "Etats d'annotation", les autres options possibles pour l'état sont "Rejeté", "Annulé", "Terminé" et "Aucun" (valeur par défaut).

Le résultat ressemble à ceci:

enter image description here

Comme vous pouvez le voir, une coche verte apparaît dans le panneau des commentaires. Il affiche "Bruno Accepted" sur un ordinateur où l'utilisateur connecté n'est pas Bruno. Vous pouvez le vérifier par vous-même ici: hello_accepted.pdf

+0

Que vous pour votre réponse! Pourquoi utilisez-vous cette ligne: replySticky.Put (PdfName.IRT, annots.GetAsIndirectObject (0)); Parce que quand je l'écris, je ne vois plus ma réponse "Marked set by Bruno". Et quand je ne l'écris pas, ma réponse est là mais le problème persiste: ma réponse n'est pas marquée. – Caryluna

+0

Ne copiez pas mon exemple littéralement. Si vous supprimez la clé 'IRT', vous ne comprenez pas ma réponse. 'IRT' signifie ** En réponse à. ** La valeur de cette entrée est une référence à l'annotation qui doit être marquée. Dans mon exemple simple, c'est simple: il n'y a qu'une annotation, donc je peux prendre le premier 'annots.getAsIndirectObject (0)'. Dans votre cas, vous devez changer '0' dans l'index de l'annotation que vous voulez marquer. Commencez par essayer l'exemple sur hello_sticky_note.pdf.Examiner ce qui se passe et adapter l'exemple simple pour répondre à vos besoins. –

+0

J'ai copié votre code avec votre exemple pdf hello_sticky_note.pdf et cela ne fonctionne pas. La réponse "Marked set by Bruno" n'apparaît pas et la marque ne l'est pas trop – Caryluna