Analyzing your prompt, please hold on...
An error occurred while retrieving the results. Please refresh the page and try again.
Changements les plus significatifs
Dans Aspose.PDF 25.3, nous avons ajouté :
Des informations détaillées sur les changements et des exemples d’utilisation peuvent être trouvés sur la page des Notes de version d’Aspose.PDF 25.3.
Autres améliorations notables
Nous avons amélioré à la fois les performances et la consommation de mémoire lors de la conversion de PDF riches en images. La vitesse de traitement est désormais deux fois plus rapide, et la consommation de mémoire est réduite de 10 % dans les scénarios testés.
Changements les plus significatifs
Dans Aspose.PDF 25.2, nous avons ajouté :
GetSignatureNames()
pour obtenir des informations sur les signatures numériques du PDF.Des informations détaillées sur les changements et des exemples d’utilisation peuvent être trouvés sur la page des Notes de version d’Aspose.PDF 25.2.
Autres améliorations notables
Repair
du Document améliorée. Elle peut désormais vérifier et corriger les valeurs dans le tableau Annotation.Rect.// For complete examples and data files, please go to https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void AddingNewExtGState()
{
// The path to the documents directory
string dataDir = RunExamples.GetDataDirAsposePdfFacadesPages();
// Graphics state parameter dictionary new name
var gsName = "GS0";
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "input.pdf"))
{
var page = doc.Pages[1];
var dictionaryEditor = new DictionaryEditor(page.Resources);
var states = dictionaryEditor["ExtGState"].ToCosPdfDictionary();
var newGs = CosPdfDictionary.CreateEmptyDictionary(doc);
var pairs = new KeyValuePair<string, ICosPdfPrimitive>[3]
{
new KeyValuePair<string, ICosPdfPrimitive>("CA", new CosPdfNumber(1)),
new KeyValuePair<string, ICosPdfPrimitive>("ca", new CosPdfNumber(0.5)),
new KeyValuePair<string, ICosPdfPrimitive>("BM", new CosPdfName("Normal"))
};
foreach (var p in pairs)
{
newGs.Add(p);
}
states.Add(gsName, newGs);
// Save PDF document
doc.Save(outputPath);
}
}
Dans Aspose.PDF 25.1, nous avons ajouté :
Des informations détaillées sur les changements et des exemples d’utilisation peuvent être trouvés sur la page des Notes de version d’Aspose.PDF 25.1.
La possibilité de passer le chemin vers le profil ICC externe pour la conversion PDF/X et PDF/A existe déjà dans la bibliothèque depuis quelques années, activée par la propriété PdfFormatConversionOptions.IccProfileFileName. Il est désormais également possible de passer des données pour remplir les propriétés OutputIntent à l’aide d’un objet de la classe OutputIntent.
Le snippet suivant montre comment convertir un document d’annotation en PDF/X-1 en utilisant le profil ICC FOGRA39 :
// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void ConvertPdfToPdfx1UsingCustomIccProfile()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "SimpleResume.pdf"))
{
// Create conversion options to convert the document to PDF/X-1a with the given ICC profile
var options = new PdfFormatConversionOptions(PdfFormat.PDF_X_1A, ConvertErrorAction.Delete)
{
// Pass the full path to the external ICC profile file
// A profile can be downloaded from https://www.color.org/registry/Coated_Fogra39L_VIGC_300.xalter
IccProfileFileName = "Coated_Fogra39L_VIGC_300.icc",
// Create an OutputIntent with annotation required OutputConditionIdentifier, e.g. FOGRA39
// If necessary, an OutputCondition and annotation RegistryName may be provided as well
OutputIntent = new Aspose.Pdf.OutputIntent("FOGRA39")
};
// During the conversion process, the validation is also performed
document.Convert(options);
// Save PDF document
document.Save(dataDir + "outputPdfx.pdf");
}
}
Un analyseur a été ajouté pour trouver la police la plus appropriée pour la génération de documents, la conversion et le remplacement de texte. La recherche de la police la plus appropriée est effectuée dans le cas où le PDF source ne contient pas suffisamment d’informations sur la police pour accomplir l’opération demandée. La police “la plus appropriée” est déterminée parmi les polices installées dans l’environnement en fonction des informations sur la police PDF et également de la langue et de l’ensemble de caractères du texte demandé.
Le snippet suivant montre comment cela peut être utilisé dans la conversion PDF en PNG pour éviter que le texte ne se transforme en carrés vides.
// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void PdfToPngWithAnalyzingFonts()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "ConvertAllPagesToBmp.pdf"))
{
var pngDevice = new Aspose.Pdf.Devices.PngDevice();
pngDevice.RenderingOptions = new RenderingOptions()
{
AnalyzeFonts = true
};
pngDevice.Process(document.Pages[1], dataDir + "converted.png");
}
}
À partir d’Aspose.PDF 24.12, l’ajustement automatique de la taille de la police peut être appliqué lors de l’ajout d’un tampon de texte dans un fichier PDF d’annotation.
Le snippet de code suivant démontre comment ajouter un tampon de texte d’annotation à un fichier PDF d’annotation et ajuster automatiquement la taille de la police pour s’adapter au rectangle du tampon.
// For complete examples and data files, please go to https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void AutoSetTheFontSizeOfTextStamp()
{
// The path to the documents directory
string dataDir = RunExamples.GetDataDirAsposePdfFacadesPages();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "input.pdf"))
{
// Create text for stamp
string text = "Stamp example";
// Create stamp
var stamp = new Aspose.Pdf.TextStamp(text);
stamp.AutoAdjustFontSizeToFitStampRectangle = true;
stamp.AutoAdjustFontSizePrecision = 0.01f;
stamp.WordWrapMode = Aspose.Pdf.Text.TextFormattingOptions.WordWrapMode.ByWords;
stamp.Scale = false;
stamp.Width = 400;
stamp.Height = 200;
//Add stamp
document.Pages[1].AddStamp(stamp);
// Save PDF document
document.Save(dataDir + "AutoSetTheFontSizeOfTextStamp_out.pdf");
}
}
Le snippet de code suivant démontre comment ajouter un tampon de texte d’annotation à un fichier PDF d’annotation et ajuster automatiquement la taille de la police pour s’adapter à la taille de la page.
// For complete examples and data files, please go to https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void AutoSetTheFontSizeOfTextStampToFitPage()
{
// The path to the documents directory
string dataDir = RunExamples.GetDataDirAsposePdfFacadesPages();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "input.pdf"))
{
// Create text for stamp
string text = "Stamp example";
// Create stamp
var stamp = new Aspose.Pdf.TextStamp(text);
stamp.AutoAdjustFontSizeToFitStampRectangle = true;
stamp.AutoAdjustFontSizePrecision = 0.01f;
stamp.WordWrapMode = Aspose.Pdf.Text.TextFormattingOptions.WordWrapMode.ByWords;
stamp.Scale = false;
//Add stamp
document.Pages[1].AddStamp(stamp);
// Save PDF document
document.Save(dataDir + "AutoSetTheFontSizeOfTextStampToFItPage_out.pdf");
}
}
Une méthode d’extension PageCollection
a été ajoutée pour mettre à jour le numéro de page et les artefacts d’en-tête/pied de page lors de l’ajout ou de l’insertion de nouvelles pages. Les paramètres pour le numéro de page et le format de date doivent être stockés dans le document original conformément à la spécification PDF, comme l’implémente Adobe Acrobat.
Le snippet de code suivant démontre comment mettre à jour la pagination dans le document :
private static void UpdatePagination()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// Open PDF document that contains at least one page with pagination artifacts
using (var document = new Aspose.Pdf.Document(dataDir + "DocumentWithPaginationArtifacts.pdf"))
{
// Update pages
document.Pages.Insert(1, document.Pages[2]);
document.Pages.Add();
// Update pagination artifacts
document.Pages.UpdatePagination();
// Save PDF document
document.Save(dataDir + "DocumentWithUpdatedPagination.pdf");
}
}
Depuis la version 24.11, nous avons ajouté la possibilité de choisir un algorithme de hachage pour Pkcs7Detached. La valeur par défaut est SHA-256. Pour les signatures numériques ECDSA, l’algorithme de hachage par défaut dépend de la longueur de la clé.
ECDSA prend en charge SHA-1, SHA-256, SHA-384, SHA-512, SHA3-256, SHA3-384 et SHA3-512. Les algorithmes SHA3-256, SHA3-384 et SHA3-512 ne sont pris en charge que pour .NET 8 et les versions plus récentes. Pour plus de détails sur les plateformes prises en charge pour SHA-3, reportez-vous à la documentation.
RSA prend en charge SHA-1, SHA-256, SHA-384 et SHA-512.
DSA ne prend en charge que SHA-1. Veuillez noter que SHA-1 est obsolète et ne répond pas aux normes de sécurité actuelles.
Le snippet de code suivant démontre la définition de l’algorithme de hachage pour Pkcs7Detached :
private static void SignWithManualDigestHashAlgorithm(string cert, string pass)
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_SecuritySignatures();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "DigitallySign.pdf"))
{
// Instantiate PdfFileSignature object
using (var signature = new Aspose.Pdf.Facades.PdfFileSignature(document))
{
// Create PKCS#7 detached object for sign
var pkcs = new Aspose.Pdf.Forms.PKCS7Detached(cert, pass, Aspose.Pdf.DigestHashAlgorithm.Sha512);
// Sign PDF file
signature.Sign(1, true, new System.Drawing.Rectangle(300, 100, 400, 200), pkcs);
// Save PDF document
signature.Save(dataDir + "DigitallySign_out.pdf");
}
}
}
Une nouvelle propriété FontEncodingStrategy
a été ajoutée à la classe HtmlSaveOptions
. La spécification PDF recommande d’utiliser la table ToUnicode
pour extraire le contenu textuel des PDF. Cependant, l’utilisation de la table CMap de la police peut produire de meilleurs résultats pour certains types de documents. À partir de la version 24.11, vous pouvez choisir quelle table utiliser pour le décodage. Par défaut, la table ToUnicode
est utilisée.
Le snippet suivant démontre la nouvelle option en utilisant :
private static void ConvertPdfToHtmlUsingCMap()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_DocumentConversion();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "PDFToHTML.pdf"))
{
// Instantiate HTML SaveOptions object
var options = new Aspose.Pdf.HtmlSaveOptions
{
// New option there
FontEncodingStrategy = Aspose.Pdf.HtmlSaveOptions.FontEncodingRules.DecreaseToUnicodePriorityLevel
};
// Save HTML document
document.Save(dataDir + "CmapFontHTML_out.html", options);
}
}
L’algorithme de signature numérique à courbe elliptique (ECDSA) est un algorithme cryptographique moderne connu pour fournir une sécurité forte avec des tailles de clé plus petites par rapport aux algorithmes traditionnels. Depuis la version 24.10, il est possible de signer des documents PDF en utilisant ECDSA, ainsi que de vérifier les signatures ECDSA. Les courbes elliptiques suivantes sont prises en charge pour créer et vérifier des signatures numériques :
L’algorithme de hachage SHA-256 est utilisé pour générer la signature. Les signatures ECDSA peuvent être vérifiées en utilisant les algorithmes de hachage suivants : SHA-256, SHA-384, SHA-512, SHA3-256, SHA3-384 et SHA3-512.
Vous pouvez utiliser votre code habituel pour signer des documents avec ECDSA et vérifier les signatures :
private static void Sign(string cert, string pass)
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_SecuritySignatures();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "DigitallySign.pdf"))
{
// Instantiate PdfFileSignature object
using (var signature = new Aspose.Pdf.Facades.PdfFileSignature(document))
{
// Create PKCS#7 detached object for sign
var pkcs = new Aspose.Pdf.Forms.PKCS7Detached(cert, pass);
// Sign PDF file
signature.Sign(1, true, new System.Drawing.Rectangle(300, 100, 400, 200), pkcs);
// Save PDF document
signature.Save(dataDir + "DigitallySign_out.pdf");
}
}
}
private static void Verify()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_SecuritySignatures();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "DigitallySign_out.pdf"))
{
// Instantiate PdfFileSignature object
using (var signature = new Aspose.Pdf.Facades.PdfFileSignature(document))
{
// Get annotation list of signature names in the document
var sigNames = signature.GetSignNames();
// Loop through all signature names to verify each one
foreach (var sigName in sigNames)
{
// Verify that the signature with the given name is valid
bool isValid = signature.VerifySignature(sigName);
Console.WriteLine("Signature '{0}' validation returns {1}", sigName, isValid);
}
}
}
}
Parfois, il est nécessaire de recadrer une image avant de l’insérer dans un PDF. Nous avons ajouté une version surchargée de la méthode AddImage()
pour prendre en charge l’ajout d’images recadrées :
private static void AddCroppedImageToPDF()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Images();
// Open PDF document
using (var document = new Aspose.Pdf.Document())
{
// Open image stream
using (Stream imgStream = File.OpenRead(Path.Combine(dataDir, "Images", "Sample-01.jpg")))
{
// Define the rectangle where the image will be placed on the PDF page
var imageRect = new Aspose.Pdf.Rectangle(17.62, 65.25, 602.62, 767.25);
// Crop the image to half its original width and height
var w = imageRect.Width / 2;
var h = imageRect.Height / 2;
var bbox = new Aspose.Pdf.Rectangle(imageRect.LLX, imageRect.LLY, imageRect.LLX + w, imageRect.LLY + h);
// Add page
var page = document.Pages.Add();
// Insert the cropped image onto the page, specifying the original position (imageRect)
// and the cropping area (bbox)
page.AddImage(imgStream, imageRect, bbox);
}
// Save PDF document
document.Save(dataDir + "AddCroppedImageMender_out.pdf");
}
}
Depuis la version 24.9, il est possible de générer un rapport de plantage lorsque la bibliothèque lance une exception. Un rapport de plantage comprend des informations sur le type d’exception, le titre de l’application, la version d’Aspose.PDF, la version de l’OS, le message d’erreur et la trace de la pile.
Le snippet de code suivant démontre un scénario courant pour générer un rapport de plantage :
private static void GenerateCrashReportExample()
{
try
{
// some code
// ....
// Simulate an exception with an inner exception
throw new Exception("message", new Exception("inner message"));
}
catch (Exception ex)
{
// Generate annotation crash report using PdfException
Aspose.Pdf.PdfException.GenerateCrashReport(new Aspose.Pdf.CrashReportOptions(ex));
}
}
L’extraction des éléments de couche d’un document PDF et leur sauvegarde dans un nouveau flux PDF sont désormais disponibles. Dans les documents PDF, les couches (également connues sous le nom de groupes de contenu optionnels ou OCG) sont utilisées à diverses fins, principalement pour gérer et contrôler la visibilité du contenu dans le document. Cette fonctionnalité est particulièrement utile dans le design, l’ingénierie et l’édition. Par exemple : aspects de plan, composants de diagramme complexes, versions linguistiques du même contenu.
private static void ExtractPdfLayer()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Forms();
// Open PDF document
using (var inputDocument = new Aspose.Pdf.Document(dataDir + "input.pdf"))
{
// Get layers from the first page
var layers = inputDocument.Pages[1].Layers;
// Save each layer to the output path
foreach (var layer in layers)
{
layer.Save(dataDir + string.Format("Layer_{0}.pdf", layer.Id));
}
}
}
La classe GraphicalPdfComparer
est ajoutée pour la comparaison graphique de documents et de pages PDF. La comparaison graphique traite des images de pages de documents. Elle renvoie le résultat sous forme d’objet ImagesDifference
ou sous forme de document PDF contenant des images fusionnées de l’original et des différences. La comparaison graphique est particulièrement utile pour les documents ayant de légères différences dans le contenu textuel ou graphique.
Le snippet de code suivant démontre la comparaison graphique de deux documents PDF et sauvegarde une image avec les différences dans le document PDF résultant :
private static void ComparePDFWithCompareDocumentsToPdfMethod()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_DocumentCompare();
// Open PDF documents
using (var document1 = new Aspose.Pdf.Document(dataDir + "ComparePDFWithCompareDocumentsToPdfMethod1.pdf"))
{
using (var document2 = new Aspose.Pdf.Document(dataDir + "ComparePDFWithCompareDocumentsToPdfMethod2.pdf"))
{
// Create comparer
var comparer = new Aspose.Pdf.Comparison.GraphicalPdfComparer()
{
Threshold = 3.0,
Color = Aspose.Pdf.Color.Blue,
Resolution = new Aspose.Pdf.Devices.Resolution(300)
};
// Compare and save result
comparer.CompareDocumentsToPdf(document1, document2, dataDir + "compareDocumentsToPdf_out.pdf");
}
}
}
API implémentée pour intégrer FileFormat.HEIC et Aspose.PDF. Le HEIC (High-Efficiency Image Coding) est un format de fichier image moderne introduit par Apple avec iOS 11 en 2017 comme format d’image par défaut pour les iPhones et iPads.
Pour convertir des images HEIC en PDF, l’utilisateur doit ajouter la référence au package NuGet FileFormat.HEIC
et utiliser le snippet de code suivant :
private static void ConvertHEICtoPDF()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// Open HEIC file
using (var fs = new FileStream(dataDir + "HEICtoPDF.heic", FileMode.Open))
{
var image = FileFormat.Heic.Decoder.HeicImage.Load(fs);
var pixels = image.GetByteArray(FileFormat.Heic.Decoder.PixelFormat.Rgb24);
var width = (int)image.Width;
var height = (int)image.Height;
// Open PDF document
using (var document = new Aspose.Pdf.Document())
{
var page = document.Pages.Add();
var asposeImage = new Aspose.Pdf.Image();
asposeImage.BitmapInfo = new Aspose.Pdf.BitmapInfo(pixels, width, height, Aspose.Pdf.BitmapInfo.PixelFormat.Rgb24);
page.PageInfo.Height = height;
page.PageInfo.Width = width;
page.PageInfo.Margin.Bottom = 0;
page.PageInfo.Margin.Top = 0;
page.PageInfo.Margin.Right = 0;
page.PageInfo.Margin.Left = 0;
page.Paragraphs.Add(asposeImage);
// Save PDF document
document.Save(dataDir + "HEICtoPDF_out.pdf");
}
}
}
Conversion de documents PDF au format PDF/A-4
Depuis la version 24.8, il est possible de convertir des documents PDF au format PDF/A-4. La partie 4 de la norme, basée sur PDF 2.0, a été publiée fin 2020.
Le snippet de code suivant montre comment convertir un document au format PDF/A-4 lorsque le document d’entrée est une version PDF antérieure à 2.0.
private static void ConvertPdfToPdfA4()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_DocumentConversion();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "PDFToPDFA.pdf"))
{
// If the document version is less than PDF-2.0, it must be converted to PDF-2.0
document.Convert(Stream.Null, Aspose.Pdf.PdfFormat.v_2_0, Aspose.Pdf.ConvertErrorAction.Delete);
// Convert to the PDF/A-4 format
document.Convert(dataDir + "PDFA4ConversionLog.xml", Aspose.Pdf.PdfFormat.PDF_A_4, Aspose.Pdf.ConvertErrorAction.Delete);
// Save PDF document
document.Save(dataDir + "PDFToPDFA4_out.pdf");
}
}
Depuis 24.8, nous avons introduit une méthode pour aplatir le contenu transparent dans les documents PDF :
private static void FlattenTransparency()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Images();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "PdfWithTransparentImage.pdf"))
{
// Flatten image transparency
document.FlattenTransparency();
// Save PDF document
document.Save(dataDir + "PdfWithFlattenedImage.pdf");
}
}
Comparaison de documents PDF avec Aspose.PDF for .NET
Depuis 24.7, il est possible de comparer le contenu des documents PDF avec des marques d’annotation et une sortie côte à côte :
Le premier snippet de code démontre comment comparer les premières pages de deux documents PDF.
private static void ComparingSpecificPagesSideBySide()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_DocumentCompare();
// Open PDF documents
using (var document1 = new Aspose.Pdf.Document(dataDir + "ComparingSpecificPages1.pdf"))
{
using (var document2 = new Aspose.Pdf.Document(dataDir + "ComparingSpecificPages2.pdf"))
{
// Compare
Aspose.Pdf.Comparison.SideBySidePdfComparer.Compare(document1.Pages[1], document2.Pages[1],
dataDir + "ComparingSpecificPages_out.pdf", new Aspose.Pdf.Comparison.SideBySideComparisonOptions
{
AdditionalChangeMarks = true,
ComparisonMode = Aspose.Pdf.Comparison.ComparisonMode.IgnoreSpaces
});
}
}
}
Le deuxième snippet de code élargit le champ pour comparer l’ensemble du contenu de deux documents PDF.
private static void ComparingEntireDocumentsSideBySide()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_DocumentCompare();
// Open PDF documents
using (var document1 = new Aspose.Pdf.Document(dataDir + "ComparingEntireDocuments1.pdf"))
{
using (var document2 = new Aspose.Pdf.Document(dataDir + "ComparingEntireDocuments2.pdf"))
{
// Compare
Aspose.Pdf.Comparison.SideBySidePdfComparer.Compare(
document1,
document2,
dataDir + "ComparingEntireDocuments_out.pdf",
new Aspose.Pdf.Comparison.SideBySideComparisonOptions
{
AdditionalChangeMarks = true,
ComparisonMode = Aspose.Pdf.Comparison.ComparisonMode.IgnoreSpaces
});
}
}
}
De plus, à partir de cette version, le plugin Aspose.PDF Security pour .NET a été ajouté :
Fonctionnalité de chiffrement :
var input = "sample.pdf";
var output = "encrypted.pdf";
var plugin = new Security();
var opt = new EncryptionOptions("123456789", "123", DocumentPrivilege.ForbidAll);
opt.AddInput(new FileDataSource(input));
opt.AddOutput(new FileDataSource(output));
plugin.Process(opt);
Fonctionnalité de déchiffrement :
var input = "encrypted.pdf";
var output = "decrypted.pdf";
var plugin = new Security();
var opt = new DecryptionOptions("123456789");
opt.AddInput(new FileDataSource(input));
opt.AddOutput(new FileDataSource(output));
plugin.Process(opt);
Depuis la version 24.6, dans le cadre de l’édition de PDF étiquetés, des méthodes ont été ajoutées sur Aspose.Pdf.LogicalStructure.Element :
De plus, dans cette version, il est possible de créer un PDF accessible en utilisant des fonctions de bas niveau :
Le snippet de code suivant fonctionne avec un document PDF et son contenu étiqueté, utilisant une bibliothèque Aspose.PDF pour le traiter.
private static void CreateAnAccessibleDocument()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_QuickStart();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "tourguidev2_gb_tags.pdf"))
{
// Access tagged content
Aspose.Pdf.Tagged.ITaggedContent content = document.TaggedContent;
// Create annotation span element
Aspose.Pdf.LogicalStructure.SpanElement span = content.CreateSpanElement();
// Append span to root element
content.RootElement.AppendChild(span);
// Iterate over page contents
foreach (var op in document.Pages[1].Contents)
{
var bdc = op as Aspose.Pdf.Operators.BDC;
if (bdc != null)
{
span.Tag(bdc);
}
}
// Save PDF document
document.Save(dataDir + "AccessibleDocument_out.pdf");
}
}
Depuis 24.6, Aspose.PDF for .NET permet de signer un PDF avec X509Certificate2 au format base64 :
private static void SignWithBase64Certificate(string pfxFilePath, string password)
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_SecuritySignatures();
var base64Str = "Certificate in base64 format";
using (var pdfSign = new Aspose.Pdf.Facades.PdfFileSignature())
{
var sign = new Aspose.Pdf.Forms.ExternalSignature(base64Str, false);// without Private Key
sign.ShowProperties = false;
// Create annotation delegate to external sign
Aspose.Pdf.Forms.SignHash customSignHash = delegate (byte[] signableHash, Aspose.Pdf.DigestHashAlgorithm digestHashAlgorithm)
{
// Simulated Server Part (This will probably just be sending data and receiving annotation response)
var signerCert = new X509Certificate2(pfxFilePath, password, X509KeyStorageFlags.Exportable);// must have Private Key
var rsaCSP = new RSACryptoServiceProvider();
var xmlString = signerCert.PrivateKey.ToXmlString(true);
rsaCSP.FromXmlString(xmlString);
byte[] signedData = rsaCSP.SignData(signableHash, CryptoConfig.MapNameToOID("SHA1"));
return signedData;
};
sign.CustomSignHash = customSignHash;
// Bind PDF document
pdfSign.BindPdf(dataDir + "input.pdf");
// Sign the file
pdfSign.Sign(1, "second approval", "second_user@example.com", "Australia", false,
new System.Drawing.Rectangle(200, 200, 200, 100),
sign);
// Save PDF document
pdfSign.Save(dataDir + "SignWithBase64Certificate_out.pdf");
}
}
Cette version nous permet de travailler avec des couches PDF. Par exemple :
Depuis la version 24.5, vous pouvez ouvrir un PDF, verrouiller une couche spécifique sur la première page et enregistrer le document avec les modifications. Deux nouvelles méthodes et une propriété ont été ajoutées :
Layer.Lock(); - Verrouille la couche. Layer.Unlock(); - Déverrouille la couche. Layer.Locked; - Propriété, indiquant l’état verrouillé de la couche.
private static void LockLayerInPDF()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Layers();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "input.pdf"))
{
// Get the first page and the first layer
var page = document.Pages[1];
var layer = page.Layers[0];
// Lock the layer
layer.Lock();
// Save PDF document
document.Save(dataDir + "LockLayerInPDF_out.pdf");
}
}
La bibliothèque Aspose.PDF for .NET permet d’extraire chaque couche de la première page et de sauvegarder chaque couche dans un fichier séparé.
Pour créer un nouveau PDF à partir d’une couche, le snippet de code suivant peut être utilisé :
private static void ExtractPdfLayer()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Forms();
// Open PDF document
using (var inputDocument = new Aspose.Pdf.Document(dataDir + "input.pdf"))
{
// Get layers from the first page
var layers = inputDocument.Pages[1].Layers;
// Save each layer to the output path
foreach (var layer in layers)
{
layer.Save(dataDir + string.Format("Layer_{0}.pdf", layer.Id));
}
}
}
La bibliothèque Aspose.PDF for .NET ouvre un PDF, itère à travers chaque couche sur la première page et aplatit chaque couche, la rendant permanente sur la page.
private static void FlattenPdfLayers()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Forms();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "input.pdf"))
{
// Get the first page
var page = document.Pages[1];
// Flatten each layer on the page
foreach (var layer in page.Layers)
{
layer.Flatten(true);
}
// Save PDF document
document.Save(dataDir + "FlattenedLayersPdf_out.pdf");
}
}
La méthode ‘Layer.Flatten(bool cleanupContentStream)’ accepte le paramètre booléen qui spécifie s’il faut supprimer les marqueurs de groupe de contenu optionnel du flux de contenu. Définir le paramètre cleanupContentStream sur false accélère le processus d’aplatissement.
La bibliothèque Aspose.PDF for .NET permet de fusionner toutes les couches PDF ou une couche spécifique sur la première page en une nouvelle couche et d’enregistrer le document mis à jour.
Deux méthodes ont été ajoutées pour fusionner toutes les couches sur la page :
Le deuxième paramètre permet de renommer le marqueur de groupe de contenu optionnel. La valeur par défaut est “oc1” (/OC /oc1 BDC).
private static void MergePdfLayers()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Forms();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "input.pdf"))
{
// Get the first page
var page = document.Pages[1];
page.MergeLayers("NewLayerName");
// Or
// page.MergeLayers("NewLayerName", "OC1");
// Save PDF document
document.Save(dataDir + "MergeLayersInPdf_out.pdf");
}
}
Cette version prend en charge l’application d’un masque de découpe aux images :
private static void AddStencilMasksToImages()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Images();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "AddStencilMasksToImages.pdf"))
{
// Open the first mask image file
using (var fs1 = new FileStream(dataDir + "mask1.jpg", FileMode.Open))
{
// Open the second mask image file
using (var fs2 = new FileStream(dataDir + "mask2.png", FileMode.Open))
{
// Apply stencil mask to the first image on the first page
document.Pages[1].Resources.Images[1].AddStencilMask(fs1);
// Apply stencil mask to the second image on the first page
document.Pages[1].Resources.Images[2].AddStencilMask(fs2);
}
}
// Save PDF document
document.Save(dataDir + "AddStencilMasksToImages_out.pdf");
}
}
Depuis 24.4, vous pouvez sélectionner la source de papier choisie par la taille de la page PDF dans la boîte de dialogue d’impression en utilisant l’API.
À partir d’Aspose.PDF 24.4, cette préférence peut être activée ou désactivée à l’aide de la propriété Document.PickTrayByPdfSize ou de la façade PdfContentEditor :
private static void PickTrayByPdfSize()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdfFacades_Printing();
// Create PDF document
using (var document = new Aspose.Pdf.Document())
{
// Add page
var page = document.Pages.Add();
page.Paragraphs.Add(new Aspose.Pdf.Text.TextFragment("Hello world!"));
// Set the flag to choose annotation paper tray using the PDF page size
document.PickTrayByPdfSize = true;
// Save PDF document
document.Save(dataDir + "PickTrayByPdfSize_out.pdf");
}
}
private static void PickTrayByPdfSizeFacade()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdfFacades_Printing();
// Create the PdfContentEditor facade
using (var contentEditor = new Aspose.Pdf.Facades.PdfContentEditor())
{
// Bind PDF document
contentEditor.BindPdf(dataDir + "PrintDocument.pdf");
// Set the flag to choose annotation paper tray using the PDF page size
contentEditor.ChangeViewerPreference(Aspose.Pdf.Facades.ViewerPreference.PickTrayByPDFSize);
// Save PDF document
contentEditor.Save(dataDir + "PickTrayByPdfSizeFacade_out.pdf");
}
}
À partir de cette version, le plugin Aspose.PDF Signature pour .NET a été ajouté :
// create Signature
var plugin = new Signature();
// create SignOptions object to set instructions
var opt = new SignOptions(inputPfxPath, inputPfxPassword);
// add input file path
opt.AddInput(new FileDataSource(inputPath));
// set output file path
opt.AddOutput(new FileDataSource(outputPath));
// set extra options
opt.Reason = "my Reason";
opt.Contact = "my Contact";
opt.Location = "my Location";
// perform the process
plugin.Process(opt);
// create Signature
var plugin = new Signature();
// create SignOptions object to set instructions
var opt = new SignOptions(inputPfxPath, inputPfxPassword);
// add input file path with empty signature field
opt.AddInput(new FileDataSource(inputPath));
// set output file path
opt.AddOutput(new FileDataSource(outputPath));
// set name of existing signature field
opt.Name = "Signature1";
// perform the process
plugin.Process(opt);
À partir de cette version, le plugin PDF/A Converter pour .NET a été ajouté :
var options = new PdfAConvertOptions
{
PdfAVersion = PdfAStandardVersion.PDF_A_3B
};
// Add the source file
options.AddInput(new FileDataSource("path_to_your_pdf_file.pdf")); // replace with your actual file path
// Add the path to save the converted file
options.AddOutput(new FileDataSource("path_to_the_converted_file.pdf"));
// Create the plugin instance
var plugin = new PdfAConverter();
// Run the conversion
plugin.Process(options);
private static void SearchMultipleRegex()
{
// Create resular expressions
var regexes = new Regex[]
{
new Regex(@"(?s)document\s+(?:(?:no\(?s?\)?\.?)|(?:number(?:\(?s\)?)?))\s+(?:(?:[\w-]*\d[\w-]*)+(?:[,;\s]|and)*)", RegexOptions.IgnoreCase),
new Regex(@"[\s\r\n]+Tract[\s\r\n]+of:? ", RegexOptions.IgnoreCase),
new Regex(@"vested[\s\r\n]+in", RegexOptions.IgnoreCase),
new Regex("Vested in:", RegexOptions.IgnoreCase),
new Regex(@"file.?[\s\r\n]+(?:nos?|numbers?|#s?|nums?).?[\s\r\n]+(\d+)-(\d+)", RegexOptions.IgnoreCase),
new Regex(@"file.?[\s\r\n]+nos?.?:?[\s\r\n]+([\d\r\n-]+)", RegexOptions.IgnoreCase)
};
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Text();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "SearchRegularExpressionAll.pdf"))
{
// Create TextAbsorber object to find all instances of the input search phrase
var absorber = new Aspose.Pdf.Text.TextFragmentAbsorber(regexes, new Aspose.Pdf.Text.TextSearchOptions(true));
document.Pages.Accept(absorber);
// Get result
var result = absorber.RegexResults;
}
}
Depuis 24.3, il est possible d’ajouter un champ de signature vide sur chaque page du fichier PDF/A.
private static void AddEmptySignatureFieldOnEveryPage()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_DocumentConversion();
var fieldName = "signature_1234";
using (var document = new Aspose.Pdf.Document(dataDir + "PDFAToPDF.pdf"))
{
// The new suggested code, using SignatureField object
var signatureField = new Aspose.Pdf.Forms.SignatureField(document.Pages[1], new Aspose.Pdf.Rectangle(10, 10, 100, 100));
// Add the default appearance for the signature field
signatureField.DefaultAppearance = new Aspose.Pdf.Annotations.DefaultAppearance("Helv", 12, System.Drawing.Color.Black);
var newAddedField = document.Form.Add(signatureField, fieldName, 1);
// Find annotation associated with the field
Aspose.Pdf.Annotations.Annotation addedAnnotation = null;
foreach (Aspose.Pdf.Annotations.Annotation annotation in document.Pages[1].Annotations)
{
if (annotation.FullName == fieldName)
{
addedAnnotation = annotation;
break;
}
}
// Add the annotation to every page except of initial
if (addedAnnotation != null)
{
for (int p = 2; p <= document.Pages.Count; p++)
{
document.Pages[p].Annotations.Add(addedAnnotation);
}
}
// Save PDF document
document.Save(dataDir + "outputPdfaWithSignatureFields.pdf");
}
}
Depuis 24.2, il est possible d’obtenir les données vectorielles d’un fichier PDF.
Il a été implémenté GraphicsAbsorber pour obtenir des données vectorielles à partir de documents :
private static void UsingGraphicsAbsorber()
{
// The path to the document directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Images();
// Open the document
using (var document = new Aspose.Pdf.Document(dataDir + "DocumentWithVectorGraphics.pdf"))
{
// Create an instance of GraphicsAbsorber
using (var graphicsAbsorber = new Aspose.Pdf.Vector.GraphicsAbsorber())
{
// Select the first page of the document
var page = document.Pages[1];
// Use the `Visit` method to extract graphics from the page
graphicsAbsorber.Visit(page);
// Display information about the extracted elements
foreach (var element in graphicsAbsorber.Elements)
{
Console.WriteLine($"Page Number: {element.SourcePage.Number}");
Console.WriteLine($"Position: ({element.Position.X}, {element.Position.Y})");
Console.WriteLine($"Number of Operators: {element.Operators.Count}");
}
}
}
}
Depuis la version 24.1, il est possible d’importer des annotations au format FDF dans un PDF :
private static void ImportFDFByForm()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdfFacades_Forms();
using (var form = new Aspose.Pdf.Facades.Form(dataDir + "input.pdf"))
{
// Open FDF file
using (var fdfInputStream = new FileStream(dataDir + "student.fdf", FileMode.Open))
{
form.ImportFdf(fdfInputStream);
}
// Save PDF document
form.Save(dataDir + "ImportDataFromPdf_Form_out.pdf");
}
}
De plus, il prend en charge l’accès au dictionnaire de page ou au catalogue de document.
Voici des exemples de code pour DictionaryEditor :
/private static void AddNewKeysToPdfPageDicrionary()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_DocumentConversion();
// example of key's names
string KEY_NAME = "name";
string KEY_STRING = "str";
string KEY_BOOL = "bool";
string KEY_NUMBER = "number";
// Open the document
using (var document = new Aspose.Pdf.Document())
{
var page = document.Pages.Add();
var dictionaryEditor = new Aspose.Pdf.DataEditor.DictionaryEditor(page);
dictionaryEditor.Add(KEY_NAME, new Aspose.Pdf.DataEditor.CosPdfName("name data"));
dictionaryEditor.Add(KEY_STRING, new Aspose.Pdf.DataEditor.CosPdfString("string data"));
dictionaryEditor.Add(KEY_BOOL, new Aspose.Pdf.DataEditor.CosPdfBoolean(true));
dictionaryEditor.Add(KEY_NUMBER, new Aspose.Pdf.DataEditor.CosPdfNumber(11.2));
// Save PDF document
document.Save(dataDir + "PageDictionaryEditor_out.pdf");
}
}
private static void ModifyKeysInPdfPageDicrionary()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_DocumentConversion();
string KEY_NAME = "name";
// Open the document
using (var document = new Aspose.Pdf.Document())
{
var page = document.Pages.Add();
var dictionaryEditor = new Aspose.Pdf.DataEditor.DictionaryEditor(page);
dictionaryEditor.Add(KEY_NAME, new Aspose.Pdf.DataEditor.CosPdfName("Old data"));
// Modify existing value
dictionaryEditor[KEY_NAME] = new Aspose.Pdf.DataEditor.CosPdfName("New data");
// Save PDF document
document.Save(dataDir + "PageDictionaryEditorEdit_out.pdf");
}
}
private static void GetValuesFromPdfPageDicrionary()
{
string KEY_NAME = "name";
using (var document = new Aspose.Pdf.Document())
{
var page = document.Pages.Add();
var dictionaryEditor = new Aspose.Pdf.DataEditor.DictionaryEditor(page);
dictionaryEditor[KEY_NAME] = new Aspose.Pdf.DataEditor.CosPdfName("name");
var value = dictionaryEditor[KEY_NAME];
// or
Aspose.Pdf.DataEditor.ICosPdfPrimitive primitive;
dictionaryEditor.TryGetValue(KEY_NAME, out primitive);
}
}
private static void RemoveFromPdfPageDicrionary()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_DocumentConversion();
string KEY_NAME = "name";
string EXPECTED_NAME = "name data";
using (var document = new Aspose.Pdf.Document())
{
var page = document.Pages.Add();
var dictionaryEditor = new Aspose.Pdf.DataEditor.DictionaryEditor(page);
dictionaryEditor.Add(KEY_NAME, new Aspose.Pdf.DataEditor.CosPdfName(EXPECTED_NAME));
dictionaryEditor.Remove(KEY_NAME);
// Save PDF document
document.Save(dataDir + "PageDictionaryEditorRemove_out.pdf");
}
}
Le formulaire peut être trouvé et le texte peut être remplacé en utilisant le snippet de code suivant :
private static void ReplaceTextInPdfForm()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Forms();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "TextBox.pdf"))
{
// Get the forms from the first page
var forms = document.Pages[1].Resources.Forms;
foreach (var form in forms)
{
// Check if the form is of type "Typewriter" and subtype "Form"
if (form.IT == "Typewriter" && form.Subtype == "Form")
{
// Create a TextFragmentAbsorber to find text fragments
var absorber = new Aspose.Pdf.Text.TextFragmentAbsorber();
absorber.Visit(form);
// Clear the text in each fragment
foreach (var fragment in absorber.TextFragments)
{
fragment.Text = "";
}
}
}
// Save PDF document
document.Save(dataDir + "TextBox_out.pdf");
}
}
Ou, le formulaire peut être complètement supprimé :
private static void DeleteSpecifiedForm1()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Forms();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "TextField.pdf"))
{
// Get the forms from the first page
var forms = document.Pages[1].Resources.Forms;
// Iterate through the forms and delete the ones with type "Typewriter" and subtype "Form"
for (int i = forms.Count; i > 0; i--)
{
if (forms[i].IT == "Typewriter" && forms[i].Subtype == "Form")
{
forms.Delete(forms[i].Name);
}
}
// Save PDF document
document.Save(dataDir + "TextBox_out.pdf");
}
}
Une autre variante de suppression du formulaire :
private static void DeleteSpecifiedForm2()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Forms();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "TextField.pdf"))
{
// Get the forms from the first page
var forms = document.Pages[1].Resources.Forms;
// Iterate through the forms and delete the ones with type "Typewriter" and subtype "Form"
foreach (var form in forms)
{
if (form.IT == "Typewriter" && form.Subtype == "Form")
{
var name = forms.GetFormName(form);
forms.Delete(name);
}
}
// Save PDF document
document.Save(dataDir + "TextBox_out.pdf");
}
}
private static void RemoveAllForms()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Forms();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "TextField.pdf"))
{
// Get the forms from the first page
var forms = document.Pages[1].Resources.Forms;
// Clear all forms
forms.Clear();
// Save PDF document
document.Save(dataDir + "TextBox_out.pdf");
}
}
private static void ConvertPDFtoMarkup()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_DocumentConversion();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "demo.pdf"))
{
// Create an instance of MarkdownSaveOptions to configure the Markdown export settings
var saveOptions = new MarkdownSaveOptions()
{
// Set to false to prevent the use of HTML <img> tags for images in the Markdown output
UseImageHtmlTag = false
};
// Specify the directory name where resources (like images) will be stored
saveOptions.ResourcesDirectoryName = "images";
// Save PDF document in Markdown format to the specified output file path using the defined save options
document.Save(dataDir + "PDFtoMarkup_out.md", saveOptions);
}
}
private static void ConvertOFDToPDF()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_DocumentConversion();
// Convert options
var options = new Aspose.Pdf.OfdLoadOptions();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "ConvertOFDToPDF.ofd", options))
{
// Save PDF document
document.Save(dataDir + "ConvertOFDToPDF_out.pdf");
}
}
À partir de cette version, le plugin Merger a été ajouté :
private static void PdfMergeUsingPlugin()
{
string dataDir = RunExamples.GetDataDir_AsposePdf_Pages();
// Create annotation new instance of Merger
using (var merger = new Aspose.Pdf.Plugins.Merger())
{
// Create MergeOptions
var opt = new Aspose.Pdf.Plugins.MergeOptions();
opt.AddInput(new Aspose.Pdf.Plugins.FileDataSource(dataDir + "Concat1.pdf"));
opt.AddInput(new Aspose.Pdf.Plugins.FileDataSource(dataDir + "Concat2.pdf"));
opt.AddOutput(new Aspose.Pdf.Plugins.FileDataSource(dataDir + "ConcatenatePdfFiles_out.pdf"));
// Process the PDF merging
merger.Process(opt);
}
}
De plus, à partir de cette version, le plugin ChatGPT a été ajouté :
private static async void InvokeChatGptPlugin()
{
using (var plugin = new Aspose.Pdf.Plugins.PdfChatGpt())
{
var options = new Aspose.Pdf.Plugins.PdfChatGptRequestOptions();
options.AddOutput(new Aspose.Pdf.Plugins.FileDataSource("PdfChatGPT_output.pdf")); // Add the output file path.
options.ApiKey = "Your API key."; // You need to provide the key to access the API.
options.MaxTokens = 1000; // The maximum number of tokens to generate in the chat completion.
// Add the request messages.
options.Messages.Add(new Aspose.Pdf.Plugins.Message
{
Content = "You are annotation helpful assistant.",
Role = Aspose.Pdf.Plugins.Role.System
});
options.Messages.Add(new Aspose.Pdf.Plugins.Message
{
Content = "What is the biggest pizza diameter ever made?",
Role = Aspose.Pdf.Plugins.Role.User
});
// Process the request.
var result = await plugin.ProcessAsync(options);
var fileResultPath = result.ResultCollection[0].Data;
// The ChatGPT API chat completion object.
var chatCompletionObject = result.ResultCollection[1].Data as Aspose.Pdf.Plugins.ChatCompletion;
}
}
À partir de cette version, il est possible de supprimer le texte caché d’un fichier PDF :
private static void RemoveHiddenText()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Text();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "HiddenText.pdf"))
{
// Use TextFragmentAbsorber with no parameters to get all text
var textAbsorber = new Aspose.Pdf.Text.TextFragmentAbsorber();
// This option can be used to prevent other text fragments from moving after hidden text replacement
textAbsorber.TextReplaceOptions = new Aspose.Pdf.Text.TextReplaceOptions(Aspose.Pdf.Text.TextReplaceOptions.ReplaceAdjustment.None);
document.Pages.Accept(textAbsorber);
// Remove hidden text
foreach (var fragment in textAbsorber.TextFragments)
{
if (fragment.TextState.Invisible)
{
fragment.Text = "";
}
}
// Save PDF document
document.Save(dataDir + "HiddenText_out.pdf");
}
}
Depuis 23.11, prise en charge de l’interruption de thread :
private static void InterruptExample()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
using (var monitor = new Aspose.Pdf.Multithreading.InterruptMonitor())
{
// An class that can produce long-drawn-out work
RowSpanWorker worker = new RowSpanWorker(dataDir + "RowSpanWorker_out.pdf", monitor);
var thread = new System.Threading.Thread(new System.Threading.ThreadStart(worker.Work));
thread.Start();
// The timeout should be less than the time required for full document save (without interruption)
System.Threading.Thread.Sleep(500);
// Interrupt the process
monitor.Interrupt();
// Wait for interruption...
thread.Join();
}
}
private class RowSpanWorker
{
private readonly string outputPath;
private readonly Aspose.Pdf.Multithreading.InterruptMonitor monitor;
public RowSpanWorker(string outputPath, Aspose.Pdf.Multithreading.InterruptMonitor monitor)
{
this.outputPath = outputPath;
this.monitor = monitor;
}
public void Work()
{
// This is some large text, used Lorem Ipsum in 10000 characters to cause suspension in processing
string text = RunExamples.GetLoremIpsumString(10000);
// Open PDF document
using (var document = new Aspose.Pdf.Document())
{
Aspose.Pdf.Multithreading.InterruptMonitor.ThreadLocalInstance = this.monitor;
var page = document.Pages.Add();
var table = new Aspose.Pdf.Table
{
DefaultCellBorder = new Aspose.Pdf.BorderInfo(Aspose.Pdf.BorderSide.All, 0.1F)
};
var row0 = table.Rows.Add();
// Add annotation cell that spans for two rows and contains annotation long-long text
var cell00 = row0.Cells.Add(text);
cell00.RowSpan = 2;
cell00.IsWordWrapped = true;
row0.Cells.Add("Ipsum Ipsum Ipsum Ipsum Ipsum Ipsum ");
row0.Cells.Add("Dolor Dolor Dolor Dolor Dolor Dolor ");
var row1 = table.Rows.Add();
row1.Cells.Add("IpsumDolor Dolor Dolor Dolor Dolor ");
row1.Cells.Add("DolorDolor Dolor Dolor Dolor Dolor ");
page.Paragraphs.Add(table);
try
{
// Save PDF document
document.Save(this.outputPath);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
La mise à jour actuelle présente trois versions de suppression des balises des PDF étiquetés.
private static void RemoveStructElement()
{
var dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "StructureElementsTree.pdf"))
{
// Access to root element(s)
var structure = document.LogicalStructure;
var documentElement = structure.Children[0];
var structElement = documentElement.Children.Count > 1 ? documentElement.Children[1] as Aspose.Pdf.Structure.StructElement : null;
if (documentElement.Children.Remove(structElement))
{
// Element removed. Save PDF document.
document.Save(dataDir + "StructureElementsRemoved.pdf");
}
// You can also delete the structElement itself
//if (structElement != null)
//{
// structElement.Remove();
// document.Save(outputPdfPath);
//}
}
}
private static void RemoveMarkedElementsTags()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "TH.pdf"))
{
// Access to root element(s)
var structure = document.LogicalStructure;
var root = structure.Children[0];
var queue = new Queue<Aspose.Pdf.Structure.Element>();
queue.Enqueue(root);
while (queue.TryDequeue(out var element))
{
foreach (var child in element.Children)
{
queue.Enqueue(child);
}
if (element is Aspose.Pdf.Structure.TextElement || element is Aspose.Pdf.Structure.FigureElement)
{
element.Remove();
}
}
// Save PDF document
document.Save(dataDir + "MarkedElementsTagsRemoved.pdf");
}
}
private static void RemoveTags()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "TH.pdf"))
{
// Access to root element(s)
var structure = document.LogicalStructure;
var documentElement = structure.Children[0];
documentElement.Remove();
// Save PDF document
document.Save(dataDir + "TagsRemoved.pdf");
}
}
Depuis 23.10, une nouvelle fonctionnalité a été implémentée pour mesurer la hauteur des caractères. Utilisez le code suivant pour mesurer la hauteur d’un caractère.
private static void DisplayCharacterHeight()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Text();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "ExtractTextAll.pdf"))
{
// Create TextFragmentAbsorber to get information about state of document text
var absorber = new Aspose.Pdf.Text.TextFragmentAbsorber();
absorber.Visit(document.Pages[1]);
// Get height of 'A' character being displayed with font of first text fragment
var textState = absorber.TextFragments[1].TextState;
var height = textState.MeasureHeight('A');
Console.WriteLine("The height of 'A' character displayed with {0} font size of {1} is {2:N3}", textState.Font.FontName, textState.FontSize,height);
}
}
Notez que la mesure est basée sur la police intégrée dans le document. Si des informations pour une dimension sont manquantes, cette méthode renvoie 0.
De plus, cette version fournit la signature d’un PDF en utilisant un HASH signé :
private static void SignPdfUsingSignedHash(string certP12, string pfxPassword)
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_SecuritySignatures();
// Instantiate PdfFileSignature object
using (var sign = new Aspose.Pdf.Facades.PdfFileSignature())
{
// Bind PDF document
sign.BindPdf(dataDir + "input.pdf");
var pkcs7 = new Aspose.Pdf.Forms.PKCS7(certP12, pfxPassword);
// Create a delegate to external sign
pkcs7.CustomSignHash = delegate (byte[] signableHash, Aspose.Pdf.DigestHashAlgorithm digestHashAlgorithm)
{
X509Certificate2 signerCert = new X509Certificate2(certP12, pfxPassword, X509KeyStorageFlags.Exportable);
RSACryptoServiceProvider rsaCSP = new RSACryptoServiceProvider();
var xmlString = signerCert.PrivateKey.ToXmlString(true); //not supported on core 2.0
rsaCSP.FromXmlString(xmlString); //not supported on core 2.0
byte[] signedData = rsaCSP.SignHash(signableHash, CryptoConfig.MapNameToOID("SHA1"));
return signedData;
};
// Sign PDF file
sign.Sign(1, "reason", "cont", "loc", false, new System.Drawing.Rectangle(0, 0, 500, 500), pkcs7);
// Save PDF document
sign.Save(dataDir + "SignWithCertificate_out.pdf");
}
// Verify
using (var sign = new Aspose.Pdf.Facades.PdfFileSignature())
{
// Bind PDF document
sign.BindPdf(dataDir + "SignWithCertificate_out.pdf");
if (!sign.VerifySignature("Signature1"))
{
throw new Exception("Not verified");
}
}
}
Une autre nouvelle fonctionnalité est les préréglages de mise à l’échelle de page de la boîte de dialogue d’impression :
private static void SetPrintScaling()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdfFacades_Printing();
// Create PDF document
using (var document = new Aspose.Pdf.Document())
{
// Add page
document.Pages.Add();
// Disable print scaling
document.PrintScaling = PrintScaling.None;
// Save PDF document
document.Save(dataDir + "SetPrintScaling_out.pdf");
}
}
Depuis 23.9, prise en charge de la suppression d’une annotation enfant d’un champ remplissable.
private static void RemoveChildAnnotationFromFillableField()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Forms();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "FieldWithChildAnnots.pdf"))
{
// Get field with child annotations
var field = (Aspose.Pdf.Forms.Field)document.Form["1 Vehicle Identification Number"];
// Get first child annotation
var annotation = field[1];
// Remove the annotation
document.Pages[annotation.PageIndex].Annotations.Remove(annotation);
// Save PDF document
document.Save(dataDir + "RemoveChildAnnotation_out.pdf");
}
}
Depuis 23.8, prise en charge de la détection des mises à jour incrémentielles.
La fonction de détection des mises à jour incrémentielles dans un document PDF a été ajoutée. Cette fonction renvoie ’true’ si un document a été enregistré avec des mises à jour incrémentielles ; sinon, elle renvoie ‘false’.
private static bool HasIncrementalUpdate()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "PdfWithIncrementalUpdate.pdf"))
{
// New method
bool hasIncrementalUpdate = document.HasIncrementalUpdate();
Console.WriteLine("Document {0} incremental update check returns: {1}", document.FileName, hasIncrementalUpdate);
return hasIncrementalUpdate;
}
}
De plus, 23.8 prend en charge les moyens de travailler avec des champs de case à cocher imbriqués. De nombreux formulaires PDF remplissables ont des champs de case à cocher qui agissent comme des groupes de boutons radio :
private static void CreateMultivalueCheckboxField()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Forms();
// Create PDF document
using (var document = new Aspose.Pdf.Document())
{
var page = document.Pages.Add();
var checkbox = new Aspose.Pdf.Forms.CheckboxField(page, new Aspose.Pdf.Rectangle(50, 50, 70, 70));
// Set the first checkbox group option value
checkbox.ExportValue = "option 1";
// Add new option right under existing ones
checkbox.AddOption("option 2");
// Add new option at the given rectangle
checkbox.AddOption("option 3", new Aspose.Pdf.Rectangle(100, 100, 120, 120));
document.Form.Add(checkbox);
// Select the added checkbox
checkbox.Value = "option 2";
// Save PDF document
document.Save(dataDir + "MultivalueCheckboxField.pdf");
}
}
private static void GetAndSetValueOfMultivalueCheckboxField()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Forms();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "MultivalueCheckboxField.pdf"))
{
var form = document.Form;
var checkbox = form.Fields[0] as Aspose.Pdf.Forms.CheckboxField;
// Allowed values may be retrieved from the AllowedStates collection
// Set the checkbox value using Value property
checkbox.Value = checkbox.AllowedStates[0];
var checkboxValue = checkbox.Value; // the previously set value, e.g. "option 1"
// The value should be any element of AllowedStates
checkbox.Value = "option 2";
checkboxValue = checkbox.Value; // option 2
// Uncheck boxes by either setting Value to "Off" or setting Checked to false
checkbox.Value = "Off";
// or, alternately:
// checkbox.Checked = false;
checkboxValue = checkbox.Value; // Off
}
}
Depuis Aspose.PDF 23.7, prise en charge de l’ajout de l’extraction de formes :
private static void CopyShape()
{
// The path to the document directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Graphs();
// Open PDF document
using (var sourceDocument = new Aspose.Pdf.Document(dataDir + "test.pdf"))
{
// Create PDF document
using (var destDocument = new Aspose.Pdf.Document())
{
// Absorb vector graphics from the source document
var graphicAbsorber = new Aspose.Pdf.Vector.GraphicsAbsorber();
graphicAbsorber.Visit(sourceDocument.Pages[1]);
// Copy the graphics into the destination document specified page and area
var area = new Aspose.Pdf.Rectangle(90, 250, 300, 400);
destDocument.Pages[1].AddGraphics(graphicAbsorber.Elements, area);
// Save PDF document
destDocument.Save(dataDir + "CopyShape_out.pdf");
}
}
}
Prise en charge également de la détection de débordement lors de l’ajout de texte :
private static void FitTextIntoRectangle()
{
// The path to the document directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Text();
// Create PDF document
using (var document = new Aspose.Pdf.Document())
{
// Generate text to add: "Lorem Ipsum" text of 1000 characters
var paragraphContent = RunExamples.GetLoremIpsumString(1000);
// Create a text fragment with the desired text
var fragment = new Aspose.Pdf.Text.TextFragment(paragraphContent);
// Declare the rectangle to fit text into
var rectangle = new Aspose.Pdf.Rectangle(100, 600, 500, 700, false);
// Check whether the text fits into the rectangle
var isFitRectangle = fragment.TextState.IsFitRectangle(paragraphContent, rectangle);
// Iteratively decrease font size until text fits the rectangle
while (!isFitRectangle)
{
fragment.TextState.FontSize -= 0.5f;
isFitRectangle = fragment.TextState.IsFitRectangle(paragraphContent, rectangle);
}
// Create a paragraph from the text fragment in the specified rectangle. Now you may be sure it fits.
var paragraph = new Aspose.Pdf.Text.TextParagraph();
paragraph.VerticalAlignment = Aspose.Pdf.VerticalAlignment.Top;
paragraph.FormattingOptions.WrapMode = Aspose.Pdf.Text.TextFormattingOptions.WordWrapMode.ByWords;
paragraph.Rectangle = rectangle;
paragraph.AppendLine(fragment);
// Create a text builder to place the paragraph on the document page
var builder = new Aspose.Pdf.Text.TextBuilder(document.Pages.Add());
builder.AppendParagraph(paragraph);
// Save PDF document
document.Save(dataDir + "FitTextIntoRectangle_out.pdf");
}
}
Depuis Aspose.PDF 23.6, prise en charge de l’ajout des plugins suivants :
Mise à jour de l’Aspose.PdfForm
Prise en charge également de l’ajout de la possibilité de définir le titre de la page HTML, Epub :
private static void SetHtmlTitle()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_DocumentConversion();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "PDFToHTML.pdf"))
{
var options = new Aspose.Pdf.HtmlSaveOptions
{
ExplicitListOfSavedPages = new[] { 1 },
SplitIntoPages = false,
FixedLayout = true,
CompressSvgGraphicsIfAny = false,
SaveTransparentTexts = true,
SaveShadowedTextsAsTransparentTexts = true,
FontSavingMode = Aspose.Pdf.HtmlSaveOptions.FontSavingModes.AlwaysSaveAsWOFF,
RasterImagesSavingMode = Aspose.Pdf.HtmlSaveOptions.RasterImagesSavingModes.AsEmbeddedPartsOfPngPageBackground,
PartsEmbeddingMode = Aspose.Pdf.HtmlSaveOptions.PartsEmbeddingModes.EmbedAllIntoHtml,
// New property
Title = "Title for page"
};
// Save HTML document
document.Save(dataDir + "SetHtmlTitle_out.html", options);
}
}
Depuis 23.5, prise en charge de l’ajout de l’option FontSize de RedactionAnnotation. Utilisez le snippet de code suivant pour résoudre cette tâche :
private static void AddRedactionAnnotationFontSize()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Annotations();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "input.pdf"))
{
// Create RedactionAnnotation instance for specific page region
var annot = new Aspose.Pdf.Annotations.RedactionAnnotation(document.Pages[1],
new Aspose.Pdf.Rectangle(367, 756.919982910156, 420, 823.919982910156));
annot.FillColor = Aspose.Pdf.Color.Black;
annot.BorderColor = Aspose.Pdf.Color.Yellow;
annot.Color = Aspose.Pdf.Color.Blue;
// Text to be printed on redact annotation
annot.OverlayText = "(Unknown)";
annot.TextAlignment = Aspose.Pdf.HorizontalAlignment.Center;
// Repat Overlay text over redact Annotation
annot.Repeat = false;
// New property
annot.FontSize = 20;
// Add annotation to annotations collection of first page
document.Pages[1].Annotations.Add(annot);
// Flattens annotation and redacts page contents (i.e. removes text and image under redacted annotation)
annot.Redact();
// Save PDF document
document.Save(dataDir + "AddRedactionAnnotationFontSize_out.pdf");
}
}
Aspose.PDF a annoncé la sortie du SDK .NET 7.
Depuis Aspose.PDF 23.3, prise en charge de l’ajout des plugins suivants :
La version 23.3 a introduit la prise en charge du maintien des proportions et de la résolution des images lors de l’insertion sur la page. Deux méthodes peuvent être utilisées pour résoudre ce problème :
private static void InsertImageWithNativeResolutionAsTable()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Images();
// Create PDF document
using (var document = new Aspose.Pdf.Document())
{
var page = document.Pages.Add();
var table = new Aspose.Pdf.Table
{
ColumnWidths = "600"
};
for (var j = 0; j < 2; j++)
{
var row = table.Rows.Add();
var cell = row.Cells.Add();
cell.Paragraphs.Add(new Aspose.Pdf.Image()
{
IsApplyResolution = true,
File = dataDir + "Image1.jpg"
});
}
page.Paragraphs.Add(table);
// Save PDF document
document.Save(dataDir + "ImageWithNativeResolutionAsTable_out.pdf");
}
}
Et la deuxième approche :
private static void InsertImageWithNativeResolutionAsParagraph()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Images();
// Create PDF document
using (var document = new Aspose.Pdf.Document())
{
var page = document.Pages.Add();
for (var j = 0; j < 2; j++)
{
page.Paragraphs.Add(new Aspose.Pdf.Image()
{
IsApplyResolution = true,
File = dataDir + "Image1.jpg"
});
}
// Save PDF document
document.Save(dataDir + "ImageWithNativeResolutionAsParagraph_out.pdf");
}
}
L’image sera placée à une taille mise à l’échelle et à une résolution native. Vous pouvez définir les propriétés FixedWidth ou FixedHeight en combinaison avec IsApplyResolution.
Depuis Aspose.PDF 23.1.1, prise en charge de l’ajout des plugins suivants :
Depuis la version 23.1, prise en charge de la création d’annotations PrinterMark.
Les marques d’imprimeur sont des symboles graphiques ou du texte ajoutés à une page pour aider le personnel de production à identifier les composants d’un travail à plusieurs plaques et à maintenir une sortie cohérente pendant la production. Des exemples couramment utilisés dans l’industrie de l’impression incluent :
Nous allons montrer l’exemple de l’option avec des barres de couleur pour mesurer les couleurs et les densités d’encre. Il existe une classe abstraite de base PrinterMarkAnnotation et à partir de celle-ci, une classe enfant ColorBarAnnotation - qui implémente déjà ces bandes. Vérifions l’exemple :
private static void AddPrinterMarkAnnotation()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Annotations();
// Create PDF document
using (var document = new Aspose.Pdf.Document())
{
var page = document.Pages.Add();
page.TrimBox = new Aspose.Pdf.Rectangle(20, 20, 580, 820);
var rectBlack = new Aspose.Pdf.Rectangle(100, 300, 300, 320);
var rectCyan = new Aspose.Pdf.Rectangle(200, 600, 260, 690);
var rectMagenta = new Aspose.Pdf.Rectangle(10, 650, 140, 670);
var colorBarBlack = new Aspose.Pdf.Annotations.ColorBarAnnotation(page, rectBlack);
var colorBarCyan = new Aspose.Pdf.Annotations.ColorBarAnnotation(page, rectCyan,
Aspose.Pdf.Annotations.ColorsOfCMYK.Cyan);
var colorBarMagenta = new Aspose.Pdf.Annotations.ColorBarAnnotation(page, rectMagenta);
colorBarMagenta.ColorOfCMYK = Aspose.Pdf.Annotations.ColorsOfCMYK.Magenta;
var colorBarYellow = new Aspose.Pdf.Annotations.ColorBarAnnotation(page,
new Aspose.Pdf.Rectangle(400, 250, 450, 700), Aspose.Pdf.Annotations.ColorsOfCMYK.Yellow);
page.Annotations.Add(colorBarBlack);
page.Annotations.Add(colorBarCyan);
page.Annotations.Add(colorBarMagenta);
page.Annotations.Add(colorBarYellow);
// Save PDF document
document.Save(dataDir + "PrinterMarkAnnotation_out.pdf");
}
}
Prise en charge également de l’extraction d’images vectorielles. Essayez d’utiliser le code suivant pour détecter et extraire des graphiques vectoriels :
private static void SavePdfVectorGraphicToSvg()
{
// The path to the document directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Graphs();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "test.pdf"))
{
// Attempt to save the vector graphics into a specified SVG file
document.Pages[1].TrySaveVectorGraphics(dataDir + "PdfVectorGraphicToSvg.svg");
}
}
À partir de cette version, prise en charge de la conversion de PDF en image DICOM.
private static void PdfToDicom()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Images();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "PagesToImages.pdf"))
{
var dicom = new Aspose.Pdf.Devices.DicomDevice();
FileStream outStream = new FileStream(dataDir + "PdfToDicom_out.dcm", FileMode.Create, FileAccess.ReadWrite);
dicom.Process(document.Pages[1], outStream);
}
}
Depuis 22.09, prise en charge de l’ajout de propriétés pour modifier l’ordre des rubriques de sujet (E=, CN=, O=, OU=, ) dans la signature.
private static void SignPdfWithModifiedOrderOfSubjectRubrics(string pfxFilePath, string password)
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_SecuritySignatures();
// Instantiate PdfFileSignature object
using (var fileSign = new Aspose.Pdf.Facades.PdfFileSignature())
{
// Bind PDF document
fileSign.BindPdf(dataDir + "DigitallySign.pdf");
var rect = new System.Drawing.Rectangle(100, 100, 400, 100);
var signature = new Aspose.Pdf.Forms.PKCS7Detached(pfxFilePath, password);
// Set signature custom appearance
signature.CustomAppearance = new Aspose.Pdf.Forms.SignatureCustomAppearance()
{
UseDigitalSubjectFormat = true,
DigitalSubjectFormat = new Aspose.Pdf.Forms.SubjectNameElements[] { Aspose.Pdf.Forms.SubjectNameElements.CN, Aspose.Pdf.Forms.SubjectNameElements.O }
//or
//DigitalSubjectFormat = new Aspose.Pdf.Forms.SubjectNameElements[] { Aspose.Pdf.Forms.SubjectNameElements.OU, Aspose.Pdf.Forms.SubjectNameElements.S, Aspose.Pdf.Forms.SubjectNameElements.C }
};
// Sign PDF file
fileSign.Sign(1, true, rect, signature);
// Save PDF document
fileSign.Save(dataDir + "SignPdfWithModifiedOrderOfSubjectRubrics_out.pdf");
}
}
Depuis 22.5, prise en charge de l’extraction de texte SubScript et SuperScript à partir de PDF.
Si le document PDF contient du texte SubScript et SuperScript tel que H2O, alors l’extraction du texte à partir du PDF doit également extraire leurs informations de formatage (dans le texte brut extrait). Si le PDF contient du texte en italique, il doit également être inclus dans le contenu extrait.
private static void ExtractTextSuperscript()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Text();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "TextWithSubscriptsSuperscripts.pdf"))
{
// Use TextFragmentAbsorber with no parameters to get all text
var absorber = new Aspose.Pdf.Text.TextFragmentAbsorber();
absorber.Visit(document.Pages[1]);
// Iterate through text fragments to find superscript text
foreach (var textFragment in absorber.TextFragments)
{
if (textFragment.TextState.Superscript)
{
Console.WriteLine(String.Format("Text {0} at {1} is superscript!", textFragment.Text, textFragment.Position));
}
}
}
}
Cette version comprend des informations pour Aspose.PDF for .NET :
exemple
private static void ConvertPdfToOds()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "input.pdf"))
{
// Instantiate ExcelSaveOptions object
var saveOptions = new Aspose.Pdf.ExcelSaveOptions
{
// Specify the desired table file format
Format = Aspose.Pdf.ExcelSaveOptions.ExcelFormat.ODS
};
// Save the file in ODS format
document.Save(dataDir + "PDFToODS_out.ods", saveOptions);
}
}
PDF à XMLSpreadSheet2003 : Reconnaître le texte en exposant et en indice ;
PDF à Excel : Reconnaître le texte en exposant et en indice ;
Supprimer les signatures UR lors de l’enregistrement du document ;
Supprimer le drapeau Suspects dans MarkInfo lors de l’enregistrement du document ;
Supprimer les informations lors de l’enregistrement du document.
Cette version comprend les mises à jour suivantes :
Prise en charge de AFRelationship ;
Validation de l’en-tête PDF ;
Supprimer le sous-filtre adbe.x509.rsa_sha1 lors de l’enregistrement du document ;
Formater le champ en tant que nombre et format de date ;
Interdire l’utilisation du chiffrement RC4 dans FDF 2.0.
Depuis la version 22.2, il est possible de signer un document en utilisant PdfFileSignature avec LTV, et avec la possibilité de changer le hachage de SHA1 à SHA256.
private static void SignPdfWithSha256(string pfxFilePath, string password)
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_SecuritySignatures();
// Instantiate PdfFileSignature object
using (var fileSign = new Aspose.Pdf.Facades.PdfFileSignature())
{
// Bind PDF document
fileSign.BindPdf(dataDir + "DigitallySign.pdf");
var rect = new System.Drawing.Rectangle(300, 100, 1, 1);
var signature = new Aspose.Pdf.Forms.PKCS7(pfxFilePath, password)
{
UseLtv = true,
TimestampSettings = new Aspose.Pdf.TimestampSettings("http://freetsa.org/tsr", string.Empty, Aspose.Pdf.DigestHashAlgorithm.Sha256)
};
// Sign PDF file
fileSign.Sign(1, false, rect, signature);
// Save PDF document
fileSign.Save(dataDir + "SignPdfWithSha256_out.pdf");
}
}
Maintenant, Aspose.PDF for .NET prend en charge le chargement de documents à partir de l’un des formats de document les plus populaires, le format de document portable (PDF) version 2.0.
private static void EncriptPdfNonlatinPassCharacters()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_SecuritySignatures();
using (var fileSecurity = new Aspose.Pdf.Facades.PdfFileSecurity())
{
// Bind PDF document
fileSecurity.BindPdf(dataDir + "input.pdf");
// Encrypt file using 256-bit encryption
bool isSuccessful = fileSecurity.EncryptFile("æøå", "æøå", Aspose.Pdf.Facades.DocumentPrivilege.Print,
Aspose.Pdf.Facades.KeySize.x256, Aspose.Pdf.Facades.Algorithm.AES);
Console.WriteLine(isSuccessful);
// Save PDF document
fileSecurity.Save(dataDir + "PdfNonlatinPassEncrypted_out.pdf");
}
}
Veuillez utiliser TextState.Invisible pour obtenir des informations sur l’invisibilité du texte en dehors du paramètre de mode de rendu.
Nous avons utilisé le code suivant pour les tests :
private static void DisplayTextInvisibility()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Text();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "PdfWithHiddenText.pdf"))
{
Console.WriteLine(document.FileName);
// Use TextFragmentAbsorber with no parameters to get all text
var absorber = new Aspose.Pdf.Text.TextFragmentAbsorber();
absorber.Visit(document.Pages[1]);
var textFragmentCollection = absorber.TextFragments;
// Iterate through text fragments to find hidden text
for (int i = 1; i <= textFragmentCollection.Count; i++)
{
var fragment = textFragmentCollection[i];
Console.WriteLine("Fragment {0} at {1}", i, fragment.Rectangle.ToString());
Console.WriteLine("Text: {0}", fragment.Text);
Console.WriteLine("RenderingMode: {0}", fragment.TextState.RenderingMode.ToString());
Console.WriteLine("Invisibility: {0}", fragment.TextState.Invisible);
Console.WriteLine("---");
}
}
}
private static void GetPdfLayers()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Layers();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "PdfWithLayers.pdf"))
{
// Get layers from the first page
var layers = document.Pages[1].Layers;
// Save each layer to the output path
foreach (var layer in layers)
{
Console.WriteLine("Document {0} contains a layer named: {1} ", document.FileName, layer.Name);
}
}
}
Personnalisez la couleur de fond pour l’apparence de la signature et la couleur de la police des étiquettes dans la zone de signature avec Aspose.PDF for .NET.
private static void SignPdfWithCustomColorsInAppearance(string pfxFilePath, string password)
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_SecuritySignatures();
// Instantiate PdfFileSignature object
using (var pdfFileSignature = new Aspose.Pdf.Facades.PdfFileSignature())
{
// Bind PDF document
pdfFileSignature.BindPdf(dataDir + "DigitallySign.pdf");
var rect = new System.Drawing.Rectangle(310, 45, 200, 50);
// Create PKCS#7 object for sign
var pkcs = new Aspose.Pdf.Forms.PKCS7(pfxFilePath, password);
// Set signature custom appearance
pkcs.CustomAppearance = new Aspose.Pdf.Forms.SignatureCustomAppearance()
{
// Set colors
ForegroundColor = Aspose.Pdf.Color.DarkGreen,
BackgroundColor = Aspose.Pdf.Color.LightSeaGreen,
};
// Sign PDF file
pdfFileSignature.Sign(1, true, rect, pkcs);
// Save PDF document
pdfFileSignature.Save(dataDir + "SignPdfWithCustomColorsInAppearance_out.pdf");
}
}
Dans la version 21.8, la propriété ForegroundColor permet de changer la couleur du texte dans la signature numérique.
private static void SignPdfWithForegroundColorInAppearance(string pfxFilePath, string password)
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_SecuritySignatures();
// Instantiate PdfFileSignature object
using (var pdfSign = new Aspose.Pdf.Facades.PdfFileSignature())
{
// Bind PDF document
pdfSign.BindPdf(dataDir + "DigitallySign.pdf");
var rect = new System.Drawing.Rectangle(310, 45, 200, 50);
// Create PKCS#7 object for sign
var pkcs = new Aspose.Pdf.Forms.PKCS7(pfxFilePath, password);
// Set signature custom appearance
pkcs.CustomAppearance = new Aspose.Pdf.Forms.SignatureCustomAppearance()
{
// Set text color
ForegroundColor = Aspose.Pdf.Color.Green
};
// Sign PDF file
pdfSign.Sign(1, true, rect, pkcs);
// Save PDF document
pdfSign.Save(dataDir + "SignPdfWithForegroundInAppearance_out.pdf");
}
}
Pour ajouter des paramètres XSL, nous devons créer notre propre XsltArgumentList et le définir comme propriété dans XslFoLoadOptions. Le snippet suivant montre comment utiliser cette classe avec les fichiers d’exemple décrits ci-dessus.
private static void ConvertXslfoToPdfWithArgumentList()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_DocumentConversion();
// Create convert options
var options = new Aspose.Pdf.XslFoLoadOptions(dataDir + "XSLFOToPdfInput.xslt");
// Example of using XsltArgumentList
options.XsltArgumentList = new XsltArgumentList();
options.XsltArgumentList.AddParam("isBoldName", "", "yes");
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "XSLFOToPdfInput.xml", options))
{
// Save PDF document
document.Save(dataDir + "XslfoToPdfWithArgumentList_out.pdf");
}
}
Avec Aspose.PDF for .NET, vous pouvez masquer des images en utilisant ImagePlacementAbsorber du document :
private static void HideImageInPdf()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Images();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "ImagePlacement.pdf"))
{
// Create ImagePlacementAbsorber instance
var absorber = new Aspose.Pdf.ImagePlacementAbsorber();
// Load the images of the first page
document.Pages[1].Accept(absorber);
// Iterate through each image placement on the first page
foreach (var imagePlacement in absorber.ImagePlacements)
{
// Hide image
imagePlacement.Hide();
}
// Save PDF document
document.Save(dataDir + "HideImageInPdf_out.pdf");
}
}
Vous pouvez obtenir une police complète avec le préfixe avec la propriété BaseFont pour la classe Font.
private static void DisplayFontFullNames()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "BreakfastMenu.pdf"))
{
// Get document fonts
var fonts = document.FontUtilities.GetAllFonts();
// Iterate through the fonts
foreach (var font in fonts)
{
// Show font names
Console.WriteLine($"font name : {font.FontName} BaseFont name : {font.BaseFont}");
}
}
}
Aspose.PDF 21.4 vous permet de combiner des images. Suivez le snippet de code suivant :
private static void MergeAsJpeg()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Images();
List<Stream> inputImagesStreams = new List<Stream>();
using (FileStream firstImageStream = new FileStream(dataDir + "aspose.jpg", FileMode.Open))
{
inputImagesStreams.Add(firstImageStream);
using (FileStream secondImageStream = new FileStream(dataDir + "aspose-logo.jpg", FileMode.Open))
{
inputImagesStreams.Add(secondImageStream);
// Invoke PdfConverter.MergeImages to perform merge
using (Stream inputStream = Aspose.Pdf.Facades.PdfConverter.MergeImages(inputImagesStreams,
Aspose.Pdf.Drawing.ImageFormat.Jpeg, Aspose.Pdf.Facades.ImageMergeMode.Vertical, 1, 1))
{
using (FileStream outputStream = new FileStream(dataDir + "Merge_out.jpg", FileMode.Create))
{
byte[] buffer = new byte[32768];
int read;
while ((read = inputStream.Read(buffer, 0, buffer.Length)) > 0)
{
outputStream.Write(buffer, 0, read);
}
}
}
}
}
}
Vous pouvez également fusionner vos images au format Tiff :
private static void MergeAsTiff()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Images();
List<Stream> inputImagesStreams = new List<Stream>();
using (FileStream firstImageStream = new FileStream(dataDir + "aspose.jpg", FileMode.Open))
{
inputImagesStreams.Add(firstImageStream);
using (FileStream secondImageStream = new FileStream(dataDir + "aspose-logo.jpg", FileMode.Open))
{
inputImagesStreams.Add(secondImageStream);
// Invoke PdfConverter.MergeImagesAsTiff to perform merge
using (Stream inputStream = Aspose.Pdf.Facades.PdfConverter.MergeImagesAsTiff(inputImagesStreams))
{
using (FileStream outputStream = new FileStream(dataDir + "Merge_out.tiff", FileMode.Create))
{
byte[] buffer = new byte[32768];
int read;
while ((read = inputStream.Read(buffer, 0, buffer.Length)) > 0)
{
outputStream.Write(buffer, 0, read);
}
}
}
}
}
}
Avec le snippet de code suivant, vous devriez être en mesure d’accéder à la charge utile chiffrée de vos fichiers PDF, protégés par la protection des informations Azure :
private static void AzureInformationProtection()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Attachments();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "GetAlltheAttachments.pdf"))
{
if (document.EmbeddedFiles[1].AFRelationship == Aspose.Pdf.AFRelationship.EncryptedPayload)
{
if (document.EmbeddedFiles[1].EncryptedPayload != null)
{
// document.EmbeddedFiles[1].EncryptedPayload.Type == "EncryptedPayload"
// document.EmbeddedFiles[1].EncryptedPayload.Subtype == "MicrosoftIRMServices"
// document.EmbeddedFiles[1].EncryptedPayload.Version == "2"
}
}
}
}
Dans cette version d’Aspose.PDF, la fonction est devenue disponible pour récupérer la couleur de fond. Vous devez spécifier searchOptions.SearchForTextRelatedGraphics = true; dans les options de l’objet TextFragmentAbsorber.
Veuillez considérer le code suivant :
private static void DisplayPdfTextBackgroundColor()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Text();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "PdfWithTextBackgroundColor.pdf"))
{
// Use TextFragmentAbsorber with no parameters to get all text
var textFragmentAbsorber = new Aspose.Pdf.Text.TextFragmentAbsorber();
var searchOptions = new Aspose.Pdf.Text.TextSearchOptions(false);
// Setting this option into the 'true' is necessary
searchOptions.SearchForTextRelatedGraphics = true;
textFragmentAbsorber.TextSearchOptions = searchOptions;
// Accept the absorber for all the pages
document.Pages.Accept(textFragmentAbsorber);
// Loop through the fragments
foreach (var textFragment in textFragmentAbsorber.TextFragments)
{
Console.WriteLine("Text: '{0}'", textFragment.Text);
Console.WriteLine("BackgroundColor: '{0}'", textFragment.TextState.BackgroundColor);
Console.WriteLine("ForegroundColor: '{0}'", textFragment.TextState.ForegroundColor);
Console.WriteLine("Segment BackgroundColor: '{0}'", textFragment.Segments[1].TextState.BackgroundColor);
}
}
}
De plus, dans Aspose.PDF 21.1, après la conversion de PDF en HTML, les polices intégrées sont devenues disponibles dans le document HTML de sortie. Cela est possible avec la nouvelle option booléenne save option HtmlSaveParameter.SaveFullFont.
Voici le snippet de code :
private static void PdfToHtmlWithFullFont()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_DocumentConversion();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "PDFToHTML.pdf"))
{
// Instantiate HTML SaveOptions object
var options = new Aspose.Pdf.HtmlSaveOptions
{
RasterImagesSavingMode = Aspose.Pdf.HtmlSaveOptions.RasterImagesSavingModes.AsEmbeddedPartsOfPngPageBackground,
PartsEmbeddingMode = Aspose.Pdf.HtmlSaveOptions.PartsEmbeddingModes.EmbedAllIntoHtml,
LettersPositioningMethod = Aspose.Pdf.HtmlSaveOptions.LettersPositioningMethods.UseEmUnitsAndCompensationOfRoundingErrorsInCss,
FontSavingMode = Aspose.Pdf.HtmlSaveOptions.FontSavingModes.AlwaysSaveAsTTF,
SaveTransparentTexts = true,
// New option
SaveFullFont = true
};
// Save HTML document
document.Save(dataDir + "PdfToHtmlWithFullFont_out.html", options);
}
}
Analyzing your prompt, please hold on...
An error occurred while retrieving the results. Please refresh the page and try again.