Manipuler un Document PDF
Valider un Document PDF pour la norme PDF A (A 1A et A 1B)
Pour valider un document PDF pour la compatibilité PDF/A-1a ou PDF/A-1b, utilisez la méthode Validate de la classe Document. Cette méthode vous permet de spécifier le nom du fichier dans lequel le résultat doit être enregistré et le type de validation requis de l’énumération PdfFormat : PDF_A_1A ou PDF_A_1B.
Le code suivant vous montre comment valider un document PDF pour PDF/A-1A.
void ExampleValidate01() {
// Chaîne pour le nom du chemin.
String _dataDir("C:\\Samples\\");
// Chaîne pour le nom du fichier.
String inputFileName("ValidatePDFAStandard.pdf");
String outputFileName("Validation-result-A1A.xml");
// Ouvrir le document
auto document = MakeObject<Document>(_dataDir + inputFileName);
// Valider le PDF pour PDF/A-1a
document->Validate(_dataDir + outputFileName, PdfFormat::PDF_A_1A);
}
Le code suivant vous montre comment valider un document PDF pour PDF/A-1B.
void ExampleValidate02() {
// Chaîne pour le nom du chemin.
String _dataDir("C:\\Samples\\");
// Chaîne pour le nom du fichier.
String inputFileName("ValidatePDFAStandard.pdf");
String outputFileName("Validation-result-A1B.xml");
// Ouvrir le document
auto document = MakeObject<Document>(_dataDir + inputFileName);
// Valider le PDF pour PDF/A-1a
document->Validate(_dataDir + outputFileName, PdfFormat::PDF_A_1B);
}
Travailler avec TOC
Ajouter une TOC à un PDF existant
L’API Aspose.PDF vous permet d’ajouter une table des matières soit lors de la création d’un PDF, soit à un fichier existant.
Pour ajouter un TOC à un fichier PDF existant, utilisez la classe Heading dans l’espace de noms Aspose.Pdf. L’espace de noms Aspose.Pdf vous permet de créer de nouveaux fichiers PDF et de manipuler des fichiers PDF existants. Pour ajouter un TOC à un PDF existant, utilisez l’espace de noms Aspose.Pdf.
L’extrait de code suivant montre comment créer une table des matières dans un fichier PDF existant.
void ExampleToc01() {
// Chaîne pour les noms de chemin.
String _dataDir("C:\\Samples\\");
// Chaîne pour les noms de fichiers
String inputFileName("AddTOC.pdf");
String outputFileName("TOC_out.pdf");
auto document = MakeObject<Document>(_dataDir + inputFileName);
// Accéder à la première page du fichier PDF
auto tocPage = document->get_Pages()->Insert(1);
// Créer un objet pour représenter les informations de TOC
auto tocInfo = MakeObject<TocInfo>();
auto title = MakeObject<TextFragment>("Table Des Matières");
title->get_TextState()->set_FontSize(20);
title->get_TextState()->set_FontStyle(FontStyles::Bold);
// Définir le titre pour le TOC
tocInfo->set_Title(title);
tocPage->set_TocInfo(tocInfo);
// Créer des objets chaîne qui seront utilisés comme éléments de TOC
auto titles = MakeArray<String>(4);
titles->SetValue(u"Première page", 0);
titles->SetValue(u"Deuxième page", 1);
titles->SetValue(u"Troisième page", 2);
titles->SetValue(u"Quatrième page", 3);
for (int i = 0; i < 2; i++)
{
// Créer un objet Heading
auto heading2 = MakeObject<Heading>(1);
auto segment2 = MakeObject<TextSegment>();
heading2->set_TocPage(tocPage);
heading2->get_Segments()->Add(segment2);
// Spécifier la page de destination pour l'objet heading
heading2->set_DestinationPage(document->get_Pages()->idx_get(i + 2));
// Page de destination
heading2->set_Top(document->get_Pages()->idx_get(i + 2)->get_Rect()->get_Height());
// Coordonnée de destination
segment2->set_Text(titles[i]);
// Ajouter un heading à la page contenant la TOC
tocPage->get_Paragraphs()->Add(heading2);
}
// Enregistrer le document mis à jour
document->Save(_dataDir + outputFileName);
}
Définir différents TabLeaderType pour différents niveaux de TOC
Aspose.PDF pour C++ permet également de définir différents TabLeaderType pour différents niveaux de TOC. Vous devez définir la propriété LineDash de FormatArray avec la valeur appropriée de TabLeaderType. Ensuite, vous pouvez ajouter la section de liste à la collection de la section du document Pdf. Après, créez une section dans le document Pdf et enregistrez le fichier PDF.
void ExampleToc02() {
// Chaîne pour le nom de chemin.
String _dataDir("C:\\Samples\\");
// Chaîne pour le nom du fichier.
String inputFileName("AddTOC.pdf");
String outputFileName("TOC_out.pdf");
auto document = MakeObject<Document>(_dataDir + inputFileName);
auto tocPage = document->get_Pages()->Add();
auto tocInfo = MakeObject<TocInfo>();
//définir LeaderType
tocInfo->set_LineDash(TabLeaderType::Solid);
// Créer un objet pour représenter les informations TOC
auto tocInfo = MakeObject<TocInfo>();
auto title = MakeObject<TextFragment>("Table Des Matières");
title->get_TextState()->set_FontSize(20);
title->get_TextState()->set_FontStyle(FontStyles::Bold);
// Définir le titre pour TOC
tocInfo->set_Title(title);
//Ajouter la section de liste à la collection des sections du document Pdf
tocPage->set_TocInfo(tocInfo);
//Définir le format de la liste des quatre niveaux en définissant les marges de gauche
//et
//paramètres de format du texte de chaque niveau
tocInfo->set_FormatArrayLength(4);
tocInfo->get_FormatArray()->idx_get(0)->get_Margin()->set_Left(0);
tocInfo->get_FormatArray()->idx_get(0)->get_Margin()->set_Right(30);
tocInfo->get_FormatArray()->idx_get(0)->set_LineDash(TabLeaderType::Dot);
tocInfo->get_FormatArray()->idx_get(0)->get_TextState()->set_FontStyle(FontStyles::Bold | FontStyles::Italic);
tocInfo->get_FormatArray()->idx_get(1)->get_Margin()->set_Left(10);
tocInfo->get_FormatArray()->idx_get(1)->get_Margin()->set_Right(30);
tocInfo->get_FormatArray()->idx_get(1)->set_LineDash(TabLeaderType::None);
tocInfo->get_FormatArray()->idx_get(1)->get_TextState()->set_FontSize(10);
tocInfo->get_FormatArray()->idx_get(2)->get_Margin()->set_Left(20);
tocInfo->get_FormatArray()->idx_get(2)->get_Margin()->set_Right(30);
tocInfo->get_FormatArray()->idx_get(2)->get_TextState()->set_FontStyle(FontStyles::Bold);
tocInfo->get_FormatArray()->idx_get(3)->set_LineDash(TabLeaderType::Solid);
tocInfo->get_FormatArray()->idx_get(3)->get_Margin()->set_Left(30);
tocInfo->get_FormatArray()->idx_get(3)->get_Margin()->set_Right(30);
tocInfo->get_FormatArray()->idx_get(3)->get_TextState()->set_FontStyle(FontStyles::Bold);
//Créer une section dans le document Pdf
auto page = document->get_Pages()->Add();
//Ajouter quatre titres dans la section
for (int Level = 1; Level <= 4; Level++)
{
auto heading2 = MakeObject<Heading>(Level);
auto segment2 = MakeObject<TextSegment>();
heading2->get_Segments()->Add(segment2);
heading2->set_IsAutoSequence(true);
heading2->set_TocPage(tocPage);
segment2->set_Text(u"Exemple de Titre" + Level);
heading2->get_TextState()->set_Font(FontRepository::FindFont(u"Arial Unicode MS"));
//Ajouter le titre dans la Table Des Matières.
heading2->set_IsInList(true);
page->get_Paragraphs()->Add(heading2);
}
// enregistrer le Pdf
document->Save(_dataDir + outputFileName);
}
Masquer les numéros de page dans la table des matières
Si vous souhaitez masquer les numéros de page avec les titres dans une table des matières, vous pouvez utiliser la propriété IsShowPageNumbers de la classe TOCInfo comme faux.
Veuillez vérifier l’extrait de code suivant pour masquer les numéros de page dans la table des matières :
void ExampleToc03() {
// Chaîne pour le nom du chemin.
String _dataDir("C:\\Samples\\");
// Chaîne pour le nom du fichier.
String inputFileName("AddTOC.pdf");
String outputFileName("TOC_out.pdf");
auto document = MakeObject<Document>(_dataDir + inputFileName);
auto tocPage = document->get_Pages()->Add();
// Créer un objet pour représenter les informations de la table des matières
auto tocInfo = MakeObject<TocInfo>();
auto title = MakeObject<TextFragment>("Table Des Matières");
title->get_TextState()->set_FontSize(20);
title->get_TextState()->set_FontStyle(FontStyles::Bold);
// Définir le titre pour la table des matières
tocInfo->set_Title(title);
// Ajouter la section de liste à la collection de sections du document Pdf
tocPage->set_TocInfo(tocInfo);
tocInfo->set_IsShowPageNumbers(false);
// Définir le format de la liste à quatre niveaux en définissant les marges de gauche et
// paramètres de format de texte de chaque niveau
tocInfo->set_FormatArrayLength(4);
tocInfo->get_FormatArray()->idx_get(0)->get_Margin()->set_Right(0);
tocInfo->get_FormatArray()->idx_get(0)->get_TextState()->set_FontStyle(FontStyles::Bold | FontStyles::Italic);
tocInfo->get_FormatArray()->idx_get(1)->get_Margin()->set_Left(30);
tocInfo->get_FormatArray()->idx_get(1)->get_TextState()->set_Underline(true);
tocInfo->get_FormatArray()->idx_get(1)->get_TextState()->set_FontSize(10);
tocInfo->get_FormatArray()->idx_get(2)->get_TextState()->set_FontStyle(FontStyles::Bold);
tocInfo->get_FormatArray()->idx_get(3)->get_TextState()->set_FontStyle(FontStyles::Bold);
auto page = document->get_Pages()->Add();
// Ajouter quatre titres dans la section
for (int Level = 1; Level != 5; Level++)
{
auto heading2 = MakeObject<Heading>(Level);
auto segment2 = MakeObject<TextSegment>();
heading2->set_TocPage(tocPage);
heading2->get_Segments()->Add(segment2);
heading2->set_IsAutoSequence(true);
segment2->set_Text(u"ceci est le titre de niveau " + Level);
heading2->set_IsInList(true);
page->get_Paragraphs()->Add(heading2);
}
// enregistrer le Pdf
document->Save(_dataDir + outputFileName);
}
Comment définir une date d’expiration pour un PDF
Nous appliquons des privilèges d’accès aux fichiers PDF afin qu’un certain groupe d’utilisateurs puisse accéder à des fonctionnalités/objets particuliers des documents PDF. Afin de restreindre l’accès au fichier PDF, nous appliquons généralement un cryptage et nous pouvons avoir besoin de définir l’expiration du fichier PDF, de sorte que l’utilisateur accédant/visionnant le document reçoive une notification valide concernant l’expiration du fichier PDF.
Pour accomplir l’exigence énoncée ci-dessus, nous pouvons utiliser l’objet JavascriptAction. Veuillez consulter l’extrait de code suivant.
void SetPDFexpiryDate() {
// Chaîne pour le nom du chemin.
String _dataDir("C:\\Samples\\");
// Chaîne pour le nom du fichier.
String outputFileName("SetExpiryDate_out.pdf");
// Instancier l'objet Document
auto document = MakeObject<Document>();
// Ajouter une page à la collection de pages du fichier PDF
document->get_Pages()->Add();
// Ajouter un fragment de texte à la collection de paragraphes de l'objet page
document->get_Pages()->idx_get(1)->get_Paragraphs()->Add(new TextFragment(u"Hello World..."));
String javascriptCode(u"var year=2017;");
javascriptCode += u"var month=5;";
javascriptCode += u"today = new Date(); today = new Date(today.getFullYear(), today.getMonth());";
javascriptCode += u"expiry = new Date(year, month);";
javascriptCode += u"if (today.getTime() > expiry.getTime())";
javascriptCode += u"app.alert('The file is expired. You need a new one.');";
// Créer un objet JavaScript pour définir la date d'expiration du PDF
auto javaScript = MakeObject<Aspose::Pdf::Annotations::JavascriptAction>(javascriptCode);
// Définir JavaScript comme action d'ouverture du PDF
document->set_OpenAction(javaScript);
// Enregistrer le document PDF
document->Save(_dataDir + outputFileName);
}
Déterminer la Progression de la Génération de Fichier PDF
Un client nous a demandé d’ajouter une fonctionnalité permettant aux développeurs de déterminer la progression de la génération de fichiers PDF. Voici la réponse à cette demande.
Le champ CustomerProgressHandler de la classe DocSaveOptions vous permet de déterminer comment se déroule la génération du PDF.
Les extraits de code ci-dessous montrent comment utiliser CustomerProgressHandler.
using ProgressHandler = System::MulticastDelegate<void(SharedPtr<UnifiedSaveOptions::ProgressEventHandlerInfo>)>;
void ConversionProgressCallback(SharedPtr<UnifiedSaveOptions::ProgressEventHandlerInfo> eventInfo)
{
String eventType;
switch (eventInfo->EventType)
{
case ProgressEventType::ResultPageCreated:
eventType = u"ResultPageCreated";
break;
case ProgressEventType::ResultPageSaved:
eventType = u"ResultPageSaved";
break;
case ProgressEventType::SourcePageAnalysed:
eventType = u"SourcePageAnalysed";
break;
case ProgressEventType::TotalProgress:
eventType = u"TotalProgress";
break;
}
Console::WriteLine(String::Format(u"Event type: {0}, Value: {1}, MaxValue: {2}",
eventType, eventInfo->Value, eventInfo->MaxValue));
}
void DetermineProgressOfPDFfileGeneration() {
// Chaîne pour le nom de chemin.
String _dataDir("C:\\Samples\\");
// Chaîne pour le nom du fichier.
String inputFileName("AddTOC.pdf");
String outputFileName("TOC_out.pdf");
auto document = MakeObject<Document>(_dataDir + inputFileName);
// Ouvrir le document
auto saveOptions = MakeObject<DocSaveOptions>();
saveOptions->CustomProgressHandler = ProgressHandler(ConversionProgressCallback);
document->Save(_dataDir + outputFileName, saveOptions);
}
Aplatir un PDF remplissable en C++
Les documents PDF incluent souvent des formulaires avec des widgets remplissables interactifs tels que des boutons radio, des cases à cocher, des zones de texte, des listes, etc. Pour le rendre non éditable pour divers objectifs d’application, nous devons aplatir le fichier PDF. Aspose.PDF pour C++ fournit la fonction pour aplatir votre PDF en C++ avec juste quelques lignes de code :
void FlattenFillablePDF() {
// Chaîne pour le nom de chemin.
String _dataDir("C:\\Samples\\");
// Chaîne pour le nom du fichier.
String inputFileName("sample-form.pdf");
String outputFileName("FlattenForms_out.pdf");
auto document = MakeObject<Document>(_dataDir + inputFileName);
// Aplatir le PDF remplissable
if (document->get_Form()->get_Fields()->get_Count() > 0)
{
for (auto item : document->get_Form()->get_Fields())
item->Flatten();
}
// Enregistrer le document mis à jour
document->Save(_dataDir + outputFileName);
}