Exis.PdfEditor logo

SDK recherche et remplacement PDF pour .NET

Rechercher et remplacer du texte dans des fichiers PDF par programmation avec C#. Edition directe des flux de contenu — sans conversion en DOCX, sans dependances externes, sans perte de donnees.

.NET CLI dotnet add package Exis.PdfEditor

PM Console Install-Package Exis.PdfEditor

Pourquoi Exis.PdfEditor

Comment fonctionnent les autres bibliotheques

La plupart des bibliotheques PDF .NET — IronPDF, Spire.PDF, Aspose, Syncfusion — remplacent le texte en convertissant le PDF dans un format intermediaire, en biffant le texte et en dessinant un nouveau texte par-dessus, ou en reconstruisant les pages a partir de zero.

Cette approche endommage :

  • Les champs de formulaire et les cases a cocher
  • Les signatures numeriques
  • L'espacement et le crenage du texte
  • La mise en page et le positionnement
  • Les signets et les destinations de liens

Comment fonctionne Exis.PdfEditor

Exis.PdfEditor analyse les flux de contenu PDF directement au niveau des octets. Il localise le texte dans les operateurs PDF reels, modifie uniquement les operandes de chaine cibles et ecrit en utilisant la mise a jour incrementielle PDF.

Tout ce qui n'est pas touche reste identique octet par octet :

  • Champs de formulaire et AcroForms : intacts
  • Signatures numeriques sur les pages non modifiees : preservees
  • Espacement et crenage du texte : preserves
  • Mise en page et structure : preservees
  • Signets, annotations, fichiers integres : preserves

Autres bibliotheques

PDF
Convertir en format intermediaire
Modifier
Reconvertir en PDF
Sortie (endommagee)

Exis.PdfEditor

PDF
Analyser les flux de contenu
Remplacer les operandes de texte
Mise a jour incrementielle
Sortie (identique sauf le texte remplace)

Code Samples

Remplacer du texte dans un PDF — 3 lignes de code

using Exis.PdfEditor;
using Exis.PdfEditor.Licensing;

ExisLicense.Initialize();  // Free 14-day trial - no key needed

var result = PdfFindReplace.Execute(
    "contract.pdf",
    "contract-updated.pdf",
    "Acme Corporation",
    "Globex Industries");

Console.WriteLine($"Replaced {result.TotalReplacements} occurrences " +
                  $"across {result.PagesModified} pages.");

Remplacements multiples en un seul passage

var pairs = new[]
{
    new FindReplacePair("2025", "2026"),
    new FindReplacePair("Draft", "Final"),
    new FindReplacePair("CONFIDENTIAL", "PUBLIC"),
};

var result = PdfFindReplace.Execute(
    "report.pdf",
    "report-final.pdf",
    pairs);

Remplacement par motif avec expressions regulieres

var options = new PdfFindReplaceOptions { UseRegex = true };

// Replace all US phone numbers with a placeholder
var result = PdfFindReplace.Execute(
    "document.pdf",
    "redacted.pdf",
    @"\(\d{3}\)\s?\d{3}-\d{4}",
    "[PHONE REDACTED]",
    options);

Activer votre abonnement

// Purchase at officefindreplace.com/Home/pdf-find-replace-csharp - $499/developer/year
ExisLicense.Initialize("XXXX-XXXX-XXXX-XXXX");

// Unlimited pages, no restrictions, no console messages
var result = PdfFindReplace.Execute("large-doc.pdf", "output.pdf", "old", "new");

Text Fitting Options

var options = new PdfFindReplaceOptions
{
    CaseSensitive = true,
    WholeWordOnly = false,
    UseRegex = false,
    UseIncrementalUpdate = true,
    TextFitting = TextFittingMode.Adaptive,  // Best quality text fitting
    MinHorizontalScale = 70,                 // Minimum Tz percentage (50-100)
    MaxFontSizeReduction = 1.5               // Max font size reduction in points
};

var result = PdfFindReplace.Execute(
    "contract.pdf", "updated.pdf",
    "Short Name", "A Much Longer Replacement Name That Needs Fitting",
    options);

Font Color & Highlight

// Color replacement text and add a highlight background
var result = PdfFindReplace.Execute(
    "input.pdf", "output.pdf",
    "old text", "new text",
    new PdfFindReplaceOptions
    {
        ReplacementTextColor = PdfColor.Red,         // Font color of replaced text
        ReplacementHighlightColor = PdfColor.Yellow   // Background highlight behind text
    });

Merge PDFs

// Merge multiple PDFs into one, preserving page dimensions and resources
byte[] merged = PdfMerger.Merge(new[] { "cover.pdf", "report.pdf", "appendix.pdf" });
File.WriteAllBytes("combined.pdf", merged);

// Or write directly to a file
PdfMerger.MergeToFile(new[] { "file1.pdf", "file2.pdf" }, "merged.pdf");

// Merge with page range selection
byte[] selected = PdfMerger.Merge(new[]
{
    new PdfMergeInput(File.ReadAllBytes("doc1.pdf"), new[] { 1, 3, 5 }),
    new PdfMergeInput(File.ReadAllBytes("doc2.pdf"))  // all pages
});

Split PDFs

// Split into individual pages
List<byte[]> pages = PdfSplitter.Split("input.pdf");

// Extract specific pages (1-based)
byte[] subset = PdfSplitter.ExtractPages("input.pdf", new[] { 1, 3, 5 });

// Split to individual files with naming pattern
PdfSplitter.SplitToFiles("input.pdf", "page_{0}.pdf");

Build PDFs from Scratch

byte[] pdf = PdfBuilder.Create()
    .WithMetadata(m => m.Title("Report").Author("Exis"))
    .AddPage(page => page
        .Size(PdfPageSize.A4)
        .AddText("Hello, World!", x: 72, y: 750, fontSize: 24,
            options: o => o.Font("Helvetica").Bold().Color(0, 0, 0.8))
        .AddText("Generated with Exis.PdfEditor", x: 72, y: 720, fontSize: 12)
        .AddLine(72, 710, 523, 710, strokeWidth: 1)
        .AddRectangle(72, 600, 200, 80, fill: true,
            fillRed: 0.95, fillGreen: 0.95, fillBlue: 1.0)
        .AddImage(jpegBytes, x: 300, y: 400, width: 200, height: 150))
    .AddPage(page => page
        .Size(PdfPageSize.Letter)
        .AddText("Page 2", x: 72, y: 700, fontSize: 14))
    .Build();

File.WriteAllBytes("output.pdf", pdf);

Extract Text

// Extract all text from a PDF
PdfTextResult text = PdfTextExtractor.ExtractText("input.pdf");
Console.WriteLine(text.FullText);

// Extract from specific pages only
PdfTextResult partial = PdfTextExtractor.ExtractText("input.pdf", new[] { 1, 3 });

// Structured extraction with position and font data
PdfStructuredTextResult structured = PdfTextExtractor.ExtractStructured("input.pdf");
foreach (var block in structured.Pages[0].TextBlocks)
    Console.WriteLine($"[{block.X:F0},{block.Y:F0}] {block.Text} " +
        $"(font={block.FontName}, size={block.FontSize})");

Inspect Document (No License Required)

PdfDocumentInfo info = PdfInspector.Inspect("input.pdf");

Console.WriteLine($"Pages: {info.PageCount}");
Console.WriteLine($"Title: {info.Title}");
Console.WriteLine($"Fonts: {string.Join(", ", info.FontsUsed)}");
Console.WriteLine($"Encrypted: {info.IsEncrypted}");
Console.WriteLine($"Form fields: {info.FormFieldCount}");

Image Replacement

// Find all images in a PDF
var found = PdfImageEditor.FindImages("input.pdf");
foreach (var img in found.Images)
    Console.WriteLine($"Image #{img.Index}: {img.PixelWidth}x{img.PixelHeight} " +
        $"{img.ColorSpace} {img.Format} on page(s) {string.Join(", ", img.PageNumbers)}");

// Replace all images with a new one
byte[] newLogo = File.ReadAllBytes("new-logo.jpg");
var result = PdfImageEditor.ReplaceAll("input.pdf", "output.pdf", newLogo);
Console.WriteLine($"Replaced {result.ImagesReplaced} of {result.ImagesFound} images");

// Replace specific images by index or page range
var selective = PdfImageEditor.Replace("input.pdf", "output.pdf", newLogo,
    new PdfImageReplaceOptions { ImageIndices = new[] { 0, 2 } });

Auto-Layout Document Builder

byte[] pdf = PdfDocumentBuilder.Create()
    .PageSize(PdfPageSize.A4)
    .Margins(72)
    .WithMetadata(m => m.Title("Report").Author("Exis"))
    .Header(h => h
        .AddText("Quarterly Report", PdfHorizontalAlignment.Center, 12, o => o.Bold())
        .AddLine())
    .Footer(f => f
        .AddLine()
        .AddPageNumber())  // "Page 1 of 3"
    .AddParagraph("Introduction", 18, o => o.Bold())
    .AddSpacing(8)
    .AddParagraph("This report covers Q1 results.")
    .AddSpacing(12)
    .AddTable(t => t
        .Columns(2, 1, 1)
        .AlternatingRowBackground(0.95, 0.95, 1.0)
        .HeaderRow(r => r.AddCell("Product").AddCell("Units").AddCell("Revenue"))
        .AddRow(r => r.AddCell("Widget A").AddCell("1,200").AddCell("$24,000"))
        .AddRow(r => r.AddCell("Widget B").AddCell("850").AddCell("$17,000")))
    .AddPageBreak()
    .AddParagraph("Appendix", 14, o => o.Bold())
    .Build();

Form Filling

// Read form fields
List<PdfFormField> fields = PdfFormFiller.GetFields("form.pdf");
foreach (var field in fields)
    Console.WriteLine($"{field.Name} ({field.FieldType}) = {field.CurrentValue}");

// Fill fields
var result = PdfFormFiller.Fill("form.pdf", "filled.pdf", new Dictionary<string, string>
{
    { "FirstName", "John" },
    { "LastName", "Doe" },
    { "State", "CA" },
    { "AgreeToTerms", "Yes" }  // checkbox
});
Console.WriteLine($"Filled {result.FieldsFilled} fields");

// Flatten form (merge field appearances, remove interactive fields)
PdfFormFiller.Flatten("filled.pdf", "flattened.pdf");

Redaction

var result = PdfRedactor.Redact("input.pdf", "redacted.pdf", new[]
{
    // Text-based redaction
    new PdfRedaction { Text = "CONFIDENTIAL" },

    // Regex pattern (e.g., SSN)
    new PdfRedaction { Text = @"\d{3}-\d{2}-\d{4}", IsRegex = true },

    // Replace with alternative text
    new PdfRedaction { Text = "SECRET", ReplaceWith = "[REDACTED]" },

    // Area-based redaction on specific page
    new PdfRedaction { PageNumber = 3, Area = new PdfRect(100, 200, 300, 50) }
});
Console.WriteLine($"Applied {result.RedactionsApplied} redactions");

Optimization

var result = PdfOptimizer.Optimize("input.pdf", "optimized.pdf", new PdfOptimizeOptions
{
    CompressStreams = true,
    RemoveDuplicateObjects = true,
    RemoveMetadata = false,
    DownsampleImages = true,
    MaxImageDpi = 150
});
Console.WriteLine($"Saved {result.BytesSaved} bytes ({result.ReductionPercent:F1}%)");
Console.WriteLine($"Images downsampled: {result.ImagesDownsampled}");

Digital Signatures (.NET 8, 9, 10+)

using System.Security.Cryptography.X509Certificates;

// Sign a PDF
var cert = new X509Certificate2("certificate.pfx", "password");
PdfSigner.Sign("input.pdf", "signed.pdf", new PdfSignOptions
{
    Certificate = cert,
    Reason = "Approved",
    Location = "New York",
    ContactInfo = "admin@example.com"
});

// Verify a signed PDF
PdfSignatureInfo info = PdfSigner.Verify("signed.pdf");
Console.WriteLine($"Signed: {info.IsSigned}");
Console.WriteLine($"Valid: {info.IsValid}");
Console.WriteLine($"Signer: {info.SignerName}");
Console.WriteLine($"Certificate: {info.CertificateSubject}");
Console.WriteLine($"Issuer: {info.CertificateIssuer}");
Console.WriteLine($"Timestamp: {info.HasTimestamp}");

// Verify all signatures in a multi-signed document
List<PdfSignatureInfo> all = PdfSigner.VerifyAll("multi-signed.pdf");
foreach (var sig in all)
    Console.WriteLine($"{sig.SignerName}: valid={sig.IsValid}");

PDF/A Compliance

// Validate (no license required)
// Levels: PdfA1b, PdfA2b, PdfA2u, PdfA3b, PdfA3u
PdfAValidationResult result = PdfAConverter.Validate("input.pdf", PdfALevel.PdfA2b);
Console.WriteLine($"Compliant: {result.IsCompliant}");
foreach (var v in result.Violations)
    Console.WriteLine($"  [{v.Code}] {v.Message} (auto-fix: {v.CanAutoFix})");

// Convert to PDF/A
byte[] pdfa = PdfAConverter.Convert("input.pdf", PdfALevel.PdfA2b);
File.WriteAllBytes("output-pdfa.pdf", pdfa);

Async API

// All I/O operations have async overloads with CancellationToken support
byte[] merged = await PdfMerger.MergeAsync(inputPaths, cancellationToken);
PdfTextResult text = await PdfTextExtractor.ExtractTextAsync(stream, cancellationToken);
var info = await PdfInspector.InspectAsync(path, cancellationToken);
var result = await PdfOptimizer.OptimizeAsync(data, options, cancellationToken);
var sigs = await PdfSigner.VerifyAllAsync(path, cancellationToken);

// Pattern: ClassName.MethodNameAsync(...) on all classes

Comparaison avec Exis.PdfEditor

Fonctionnalite Exis.PdfEditor IronPDF Spire.PDF Aspose.PDF Syncfusion
Edition directe des flux de contenu Rendu HTML Superposition de biffure Remplacement de fragments Superposition de biffure
Preserve les champs de formulaire Partiel Partiel
Preserve les signatures numeriques Pages non modifiees
Preserve l'espacement/crenage du texte Partiel
Zero dependances natives .NET pur Moteur Chromium
Taille du DLL < 500 KB ~250 MB ~20 MB ~40 MB ~15 MB
Remplacement multiple par lots Passage unique Boucle manuelle Boucle manuelle Boucle manuelle Boucle manuelle
.NET Framework 4.8 .NET 6+ uniquement
Multi-plateforme
Support regex
Prix (par developpeur/an) $499 $749 $999 $1,175 $995*
Siege social 🇺🇸 USA 🇺🇸 USA 🇨🇳 China 🇦🇺 Australia 🇺🇸 USA

Comparaison basee sur la documentation publique disponible en fevrier 2026. Le support des fonctionnalites peut varier selon la version.
"Edition directe des flux de contenu" signifie que la bibliotheque modifie les operateurs de texte PDF en place sans conversion, re-rendu ou superposition.

Fonctionnalites

Edition directe du PDF

Modifie les operateurs de flux de contenu. Pas de conversion intermediaire.

Zero dependances

Pas de Ghostscript, pas de LibreOffice, pas de Chromium. .NET gere pur.

Sortie sans perte

Formulaires, signatures, annotations, signets — tout preserve.

Multi-cible

.NET 8, 9, 10+ et .NET Standard 2.0 (.NET Framework 4.6.1+, .NET Core 2.0+, .NET 5-7).

Traitement par lots

Plusieurs paires rechercher/remplacer executees en un seul passage.

Expressions regulieres

Support complet des regex .NET pour les remplacements par motif.

Multi-plateforme

Windows, Linux, macOS. Partout ou .NET fonctionne.

Empreinte reduite

Un seul DLL, moins de 500 Ko. Pas de binaires natifs a deployer.

PDF Merge

Combine multiple PDFs into one document, preserving page dimensions and resources.

PDF Split

Extract individual pages or page ranges into separate PDFs. Split to files with naming patterns.

PDF Builder

Create PDFs from scratch with a fluent API. Add text, images, lines, and rectangles with full formatting control.

Text Extraction

Pull text content from PDF pages. Extract from all pages or specific page ranges.

Document Inspector

Read metadata, fonts, page dimensions, and form field counts. Works without any license.

Image Replacement

Find, analyze, and replace images in PDFs. Swap logos or graphics by index or page range with JPEG/PNG.

Auto-Layout Builder

Create reports with auto-pagination, text wrapping, tables, headers/footers, and page numbers.

Form Filling

Read and fill AcroForm fields including text, checkbox, and dropdown. Lossless form preservation.

Redaction

Text-based, regex pattern, or area-based redaction. Permanently remove sensitive content from PDFs.

Optimization

Compress streams, remove duplicate objects, and reduce file size while preserving document quality.

Digital Signatures

Sign PDFs with X.509 certificates and verify existing signatures. Available on .NET 8, 9, 10+.

PDF/A Compliance

Validate and convert to PDF/A (1b, 2b, 2u, 3b, 3u) for long-term archival. Validation works without a license.

Async API

All I/O operations have async overloads with CancellationToken support for scalable applications.

Tarification

Annual Subscription
$499
auto-renews yearly / cancel anytime
  • Pages illimitees
  • Fichiers illimites
  • Toutes les fonctionnalites incluses
  • Support par email
  • Automatic annual renewal

Installez le package NuGet et appelez ExisLicense.Initialize() — fonctionnalite complete pendant 14 jours. Apres l'essai, le mode evaluation traite jusqu'a 3 pages par document. Pas de filigrane. Quand vous etes pret, achetez une cle de licence sur officefindreplace.com/Home/pdf-find-replace-csharp.

Prix en dollars americains. Une cle par developpeur. Fonctionne sur la machine de developpement, le serveur de build et la production — sans limites par machine ou par deploiement.

Comment fonctionne l'essai

Essai (Jours 1-14)

  • Installer le package NuGet
  • Appeler ExisLicense.Initialize()
  • Acces complet — pages illimitees
  • Pas de cle, pas d'inscription, pas de carte de credit

Evaluation (Apres le jour 14)

  • L'essai expire automatiquement
  • La bibliotheque continue de fonctionner
  • Limitee a 3 pages par document
  • Pas de filigrane sur la sortie
  • Votre code existant continue de fonctionner

Sous licence

  • Acheter une cle sur officefindreplace.com/Home/pdf-find-replace-csharp
  • Appeler ExisLicense.Initialize("votre-cle")
  • Pages illimitees, sans restrictions
  • Fonctionnement silencieux — pas de messages console

Votre code ne change pas entre le mode essai et le mode sous licence. Ajoutez simplement votre cle quand vous etes pret.

Construit par Exis LLC

Fabrique aux USA — Exis LLC, New Jersey. Developpement et support bases aux Etats-Unis.
Approuve par le gouvernement — Le meme moteur PDF alimente Global Office Find Replace Professional, utilise par les agences federales americaines pour le traitement de documents.
Plus de 35 ans dans le logiciel — 8 brevets dans le traitement de documents, les capteurs, la cryptographie et l'automatisation industrielle.
Support reactif — Acces direct par email a l'equipe de developpement. Pas une file d'attente de tickets.

Questions frequemment posees

Non. Exis.PdfEditor est une bibliotheque .NET pure sans aucune dependance externe. Elle n'utilise pas Office, Acrobat, Ghostscript, LibreOffice, Chromium ou tout autre outil externe.
IronPDF rend les PDF via un moteur Chromium — il recree effectivement la page, ce qui detruit les champs de formulaire, l'espacement et les signatures. Aspose.PDF utilise une approche de remplacement de fragments de texte qui peut decaler le positionnement. Exis.PdfEditor opere directement sur les operateurs de flux de contenu PDF, preservant tout sauf le texte cible.
Les champs de formulaire (AcroForms), les valeurs des cases a cocher, les boutons radio, les signatures numeriques (sur les pages non modifiees), les annotations, les signets, les fichiers integres, les hyperliens, et toute la mise en page et l'espacement. Seul le texte que vous ciblez est modifie.
Oui. La licence par siege developpeur couvre votre machine de developpement, le serveur de build et le deploiement en production. Pas de licence par machine ou par deploiement.
La bibliotheque passe en mode evaluation. Elle continue de fonctionner mais limite le traitement a 3 pages par document. Pas d'exceptions lancees sur les petits fichiers, pas de filigranes ajoutes. Votre code existant continue de fonctionner. Ajoutez une cle de licence quand vous etes pret.
Oui. Le package NuGet inclut un build .NET Standard 2.0 qui fonctionne avec .NET Framework 4.6.1 et versions ulterieures, y compris 4.8. Il fournit egalement un build optimise pour .NET 8.
Une cle de licence par developpeur. La cle est dans votre code source. Elle fonctionne sur votre machine de developpement, serveur de build, staging et production sans limites par machine. Pour les equipes, chaque developpeur a besoin de sa propre cle. Pas d'empreinte machine ou de serveurs d'activation a gerer.
Oui. PdfTextExtractor.ExtractText() retourne le contenu textuel complet. PdfInspector.Inspect() retourne les metadonnees du document et le nombre de pages — PdfInspector ne necessite pas de licence du tout.
Exis.PdfEditor fonctionne avec les PDF bases sur du texte ou le texte est encode dans les flux de contenu. Pour les documents scannes ou le contenu est une image raster, vous devrez d'abord executer l'OCR pour produire une couche de texte.
La bibliotheque resout automatiquement les encodages de police — ToUnicode CMaps, WinAnsiEncoding, MacRomanEncoding, dictionnaires d'encodage personnalises avec /Differences, et polices composites (CID/Type0) pour le texte CJK.

Demarrez votre essai gratuit de 14 jours

dotnet add package Exis.PdfEditor

Demarrer l'essai gratuit Sample App on GitHub

Des questions ? Envoyez un email a support@exisone.com — vous aurez une reponse d'un developpeur, pas d'un robot.