Manipuler le document PDF
Valider le 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 dans l’énumération PdfFormat : PDF_A_1A ou PDF_A_1B.
Le format de sortie XML est un format personnalisé d’Aspose. L’XML contient une collection de balises avec le nom Problem; chaque balise contient les détails d’un problème particulier. L’attribut ObjectID de la balise Problem représente l’ID de l’objet particulier auquel ce problème est lié. L’attribut Clause représente une règle correspondante dans la spécification PDF.
public static void ValidatePDFDocumentForPDF_A_Standard() {
// Ouvrir le document
Document pdfDocument = new Document(_dataDir + "sample.pdf");
// Valider le PDF pour PDF/A-1a
pdfDocument.validate(_dataDir + "validation-result-A1A.xml", PdfFormat.PDF_A_1A);
// Enregistrer le fichier PDF mis à jour
// document.save(_dataDir + "UpdatedFile_output.pdf");
}
Travailler avec la table des matières
Ajouter une table des matières à un PDF existant
La classe ListSection dans le package aspose.pdf vous permet de créer une table des matières lors de la création d’un document PDF à partir de zéro. Pour ajouter des titres, qui sont des éléments de la table des matières, utilisez la classe aspose.pdf.Heading.
Pour ajouter une table des matières à un fichier PDF existant, utilisez la classe Heading dans le package com.aspose.pdf. Le package com.aspose.pdf peut à la fois créer de nouveaux fichiers PDF et manipuler des fichiers PDF existants. Pour ajouter un sommaire à un PDF existant, utilisez le package com.aspose.pdf.
Le code suivant montre comment créer une table des matières dans un fichier PDF existant.
public static void AddTOCtoExistingPDF() {
// Charger un fichier PDF existant
Document document = new Document(_dataDir + "sample.pdf");
// Accéder à la première page du fichier PDF
Page tocPage = document.getPages().insert(1);
// Créer un objet pour représenter les informations du sommaire
com.aspose.pdf.TocInfo tocInfo = new com.aspose.pdf.TocInfo();
com.aspose.pdf.TextFragment title = new com.aspose.pdf.TextFragment("Table des Matières");
title.getTextState().setFontSize(20);
title.getTextState().setFontStyle(com.aspose.pdf.FontStyles.Bold);
// Définir le titre pour le sommaire
tocInfo.setTitle(title);
tocPage.setTocInfo(tocInfo);
// Créer des objets string qui seront utilisés comme éléments du sommaire
String[] titles = new String[4];
titles[0] = "Première page";
titles[1] = "Deuxième page";
titles[2] = "Troisième page";
titles[3] = "Quatrième page";
for (int i = 0; i < 4; i++) {
// Créer un objet Heading
com.aspose.pdf.Heading heading2 = new com.aspose.pdf.Heading(1);
com.aspose.pdf.TextSegment segment2 = new com.aspose.pdf.TextSegment();
heading2.setTocPage(tocPage);
heading2.getSegments().add(segment2);
// Spécifier la page de destination pour l'objet heading
heading2.setDestinationPage(document.getPages().get_Item(i + 2));
// Page de destination
heading2.setTop(document.getPages().get_Item(i + 2).getRect().getHeight());
// Coordonnée de destination
segment2.setText(titles[i]);
// Ajouter le heading à la page contenant le sommaire
tocPage.getParagraphs().add(heading2);
}
// Sauvegarder le document mis à jour
document.save("TOC_Output_Java.pdf");
}
Définir différents TabLeaderType pour différents niveaux de TOC
Aspose.PDF 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 l’énumération TabLeaderType comme suit.
public static void SetDifferentTabLeaderTypeForTOCLevels() {
String outFile = "TOC.pdf";
Document document = new Document();
Page tocPage = document.getPages().add();
TocInfo tocInfo = new TocInfo();
// définir le LeaderType
tocInfo.setLineDash(TabLeaderType.Solid);
TextFragment title = new TextFragment("Table Des Matières");
title.getTextState().setFontSize(30);
tocInfo.setTitle(title);
// Ajouter la section de liste à la collection de sections du document Pdf
tocPage.setTocInfo(tocInfo);
// Définir le format de la liste à quatre niveaux en définissant les marges de gauche et
// les paramètres de format de texte de chaque niveau
tocInfo.setFormatArrayLength(4);
tocInfo.getFormatArray()[0].getMargin().setLeft(0);
tocInfo.getFormatArray()[0].getMargin().setRight(30);
tocInfo.getFormatArray()[0].setLineDash(TabLeaderType.Dot);
tocInfo.getFormatArray()[0].getTextState().setFontStyle(FontStyles.Bold | FontStyles.Italic);
tocInfo.getFormatArray()[1].getMargin().setLeft(10);
tocInfo.getFormatArray()[1].getMargin().setRight(30);
tocInfo.getFormatArray()[1].setLineDash(TabLeaderType.None);
tocInfo.getFormatArray()[1].getTextState().setFontSize(10);
tocInfo.getFormatArray()[2].getMargin().setLeft(20);
tocInfo.getFormatArray()[2].getMargin().setRight(0);
tocInfo.getFormatArray()[2].getTextState().setFontStyle(FontStyles.Bold);
tocInfo.getFormatArray()[3].setLineDash(TabLeaderType.Solid);
tocInfo.getFormatArray()[3].getMargin().setLeft(30);
tocInfo.getFormatArray()[3].getMargin().setRight(30);
tocInfo.getFormatArray()[3].getTextState().setFontStyle(FontStyles.Bold);
// Créer une section dans le document Pdf
Page page = document.getPages().add();
// Ajouter quatre titres dans la section
for (int Level = 1; Level <= 4; Level++) {
com.aspose.pdf.Heading heading2 = new com.aspose.pdf.Heading(Level);
TextSegment segment2 = new TextSegment();
heading2.getSegments().add(segment2);
heading2.setAutoSequence(true);
heading2.setTocPage(tocPage);
segment2.setText("Exemple de Titre" + Level);
heading2.getTextState().setFont(FontRepository.findFont("Arial UnicodeMS"));
// Ajouter le titre dans la Table Des Matières.
heading2.setInList(true);
page.getParagraphs().add(heading2);
}
// enregistrer le PDF
document.save(outFile);
}
Masquer les numéros de page dans la table des matières
Dans le cas où vous ne souhaitez pas afficher les numéros de page avec les titres dans la 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 :
public static void HidePageNumbersInTOC() {
String outFile = _dataDir + "HiddenPageNumbers_out.pdf";
Document doc = new Document();
Page tocPage = doc.getPages().add();
TocInfo tocInfo = new TocInfo();
TextFragment title = new TextFragment("Table Of Contents");
title.getTextState().setFontSize(20);
title.getTextState().setFontStyle(FontStyles.Bold);
tocInfo.setTitle(title);
// Ajouter la section de liste à la collection de sections du document PDF
tocPage.setTocInfo(tocInfo);
// Définir le format de la liste à quatre niveaux en définissant les marges de gauche et
// les paramètres de format de texte de chaque niveau
tocInfo.setShowPageNumbers(false);
tocInfo.setFormatArrayLength(4);
tocInfo.getFormatArray()[0].getMargin().setRight(0);
tocInfo.getFormatArray()[0].getTextState().setFontStyle(FontStyles.Bold | FontStyles.Italic);
tocInfo.getFormatArray()[1].getMargin().setLeft(30);
tocInfo.getFormatArray()[1].getTextState().setUnderline(true);
tocInfo.getFormatArray()[1].getTextState().setFontSize(10);
tocInfo.getFormatArray()[2].getTextState().setFontStyle(FontStyles.Bold);
tocInfo.getFormatArray()[3].getTextState().setFontStyle(FontStyles.Bold);
Page page = doc.getPages().add();
// Ajouter quatre titres dans la section
for (int Level = 1; Level != 5; Level++) {
Heading heading2 = new Heading(Level);
TextSegment segment2 = new TextSegment();
heading2.setTocPage(tocPage);
heading2.getSegments().add(segment2);
heading2.setAutoSequence(true);
segment2.setText("ceci est le titre de niveau " + Level);
heading2.setInList(true);
page.getParagraphs().add(heading2);
}
doc.save(_dataDir + outFile);
}
Personnaliser les numéros de page lors de l’ajout de TOC
Il est courant de personnaliser la numérotation des pages dans la table des matières lors de l’ajout de celle-ci à un document PDF. Par exemple, nous pouvons avoir besoin d’ajouter un préfixe avant le numéro de page comme P1, P2, P3 et ainsi de suite. Dans ce cas, Aspose.PDF pour Java fournit la propriété PageNumbersPrefix de la classe TocInfo qui peut être utilisée pour personnaliser les numéros de page comme montré dans l’exemple de code suivant.
public static void CustomizePageNumbersWhileAddingTOC() {
String inFile = _dataDir + "sample.pdf";
String outFile = _dataDir + "42824_out.pdf";
// Charger un fichier PDF existant
Document doc = new Document(inFile);
// Accéder à la première page du fichier PDF
Page tocPage = doc.getPages().insert(1);
// Créer un objet pour représenter les informations du TOC
TocInfo tocInfo = new TocInfo();
TextFragment title = new TextFragment("Table des Matières");
title.getTextState().setFontSize(20);
title.getTextState().setFontStyle(FontStyles.Bold);
// Définir le titre pour le TOC
tocInfo.setTitle(title);
tocInfo.setPageNumbersPrefix("P");
tocPage.setTocInfo(tocInfo);
for (int i = 1; i < doc.getPages().size(); i++) {
// Créer un objet Heading
Heading heading2 = new Heading(1);
TextSegment segment2 = new TextSegment();
heading2.setTocPage(tocPage);
heading2.getSegments().add(segment2);
// Spécifier la page de destination pour l'objet heading
heading2.setDestinationPage(doc.getPages().get_Item(i + 1));
// Page de destination
heading2.setTop(doc.getPages().get_Item(i + 1).getRect().getHeight());
// Coordonnée de destination
segment2.setText("Page " + i);
// Ajouter le heading à la page contenant le TOC
tocPage.getParagraphs().add(heading2);
}
// Enregistrer le document mis à jour
doc.save(outFile);
}
Ajouter des Couches au Fichier PDF
Les couches peuvent être utilisées dans les documents PDF de nombreuses manières. Vous pourriez avoir un fichier multilingue que vous souhaitez distribuer et vous souhaitez que le texte dans chaque langue apparaisse sur des couches différentes, avec le design de fond apparaissant sur une couche séparée. Vous pourriez également créer des documents avec une animation qui apparaît sur une couche séparée. Un exemple pourrait être d’ajouter un accord de licence à votre fichier, et vous ne voulez pas qu’un utilisateur voie le contenu avant d’accepter les termes de l’accord.
Aspose.PDF pour Java prend en charge l’ajout de couches aux fichiers PDF.
Pour travailler avec des couches dans des fichiers PDF, utilisez les membres d’API suivants.
La classe Layer représente une couche et contient les propriétés suivantes :
- Name – le nom de la couche.
- Id – l’ID de la couche.
- Contents – une liste d’opérateurs de couche.
Une fois que les objets Layer ont été définis, ajoutez-les à la collection Layers de l’objet Page. Le code ci-dessous montre comment ajouter des calques à un document PDF.
public static void AddLayersToPDFFile() {
Document doc = new Document();
Page page = doc.getPages().add();
Layer layer = new Layer("oc1", "Ligne Rouge");
layer.getContents().add(new com.aspose.pdf.operators.SetRGBColorStroke(1, 0, 0));
layer.getContents().add(new com.aspose.pdf.operators.MoveTo(500, 700));
layer.getContents().add(new com.aspose.pdf.operators.LineTo(400, 700));
layer.getContents().add(new com.aspose.pdf.operators.Stroke());
page.setLayers(new ArrayList<Layer>());
page.getLayers().add(layer);
layer = new Layer("oc2", "Ligne Verte");
layer.getContents().add(new com.aspose.pdf.operators.SetRGBColorStroke(0, 1, 0));
layer.getContents().add(new com.aspose.pdf.operators.MoveTo(500, 750));
layer.getContents().add(new com.aspose.pdf.operators.LineTo(400, 750));
layer.getContents().add(new com.aspose.pdf.operators.Stroke());
page.getLayers().add(layer);
layer = new Layer("oc3", "Ligne Bleue");
layer.getContents().add(new com.aspose.pdf.operators.SetRGBColorStroke(0, 0, 1));
layer.getContents().add(new com.aspose.pdf.operators.MoveTo(500, 800));
layer.getContents().add(new com.aspose.pdf.operators.LineTo(400, 800));
layer.getContents().add(new com.aspose.pdf.operators.Stroke());
page.getLayers().add(layer);
doc.save("output.pdf");
Définir l’expiration du PDF
La fonctionnalité d’expiration de PDF définit la durée de validité d’un fichier PDF. À une date particulière, si quelqu’un essaie d’y accéder, une fenêtre pop-up s’affiche, expliquant que le fichier a expiré et qu’il en a besoin d’un nouveau.
Aspose.PDF vous permet de définir l’expiration lors de la création et de l’édition de fichiers PDF.
L’extrait de code ci-dessous montre comment définir la date d’expiration pour un fichier PDF. Vous devez utiliser JavaScript car les fichiers enregistrés par des composants tiers (par exemple OwnerGuard) ne peuvent pas être visualisés sur d’autres stations de travail sans cet utilitaire.
Le fichier PDF peut être créé en utilisant PDF OwnerGuard avec un fichier existant ayant une date d’expiration. Mais le nouveau fichier ne peut être ouvert que sur une station de travail qui a PDF OwnerGuard installé. Les stations de travail sans PDF OwnerGuard afficheront une ExpirationFeatureError. Par exemple, PDF Reader ouvre le fichier si OwnerGuard est installé, mais Adobe Acrobat renvoie une erreur.
public static void SetPDFExpiration() {
Document document = new Document(_dataDir+"sample.pdf");
JavascriptAction javaScript = new JavascriptAction(
"var year=2020;" +
"var month=4;" +
"today = new Date(); today = new Date(today.getFullYear(), today.getMonth());" +
"expiry = new Date(year, month);" +
"if (today.getTime() > expiry.getTime())" +
"app.alert('Le fichier est expiré. Vous avez besoin d'un nouveau.');"
);
document.setOpenAction(javaScript);
document.save(_dataDir + "JavaScript-Added.pdf");
}