Infobulle PDF en utilisant C++

Ajouter une Infobulle au Texte Recherché en ajoutant un Bouton Invisible

Cet article montre comment ajouter une infobulle au texte d’un document PDF existant en C++. Aspose.PDF prend en charge la création d’infobulles en ajoutant un bouton invisible sur le texte recherché du fichier PDF.

using namespace System;
using namespace Aspose::Pdf;
using namespace Aspose::Pdf::Text;


void AddTooltipToSearchedText() {

    String _dataDir("C:\\Samples\\");

    // Chaîne pour le nom du fichier de sortie
    String outputFileName("Tooltip_out.pdf");

    // Créer un document d'exemple avec du texte
    auto document = MakeObject<Document>();
    document->get_Pages()->Add()->get_Paragraphs()->Add(MakeObject<TextFragment>("Déplacez le curseur de la souris ici pour afficher une infobulle"));

    document->get_Pages()->idx_get(1)->get_Paragraphs()->Add(MakeObject<TextFragment>("Déplacez le curseur de la souris ici pour afficher une infobulle très longue"));

    document->Save(outputFileName);

    // Ouvrir le document avec du texte
    auto document = MakeObject<Document>(outputFileName);
    // Créer un objet TextAbsorber pour trouver toutes les phrases correspondant à l'expression régulière
    auto absorber = MakeObject<TextFragmentAbsorber>("Déplacez le curseur de la souris ici pour afficher une infobulle");
    // Accepter l'absorbeur pour les pages du document
    document->get_Pages()->Accept(absorber);

    // Obtenir les fragments de texte extraits
    auto textFragments = absorber->get_TextFragments();

    // Parcourir les fragments
    for(auto fragment : textFragments)
    {
        // Créer un bouton invisible à la position du fragment de texte
        auto field = MakeObject<Aspose::Pdf::Forms::ButtonField>(fragment->get_Page(), fragment->get_Rectangle());
        // La valeur AlternateName sera affichée comme infobulle par une application de visualisation
        field->set_AlternateName (u"Infobulle pour le texte.");
        // Ajouter le champ du bouton au document
        document->get_Form()->Add(System::DynamicCast<Aspose::Pdf::Forms::Field>(field));
    }

    // Ensuite, un exemple d'infobulle très longue
    absorber = MakeObject<TextFragmentAbsorber>("Déplacez le curseur de la souris ici pour afficher une infobulle très longue");
    document->get_Pages()->Accept(absorber);
    textFragments = absorber->get_TextFragments();

    for(auto fragment : textFragments)
    {
        auto field = MakeObject<Aspose::Pdf::Forms::ButtonField>(fragment->get_Page(), fragment->get_Rectangle());
        // Définir un texte très long
        field->set_AlternateName(String("Lorem ipsum dolor sit amet, consectetur adipiscing elit,\
            sed do eiusmod tempor incididunt ut labore et dolore magna\
            aliqua. Ut enim ad minim veniam, quis nostrud exercitation\
            ullamco laboris nisi ut aliquip ex ea commodo consequat.\
            Duis aute irure dolor in reprehenderit in voluptate velit\
            esse cillum dolore eu fugiat nulla pariatur. Excepteur sint\
            occaecat cupidatat non proident, sunt in culpa qui officia\
            deserunt mollit anim id est laborum."));
        document->get_Form()->Add(System::DynamicCast<Aspose::Pdf::Forms::Field>(field));
    }

    // Enregistrer le document
    document->Save(outputFileName);

}

Créer un Bloc de Texte Caché et l’Afficher au Survol de la Souris

Aspose.PDF pour C++ implémente une fonction d’actions de masquage, avec laquelle vous pouvez afficher/masquer un champ de texte (ou tout autre type d’annotation) lors de l’entrée/sortie de la souris sur un bouton invisible. Pour ce faire, utilisez la classe Aspose.Pdf.Annotations.HideAction pour attribuer une action de masquage/affichage au bloc de texte. Utilisez l’extrait de code suivant pour afficher/masquer le bloc de texte lors de l’entrée/sortie de la souris.

Notez également que les actions PDF sur les documents fonctionnent bien dans leurs lecteurs respectifs (comme Adobe Reader), mais ne garantissent rien pour d’autres lecteurs PDF (comme les plug-ins de navigateur web). Nous avons mené une courte enquête et avons constaté :

  • Toutes les implémentations de l’action de masquage dans les documents PDF fonctionnent bien dans Internet Explorer v.11.0.

  • Toutes les implémentations de l’action de masquage fonctionnent également dans Opera v.12.14, mais nous avons remarqué un certain délai de réponse lors de la première ouverture du document.

  • Seule l’implémentation utilisant le constructeur HideAction acceptant le nom du champ fonctionne si Google Chrome v.61.0 affiche le document ; Veuillez utiliser les constructeurs correspondants si la navigation dans Google Chrome est significative :

buttonField.Actions.OnEnter = new HideAction(floatingField.FullName, false); buttonField.Actions.OnExit = new HideAction(floatingField.FullName);

void CreateHiddenTextBlock() {

    String _dataDir("C:\\Samples\\");

    // Chaîne pour le nom du fichier de sortie
    String outputFileName("TextBlock_HideShow_MouseOverOut_out.pdf");

    // Créer un document exemple avec du texte
    auto document = MakeObject<Document>();

    document->get_Pages()->Add()->get_Paragraphs()->Add(MakeObject<TextFragment>("Déplacez le curseur de la souris ici pour afficher le texte flottant"));
    document->Save(outputFileName);

    // Ouvrir le document avec du texte
    auto document = MakeObject<Document>(outputFileName);

    // Créer un objet TextAbsorber pour trouver toutes les phrases correspondant à l'expression régulière
    auto absorber = MakeObject<TextFragmentAbsorber>("Déplacez le curseur de la souris ici pour afficher le texte flottant");
    // Accepter l'absorbeur pour les pages du document
    document->get_Pages()->Accept(absorber);
    // Obtenir le premier fragment de texte extrait
    auto textFragments = absorber->get_TextFragments();
    auto fragment = textFragments->idx_get(1);

    // Créer un champ de texte caché pour le texte flottant dans le rectangle spécifié de la page
    auto floatingField = MakeObject<Aspose::Pdf::Forms::TextBoxField>(fragment->get_Page(), MakeObject<Rectangle>(100, 700, 220, 740));
    // Définir le texte à afficher comme valeur du champ
    floatingField->set_Value(u"Ceci est le \"champ de texte flottant\".");
    // Nous recommandons de rendre le champ 'readonly' pour ce scénario
    floatingField->set_ReadOnly(true);
    // Définir le drapeau 'hidden' pour rendre le champ invisible à l'ouverture du document
    floatingField->set_Flags(floatingField->get_Flags() | Aspose::Pdf::Annotations::AnnotationFlags::Hidden);

    // Définir un nom unique pour le champ n'est pas nécessaire mais autorisé
    floatingField->set_PartialName (u"FloatingField_1");

    // Définir les caractéristiques de l'apparence du champ n'est pas nécessaire mais l'améliore
    floatingField->set_DefaultAppearance(MakeObject<Aspose::Pdf::Annotations::DefaultAppearance>("Helv", 10, Color::get_Blue()));
    floatingField->get_Characteristics()->set_Background (System::Drawing::Color::get_LightBlue());
    floatingField->get_Characteristics()->set_Border (System::Drawing::Color::get_DarkBlue());
    floatingField->set_Border(MakeObject<Aspose::Pdf::Annotations::Border>(floatingField));
    floatingField->get_Border()->set_Width (1);
    floatingField->set_Multiline (true);

    // Ajouter un champ de texte au document
    document->get_Form()->Add(System::DynamicCast<Aspose::Pdf::Forms::Field>(floatingField));

    // Créer un bouton invisible à la position du fragment de texte
    auto buttonField = MakeObject<Aspose::Pdf::Forms::ButtonField>(fragment->get_Page(), fragment->get_Rectangle());
    // Créer une nouvelle action de masquage pour le champ spécifié (annotation) et le drapeau d'invisibilité.
    // (Vous pouvez également référencer le champ flottant par le nom si vous l'avez spécifié ci-dessus.)
    // Ajouter des actions à l'entrée/sortie de la souris sur le champ de bouton invisible
    buttonField->get_Actions()->set_OnEnter(MakeObject<Aspose::Pdf::Annotations::HideAction>(floatingField, false));
    buttonField->get_Actions()->set_OnExit(MakeObject<Aspose::Pdf::Annotations::HideAction>(floatingField));

    // Ajouter un champ de bouton au document
    document->get_Form()->Add(System::DynamicCast<Aspose::Pdf::Forms::Field>(buttonField));

    // Enregistrer le document
    document->Save(outputFileName);
}