# PDF Redaction in C#: Remove Sensitive Data and Sanitize Documents with IronPDF
die **PDF-Redaktion** in **C# .NET** mit IronPDF entfernt sensible Inhalte dauerhaft aus der internen Struktur eines Dokuments, anstatt sie nur optisch zu verdecken, so dass die Originaldaten weder durch Kopieren noch durch Suchen oder forensische Analysen wiederhergestellt werden können. Dies geht weit über schwarze Rechtecke über dem Text hinaus: IronPDF bietet **Textschwärzung** mit Regex-Musterabgleich, **regionale Schwärzung** für Signaturen und Bilder, Entfernen von Metadaten, **Dokumentenbereinigung** zur Eliminierung eingebetteter Skripte und Schwachstellen-Scanning, so dass .NET-Entwickler ein komplettes Toolkit für **HIPAA**-, **GDPR**- und **PCI DSS**-konforme Dokumentenschutz-Workflows erhalten.
*as-heading:2(TL;DR: Schnellstartanleitung)*
Dieses Tutorial behandelt das dauerhafte Entfernen sensibler Inhalte aus PDF-Dokumenten in C# .NET, einschließlich Textmustern, Bildbereichen, Metadaten und eingebetteten Skripten.
- **Für wen ist das?:** .NET-Entwickler, die mit sensiblen Dokumenten in den Bereichen Gesundheitswesen, Recht, Finanzen oder Behörden arbeiten.
- **Was Sie erstellen werden:** Textredaktion mit Regex-Musterabgleich (SSN, Kreditkarten, E-Mails), koordinatenbasierte Bereichsredaktion für Unterschriften und Fotos, Metadatenbereinigung, PDF-Sanitization zum Entfernen eingebetteter Skripte und YARA-basiertes Scannen auf Sicherheitslücken.
- **Wo es läuft:** .NET 10, .NET 8 LTS, .NET Framework 4.6.2+, und .NET Standard 2.0. Alle Vorgänge werden lokal und ohne externe Abhängigkeiten ausgeführt.
- **Wann ist dieser Ansatz zu empfehlen:** Wenn Sie Dokumente für die Offenlegung vor Gericht, für FOIA-Anfragen oder für die externe Verteilung freigeben und gleichzeitig sicherstellen müssen, dass entfernte Inhalte wirklich verschwunden sind.
- **Warum es technisch wichtig ist:** Visuelle Überlagerungen lassen den Originaltext in den Inhaltsströmen der PDF-Datei wiederherstellbar. Die IronPDF-Redaktion löscht die Zeichendaten aus der Dokumentstruktur selbst, so dass eine Wiederherstellung unmöglich ist.
Schwärzen Sie sensiblen Text aus einer PDF-Datei mit nur wenigen Codezeilen:
```cs
:title=Redact Sensitive Text with IronPDF
using IronPdf;
PdfDocument pdf = PdfDocument.FromFile("confidential-report.pdf");
pdf.RedactTextOnAllPages("CONFIDENTIAL");
pdf.SaveAs("redacted-report.pdf");
```
Nachdem Sie IronPDF gekauft oder sich für eine 30-tägige Testversion angemeldet haben, fügen Sie Ihren Lizenzschlüssel am Anfang Ihrer Anwendung hinzu.
```cs
IronPdf.License.LicenseKey = "KEY";
```
!!!--LIBRARY_START_TRIAL_BLOCK--!!!
!!!--LIBRARY_NUGET_INSTALL_BLOCK--!!!
*as-heading:2(Inhaltsverzeichnis)*
- **TL;DR: Schnellstartanleitung**
- [Schnellübersicht](#anchor-tldr-quickstart-guide)
- **Text aus PDF-Dokumenten umwandeln**
- [Was ist der Unterschied zwischen True Redaction und Visual Overlay?](#anchor-true-redaction-vs-overlay)
- [Wie kann ich Text auf allen Seiten eines PDF-Dokuments schwärzen?](#anchor-redact-text-all-pages)
- [Wie kann ich Text nur auf bestimmten Seiten redigieren?](#anchor-redact-spezifische-seiten)
- [Wie kann ich das Erscheinungsbild von geschwärzten Inhalten anpassen?](#anchor-customize-redaction-appearance)
- **Musterabgleich und automatisierte Korrektur**
- [Wie kann ich reguläre Ausdrücke zum Auffinden und Redigieren sensibler Muster verwenden?](#anchor-regex-pattern-redaction)
- [Wie kann ich einen wiederverwendbaren Scanner für sensible Daten erstellen?](#anchor-sensitive-data-scanner)
- **Regionenbasierte Redigierung**
- [Wie kann ich bestimmte Regionen oder Bereiche in einer PDF-Datei schwärzen?](#anchor-redact-regions)
- [Wie kann ich mehrere Regionen über verschiedene Seiten hinweg redigieren?](#anchor-multiple-regions)
- **Entfernen sensibler Daten aus PDF-Metadaten**
- [Wie entferne ich Metadaten, die vertrauliche Informationen preisgeben könnten?](#anchor-remove-metadata)
- **PDF-Sanitisierung in .NET**
- [Wie kann ich eine PDF-Datei sanitisieren, um eingebettete Skripte und versteckte Bedrohungen zu entfernen?](#anchor-sanitize-pdf)
- [Wie scanne ich eine PDF-Datei auf Sicherheitsschwachstellen?](#anchor-scan-vulnerabilities)
- **Komplette Arbeitsabläufe**
- [Wie kann ich eine vollständige Redaktions- und Sanitization-Pipeline erstellen?](#anchor-complete-pipeline)
- [Nächste Schritte](#anchor-next-steps)
<a id="anchor-true-redaction-vs-overlay"></a>
## Was ist der Unterschied zwischen echter Redaktion und visueller Überlagerung?
Das Verständnis des Unterschieds zwischen echter Schwärzung und visueller Überlagerung ist für jeden, der mit sensiblen Dokumenten umgeht, entscheidend. Viele Tools und manuelle Methoden erwecken den Anschein der Schwärzung, ohne dass die zugrunde liegenden Daten tatsächlich entfernt werden. Dieses falsche Sicherheitsgefühl hat zahlreiche hochkarätige Datenschutzverletzungen und Compliance-Verstöße verursacht.
Visuelle Überlagerungsansätze zeichnen normalerweise undurchsichtige Formen über sensible Inhalte. Der Text bleibt innerhalb der PDF-Struktur vollständig intakt. Wer das Dokument betrachtet, sieht ein schwarzes Rechteck, aber die Originalzeichen sind in den Inhaltsströmen der Datei noch vorhanden. Die Auswahl des gesamten Textes auf der Seite, die Verwendung von Werkzeugen für die Barrierefreiheit oder die Untersuchung der PDF-Rohdaten offenbaren alles, was vermeintlich verborgen war. Gerichtsprozesse wurden gefährdet, wenn geschwärzte Dokumente von der gegnerischen Verteidigung nicht geschwärzt wurden. Regierungsbehörden haben versehentlich Verschlusssachen veröffentlicht, die zensiert erschienen, aber vollständig wiederherstellbar waren.
Echtes Redigieren funktioniert anders. Wenn Sie die Redaktionsmethoden von IronPDF verwenden, sucht die Bibliothek den angegebenen Text in der internen Struktur der PDF-Datei und entfernt ihn vollständig. Die Zeichendaten werden aus den Inhaltsströmen gelöscht. Die visuelle Darstellung wird durch eine Schwärzungsmarkierung, in der Regel ein schwarzes Rechteck, ersetzt, aber der ursprüngliche Inhalt ist in der Datei nicht mehr vorhanden. Keine Auswahl, kein Kopieren und keine forensische Analyse kann wiederherstellen, was dauerhaft gelöscht wurde.
IronPDF implementiert echte Schwärzung, indem es die PDF-Datei auf struktureller Ebene verändert. Die `RedactTextOnAllPages` Methode und ihre Varianten durchsuchen den Seiteninhalt, identifizieren übereinstimmenden Text, entfernen ihn aus dem Dokumentobjektmodell und zeichnen optional einen visuellen Indikator an der Stelle, an der der Inhalt zuvor erschienen ist. Dieser Ansatz steht im Einklang mit den Richtlinien von Organisationen wie NIST für die sichere Schwärzung von Dokumenten.
Die praktischen Implikationen sind erheblich. Wenn Sie Dokumente extern weitergeben, Dateien für die gerichtliche Offenlegung einreichen, Aufzeichnungen im Rahmen der Informationsfreiheit veröffentlichen oder Berichte verteilen und dabei personenbezogene Daten schützen müssen, bietet nur eine echte Schwärzung angemessenen Schutz. Visuelle Überlagerungen mögen für interne Entwürfe ausreichen, bei denen Sie einfach nur die Aufmerksamkeit von bestimmten Abschnitten ablenken wollen, aber für den tatsächlichen Datenschutz sollte man ihnen nicht vertrauen. Weitere Maßnahmen zur Dokumentensicherheit finden Sie in unseren Leitfäden zur [Verschlüsselung von PDFs](/tutorials/encrypt-pdf-csharp/) und [digitalen Signaturen](/tutorials/pdf-digital-signatures-csharp-guide/).
---
## How do I Redact PDF Text in C# Across an Entire Document?
<a id="anchor-redact-text-all-pages"></a>
Das häufigste Redaktionsszenario besteht darin, dass alle Instanzen eines bestimmten Textes in einem Dokument entfernt werden. Vielleicht müssen Sie den Namen einer Person aus einem Bericht streichen, Kontonummern aus Finanzberichten entfernen oder interne Referenzcodes vor der externen Verteilung entfernen. IronPDF macht dies mit der `RedactTextOnAllPages` Methode einfach.
#### Eingabe
Ein Dokument für Mitarbeiterunterlagen, das persönliche Informationen wie Namen, Sozialversicherungsnummern und Mitarbeiter-IDs enthält.
<iframe loading="lazy" src="/static-assets/pdf/tutorials/pdf-redaction-csharp/02-employee-records-before.pdf" width="100%" height="400px">
</iframe>
```cs
using IronPdf;
// Load the source document
PdfDocument pdf = PdfDocument.FromFile("employee-records.pdf");
// Redact an employee name from the entire document
pdf.RedactTextOnAllPages("John Smith");
// Redact a Social Security Number
pdf.RedactTextOnAllPages("123-45-6789");
// Redact an internal employee ID
pdf.RedactTextOnAllPages("EMP-2024-0042");
// Save the cleaned document
pdf.SaveAs("employee-records-redacted.pdf");
```
Dieser Code lädt ein PDF-Dokument, das Mitarbeiterinformationen enthält, und entfernt drei vertrauliche Daten, indem er für jeden Wert `RedactTextOnAllPages` aufruft. Bei jedem Aufruf wird jede Seite des Dokuments durchsucht und alle übereinstimmenden Instanzen des Namens, der Sozialversicherungsnummer und der internen Kennung des Mitarbeiters werden dauerhaft entfernt.
#### Musterausgabe
<iframe loading="lazy" src="/static-assets/pdf/tutorials/pdf-redaction-csharp/02-employee-records-after.pdf" width="100%" height="400px">
</iframe>
Das Standardverhalten zeichnet schwarze Rechtecke an den Stellen, an denen der geschwärzte Text erschien, und ersetzt die tatsächlichen Zeichen durch Sternchen in der Dokumentstruktur. Dadurch wird sowohl visuell bestätigt, dass eine Schwärzung stattgefunden hat, als auch sichergestellt, dass der ursprüngliche Inhalt vollständig verschwunden ist.
Wenn Sie mit längeren Dokumenten oder mehreren Schwärzungszielen arbeiten, können Sie diese Aufrufe effizient verketten:
```cs
using IronPdf;
using System.Collections.Generic;
// Load the document once
PdfDocument pdf = PdfDocument.FromFile("quarterly-report.pdf");
// Define all terms that need redaction
List<string> sensitiveTerms = new List<string>
{
"Project Titan",
"Sarah Johnson",
"Budget: $4.2M",
"Q3-INTERNAL-2024",
"sarah.johnson@company.com"
};
// Redact each term
foreach (string term in sensitiveTerms)
{
pdf.RedactTextOnAllPages(term);
}
// Save the result
pdf.SaveAs("quarterly-report-public.pdf");
```
Dieses Muster funktioniert gut, wenn Sie eine bekannte Liste sensibler Werte haben, die entfernt werden müssen. Das Dokument wird einmal geladen, alle Korrekturen werden im Speicher vorgenommen und das Endergebnis wird gespeichert. Jeder Begriff wird unabhängig bearbeitet, sodass partielle Übereinstimmungen oder Formatierungsunterschiede zwischen Begriffen keine Auswirkungen auf andere Redaktionen haben.
<a id="anchor-redact-specific-pages"></a>
## Wie kann ich Text nur auf bestimmten Seiten schwärzen?
Manchmal benötigen Sie eine genauere Kontrolle über die Stellen, an denen Schwärzungen vorgenommen werden. Ein Dokument kann ein Deckblatt mit Informationen enthalten, die intakt bleiben sollen, oder Sie wissen, dass vertrauliche Daten nur in bestimmten Abschnitten erscheinen. IronPDF bietet `RedactTextOnPage` für die Redaktion einer einzelnen Seite und `RedactTextOnPages` zum Anvisieren mehrerer spezifischer Seiten.
#### Eingabe
Ein mehrseitiges Vertragsbündel mit Kundennamen auf der Unterschriftenseite und finanziellen Bedingungen, die auf bestimmten Seiten im Dokument erscheinen.
<iframe loading="lazy" src="/static-assets/pdf/tutorials/pdf-redaction-csharp/03-contract-bundle-before.pdf" width="100%" height="400px">
</iframe>
```cs
using IronPdf;
// Load the document
PdfDocument pdf = PdfDocument.FromFile("contract-bundle.pdf");
// Redact text only on page 1 (index 0)
pdf.RedactTextOnPage(0, "Client Name: Acme Corporation");
// Redact text on pages 3, 5, and 7 (indices 2, 4, 6)
int[] financialPages = { 2, 4, 6 };
pdf.RedactTextOnPages(financialPages, "Payment Terms: Net 30");
// Other pages remain untouched except for the specific redactions applied
pdf.SaveAs("contract-bundle-redacted.pdf");
```
Dieser Code demonstriert gezielte Redaktionen durch Verwendung von `RedactTextOnPage` für eine einzelne Seite und `RedactTextOnPages` für mehrere spezifische Seiten. Der Kundenname wird nur auf Seite 1 (Index 0) entfernt, während die Zahlungsbedingungen auf den Seiten 3, 5 und 7 (Indizes 2, 4, 6) geschwärzt werden, während alle anderen Seiten unberührt bleiben.
#### Musterausgabe
<iframe loading="lazy" src="/static-assets/pdf/tutorials/pdf-redaction-csharp/03-contract-bundle-after.pdf" width="100%" height="400px">
</iframe>
Seitenindizes in IronPDF sind nullbasiert, was bedeutet, dass die erste Seite den Index 0 hat, die zweite den Index 1 und so weiter. Dies entspricht den Standard-Programmierkonventionen und der Denkweise der meisten Entwickler über Array-Zugriff.
Die Ausrichtung auf bestimmte Seiten verbessert die Leistung bei der Verarbeitung großer Dokumente. Anstatt Hunderte von Seiten nach Text zu durchsuchen, der nur an einigen wenigen Stellen vorkommt, können Sie der Redaktionsmaschine genau sagen, wo sie suchen soll. Dies ist wichtig für Stapelverarbeitungsszenarien, in denen Sie möglicherweise Tausende von Dokumenten verarbeiten. Um einen maximalen Durchsatz zu erzielen, sollten Sie [async und Multithreading](/how-to/async/) Techniken verwenden.
```cs
using IronPdf;
// Process a large document efficiently
PdfDocument pdf = PdfDocument.FromFile("annual-report-500-pages.pdf");
// We know from document structure that:
// - Executive summary with names is on pages 1-3
// - Financial data is on pages 45-60
// - Appendix with employee info is on pages 480-495
// Redact executive names from summary section
for (int i = 0; i <= 2; i++)
{
pdf.RedactTextOnPage(i, "CEO: Robert Williams");
pdf.RedactTextOnPage(i, "CFO: Maria Garcia");
}
// Redact specific financial figures from the financial section
int[] financialSection = { 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59 };
pdf.RedactTextOnPages(financialSection, "Net Revenue: $847M");
// Redact employee identifiers from appendix
for (int i = 479; i <= 494; i++)
{
pdf.RedactTextOnPage(i, "Employee ID:");
}
pdf.SaveAs("annual-report-public-release.pdf");
```
Dieser gezielte Ansatz verarbeitet nur die relevanten Abschnitte eines 500-seitigen Dokuments und reduziert die Ausführungszeit erheblich im Vergleich zur Durchsuchung jeder Seite nach jedem Redaktionsbegriff.
<a id="anchor-customize-redaction-appearance"></a>
## Wie kann ich das Erscheinungsbild von geschwärzten Inhalten anpassen?
IronPDF bietet mehrere Parameter, um zu steuern, wie Schwärzungen im endgültigen Dokument erscheinen. Sie können die Groß- und Kleinschreibung, den Abgleich ganzer Wörter, das Zeichnen visueller Rechtecke und den Ersatztext, der anstelle des geschwärzten Inhalts erscheint, anpassen.
#### Eingabe
Ein juristischer Schriftsatz mit verschiedenen sensiblen Begriffen wie Klassifizierungskennzeichen, Passwörtern und internen Referenzcodes, die unterschiedliche Schwärzungsmaßnahmen erfordern.
<iframe loading="lazy" src="/static-assets/pdf/tutorials/pdf-redaction-csharp/04-legal-brief-before.pdf" width="100%" height="400px">
</iframe>
```cs
using IronPdf;
// Load the document
PdfDocument pdf = PdfDocument.FromFile("legal-brief.pdf");
// Case-sensitive redaction: only matches exact case
// "CLASSIFIED" will be redacted but "classified" or "Classified" will not
pdf.RedactTextOnAllPages(
"CLASSIFIED",
CaseSensitive: true,
OnlyMatchWholeWords: true,
DrawRectangles: true,
ReplacementText: "[REDACTED]"
);
// Case-insensitive redaction: matches regardless of case
// Will redact "Secret", "SECRET", "secret", etc.
pdf.RedactTextOnAllPages(
"secret",
CaseSensitive: false,
OnlyMatchWholeWords: true,
DrawRectangles: true,
ReplacementText: "*****"
);
// Whole word disabled: matches partial strings too
// Will redact "password", "passwords", "mypassword123", etc.
pdf.RedactTextOnAllPages(
"password",
CaseSensitive: false,
OnlyMatchWholeWords: false,
DrawRectangles: true,
ReplacementText: "XXXXX"
);
// No visual rectangle: text is removed but no black box appears
// Useful when you want seamless removal without obvious redaction marks
pdf.RedactTextOnAllPages(
"internal-reference-code",
CaseSensitive: true,
OnlyMatchWholeWords: true,
DrawRectangles: false,
ReplacementText: ""
);
pdf.SaveAs("legal-brief-redacted.pdf");
```
Dieser Code demonstriert vier verschiedene Redaktionskonfigurationen unter Verwendung der optionalen Parameter von `RedactTextOnAllPages`. Sie zeigt den exakten Abgleich unter Berücksichtigung der Groß- und Kleinschreibung mit der Ersetzung von "[REDACTED]", den Abgleich ohne Berücksichtigung der Groß- und Kleinschreibung mit Sternchen, den Abgleich von Teilwörtern, um Variationen wie "Passwörter" zu erfassen, und die unsichtbare Entfernung ohne visuelle Rechtecke für die nahtlose Eliminierung von Inhalten.
#### Musterausgabe
<iframe loading="lazy" src="/static-assets/pdf/tutorials/pdf-redaction-csharp/04-legal-brief-after.pdf" width="100%" height="400px">
</iframe>
Die Parameter dienen unterschiedlichen Zwecken, je nach Ihren Anforderungen:
`CaseSensitive` bestimmt, ob bei der Übereinstimmung die Groß- und Kleinschreibung berücksichtigt wird. Juristische Dokumente verwenden häufig spezifische Großschreibungen, die Bedeutung tragen, daher stellt die Fall-sensitive Übereinstimmung sicher, dass Sie nur exakte Übereinstimmungen entfernen. Die Verarbeitung allgemeiner Texte, bei denen der Fall variiert, kann eine Fall-unsensitive Übereinstimmung erfordern, um alle Instanzen zu erfassen.
`OnlyMatchWholeWords` kontrolliert, ob die Suche vollständige Wörter oder Teilstrings abgleicht. Bei der Schwärzung von Namen ist in der Regel ein Abgleich ganzer Wörter erforderlich, damit "Smith" nicht versehentlich einen Teil von "Blacksmith" oder "Smithfield" schwärzt. Beim Schwärzen von Mustern wie Kontonummern-Präfixen kann ein partieller Abgleich erforderlich sein, um Abweichungen zu erkennen.
`DrawRectangles` spezifiziert, ob schwarze Kästen erscheinen, wo Inhalte entfernt wurden. In den meisten rechtlichen und behördlichen Kontexten sind sichtbare Schwärzungsmarkierungen erforderlich, um zu belegen, dass der Inhalt absichtlich entfernt und nicht versehentlich weggelassen wurde. Interne Arbeitsabläufe können das Entfernen von unsichtbaren Elementen für eine saubere Ausgabe vorziehen.
`ReplacementText` definiert, welche Zeichen anstelle des redaktierten Inhalts erscheinen. Häufig werden Sternchen, "REDACTED"-Bezeichnungen oder leere Zeichenfolgen verwendet. Der Ersatztext erscheint in der Dokumentstruktur, wenn jemand versucht, den geschwärzten Bereich auszuwählen oder zu kopieren.
---
<a id="anchor-regex-pattern-redaction"></a>
## Wie kann ich reguläre Ausdrücke verwenden, um empfindliche Muster zu finden und zu bearbeiten?
Die Schwärzung bekannter Textzeichenfolgen funktioniert, wenn Sie bestimmte Werte zu entfernen haben, aber viele vertrauliche Datentypen folgen eher vorhersehbaren Mustern als festen Werten. Sozialversicherungsnummern, Kreditkartennummern, E-Mail-Adressen, Telefonnummern und Daten haben alle erkennbare Formate, die mit regulären Ausdrücken abgeglichen werden können. Der Aufbau eines auf Mustern basierenden Redaktionssystems ermöglicht es Ihnen, private Informationen aus PDF-Inhalten zu entfernen, ohne jeden spezifischen Wert im Voraus zu kennen.
IronPDFs [Textextraktionsfunktionen](/how-to/extract-text-and-images/) in Kombination mit Redigiermethoden ermöglichen leistungsstarke Workflows für den Musterabgleich. Sie extrahieren den Text, identifizieren Übereinstimmungen mit regulären Ausdrücken in .NET und schwärzen dann jeden gefundenen Wert.
```cs
using IronPdf;
using System.Text.RegularExpressions;
using System.Collections.Generic;
public class PatternRedactor
{
// Common patterns for sensitive data
private static readonly Dictionary<string, string> SensitivePatterns = new Dictionary<string, string>
{
// US Social Security Number: 123-45-6789
{ "SSN", @"\b\d{3}-\d{2}-\d{4}\b" },
// Credit Card Numbers: various formats with 13-19 digits
{ "CreditCard", @"\b(?:\d{4}[-\s]?){3}\d{1,4}\b" },
// Email Addresses
{ "Email", @"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b" },
// US Phone Numbers: (123) 456-7890 or 123-456-7890
{ "Phone", @"\b(?:\(\d{3}\)\s?|\d{3}[-.])\d{3}[-.]?\d{4}\b" },
// Dates: MM/DD/YYYY or MM-DD-YYYY
{ "Date", @"\b\d{1,2}[/-]\d{1,2}[/-]\d{2,4}\b" },
// IP Addresses
{ "IPAddress", @"\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b" }
};
public void RedactPatterns(string inputPath, string outputPath, params string[] patternNames)
{
// Load the PDF
PdfDocument pdf = PdfDocument.FromFile(inputPath);
// Extract all text from the document
string fullText = pdf.ExtractAllText();
// Track unique matches to avoid duplicate redaction attempts
HashSet<string> matchesToRedact = new HashSet<string>();
// Find all matches for requested patterns
foreach (string patternName in patternNames)
{
if (SensitivePatterns.TryGetValue(patternName, out string pattern))
{
Regex regex = new Regex(pattern, RegexOptions.IgnoreCase);
MatchCollection matches = regex.Matches(fullText);
foreach (Match match in matches)
{
matchesToRedact.Add(match.Value);
}
}
}
// Redact each unique match
foreach (string sensitiveValue in matchesToRedact)
{
pdf.RedactTextOnAllPages(sensitiveValue);
}
// Save the redacted document
pdf.SaveAs(outputPath);
}
}
// Usage example
class Program
{
static void Main()
{
PatternRedactor redactor = new PatternRedactor();
// Redact SSNs and credit cards from a financial document
redactor.RedactPatterns(
"customer-data.pdf",
"customer-data-safe.pdf",
"SSN", "CreditCard", "Email"
);
}
}
```
Dieser auf Mustern basierende Ansatz skaliert gut, da Sie die Muster einmal definieren und auf jedes Dokument anwenden können. Das Hinzufügen neuer Datentypen erfordert lediglich das Hinzufügen neuer Regex-Muster zum Wörterbuch.
<a id="anchor-sensitive-data-scanner"></a>
## Wie baue ich einen wiederverwendbaren Scanner für vertrauliche Daten?
In Produktionsumgebungen müssen Sie häufig Dokumente scannen und feststellen, welche vertraulichen Informationen vorhanden sind, bevor Sie entscheiden können, ob sie geschwärzt werden sollen. Dies hilft bei der Prüfung der Einhaltung von Vorschriften und ermöglicht eine menschliche Überprüfung von Schwärzungsentscheidungen. Die folgende Klasse bietet neben der Redigierung auch die Möglichkeit des Scannens.
```cs
using IronPdf;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.Linq;
public class SensitiveDataMatch
{
public string PatternType { get; set; }
public string Value { get; set; }
public int PageNumber { get; set; }
}
public class ScanResult
{
public string FilePath { get; set; }
public List<SensitiveDataMatch> Matches { get; set; } = new List<SensitiveDataMatch>();
public bool ContainsSensitiveData => Matches.Count > 0;
public Dictionary<string, int> GetSummary()
{
return Matches.GroupBy(m => m.PatternType)
.ToDictionary(g => g.Key, g => g.Count());
}
}
public class DocumentScanner
{
private readonly Dictionary<string, string> _patterns;
public DocumentScanner()
{
_patterns = new Dictionary<string, string>
{
{ "Social Security Number", @"\b\d{3}-\d{2}-\d{4}\b" },
{ "Credit Card", @"\b(?:\d{4}[-\s]?){3}\d{1,4}\b" },
{ "Email Address", @"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b" },
{ "Phone Number", @"\b(?:\(\d{3}\)\s?|\d{3}[-.])\d{3}[-.]?\d{4}\b" },
{ "Date of Birth Pattern", @"\b(?:DOB|Date of Birth|Birth Date)[:\s]+\d{1,2}[/-]\d{1,2}[/-]\d{2,4}\b" }
};
}
public ScanResult ScanDocument(string filePath)
{
ScanResult result = new ScanResult { FilePath = filePath };
PdfDocument pdf = PdfDocument.FromFile(filePath);
// Scan each page individually to track location
for (int pageIndex = 0; pageIndex < pdf.PageCount; pageIndex++)
{
string pageText = pdf.ExtractTextFromPage(pageIndex);
foreach (var pattern in _patterns)
{
Regex regex = new Regex(pattern.Value, RegexOptions.IgnoreCase);
MatchCollection matches = regex.Matches(pageText);
foreach (Match match in matches)
{
result.Matches.Add(new SensitiveDataMatch
{
PatternType = pattern.Key,
Value = MaskValue(match.Value, pattern.Key),
PageNumber = pageIndex + 1
});
}
}
}
return result;
}
// Partially mask values for safe storage
private string MaskValue(string value, string patternType)
{
if (patternType == "Social Security Number" && value.Length >= 4)
{
return "XXX-XX-" + value.Substring(value.Length - 4);
}
if (patternType == "Credit Card" && value.Length >= 4)
{
return "****-****-****-" + value.Substring(value.Length - 4);
}
if (patternType == "Email Address")
{
int atIndex = value.IndexOf('@');
if (atIndex > 2)
{
return value.Substring(0, 2) + "***" + value.Substring(atIndex);
}
}
return value.Length > 4 ? value.Substring(0, 2) + "***" : "****";
}
public void ScanAndRedact(string inputPath, string outputPath)
{
// First scan to identify sensitive data
ScanResult scanResult = ScanDocument(inputPath);
if (!scanResult.ContainsSensitiveData)
{
return;
}
// Load document for redaction
PdfDocument pdf = PdfDocument.FromFile(inputPath);
// Extract unique actual values (not masked) for redaction
string fullText = pdf.ExtractAllText();
HashSet<string> valuesToRedact = new HashSet<string>();
foreach (var pattern in _patterns)
{
Regex regex = new Regex(pattern.Value, RegexOptions.IgnoreCase);
foreach (Match match in regex.Matches(fullText))
{
valuesToRedact.Add(match.Value);
}
}
// Apply redactions
foreach (string value in valuesToRedact)
{
pdf.RedactTextOnAllPages(value);
}
pdf.SaveAs(outputPath);
}
}
// Usage
class Program
{
static void Main()
{
DocumentScanner scanner = new DocumentScanner();
// Scan only (for audit purposes)
ScanResult result = scanner.ScanDocument("application-form.pdf");
var summary = result.GetSummary();
// Scan and redact in one operation
scanner.ScanAndRedact("application-form.pdf", "application-form-redacted.pdf");
}
}
```
Der Scanner bietet Einblick in die vertraulichen Informationen, bevor Änderungen vorgenommen werden. Dies unterstützt Compliance-Workflows, bei denen Sie dokumentieren müssen, was gefunden und entfernt wurde. Die Maskierungsfunktion stellt sicher, dass Protokolldateien und Berichte nicht selbst zu Quellen der Datenexposition werden.
---
<a id="anchor-redact-regions"></a>
## Wie kann ich bestimmte Regionen oder Bereiche in einer PDF-Datei schwärzen?
Textredaktion behandelt zeichnungsbasierte Inhalte effektiv, aber PDFs enthalten oft sensible Informationen in Formen, die das Textmatching nicht abdecken kann. Unterschriften, Fotos, handschriftliche Anmerkungen, Stempel und grafische Elemente erfordern einen anderen Ansatz. Region-basierte Redaktion ermöglicht es Ihnen, rechteckige Bereiche nach ihren Koordinaten anzugeben und alles innerhalb dieser Grenzen dauerhaft unkenntlich zu machen.
IronPDF verwendet die `RectangleF` Struktur, um Redaktionsbereiche zu definieren. Sie geben die X- und Y-Koordinaten der oberen linken Ecke an, dann die Breite und Höhe des Bereichs. Die Koordinaten werden in Punkten von unten links auf der Seite gemessen, was dem Koordinatensystem der PDF-Spezifikation entspricht.
#### Eingabe
Ein unterschriebenes Vertragsdokument, das handschriftliche Unterschriften und einen Lichtbildausweis enthält, die mithilfe von koordinatenbasiertem Region-Targeting unkenntlich gemacht werden müssen.
<iframe loading="lazy" src="/static-assets/pdf/tutorials/pdf-redaction-csharp/06-signed-agreement-before.pdf" width="100%" height="400px">
</iframe>
```cs
using IronPdf;
using IronSoftware.Drawing;
// Load a document with signature blocks and photos
PdfDocument pdf = PdfDocument.FromFile("signed-agreement.pdf");
// Define a region for a signature block
// Located 100 points from left, 650 points from bottom
// Width of 200 points, height of 50 points
RectangleF signatureRegion = new RectangleF(100, 650, 200, 50);
// Redact the signature region on all pages
pdf.RedactRegionsOnAllPages(signatureRegion);
// Define a region for a photo ID in the upper right
RectangleF photoRegion = new RectangleF(450, 700, 100, 120);
pdf.RedactRegionsOnAllPages(photoRegion);
// Save the document with regions redacted
pdf.SaveAs("signed-agreement-redacted.pdf");
```
Dieser Code verwendet `RectangleF` Strukturen, um rechteckige Bereiche für die Redaktion zu definieren. Die Signaturregion befindet sich bei den Koordinaten (100, 650) mit einer Fläche von 200x50 Pixeln, während die Fotoregion bei (450, 700) mit einer Fläche von 100x120 Pixeln liegt. Die `RedactRegionsOnAllPages` Methode wendet schwarze Rechtecke über diese Bereiche auf allen Seiten an.
#### Musterausgabe
<iframe loading="lazy" src="/static-assets/pdf/tutorials/pdf-redaction-csharp/06-signed-agreement-after.pdf" width="100%" height="400px">
</iframe>
Die Bestimmung der richtigen Koordinaten erfordert oft einige Experimente oder Messungen. PDF-Seiten verwenden in der Regel ein Koordinatensystem, bei dem ein Punkt 1/72 eines Zolls entspricht. Eine Standardseite in US Letter ist 612 Punkte breit und 792 Punkte hoch. Der Umfang der A4-Seiten beträgt etwa 595 x 842 Punkte. PDF-Anzeigetools, die Koordinaten anzeigen, wenn Sie den Cursor bewegen, können helfen, oder Sie können die Seitenabmessungen programmatisch extrahieren:
```cs
using IronPdf;
using IronSoftware.Drawing;
PdfDocument pdf = PdfDocument.FromFile("form-document.pdf");
// Get dimensions of the first page
var pageInfo = pdf.Pages[0];
// Calculate regions relative to page dimensions
// Redact the bottom quarter of the page where signatures appear
float signatureAreaHeight = (float)(pageInfo.Height / 4);
RectangleF bottomQuarter = new RectangleF(
0, // Start at left edge
0, // Start at bottom
(float)pageInfo.Width, // Full page width
signatureAreaHeight // Quarter of page height
);
pdf.RedactRegionsOnAllPages(bottomQuarter);
// Redact a header area at the top containing letterhead with address
float headerHeight = 100;
RectangleF headerArea = new RectangleF(
0,
(float)(pageInfo.Height - headerHeight), // Position from bottom
(float)pageInfo.Width,
headerHeight
);
pdf.RedactRegionsOnAllPages(headerArea);
pdf.SaveAs("form-document-redacted.pdf");
```
<a id="anchor-multiple-regions"></a>
## Wie kann ich mehrere Regionen über verschiedene Seiten hinweg redigieren?
Bei komplexen Dokumenten müssen oft verschiedene Bereiche auf verschiedenen Seiten geschwärzt werden. Ein mehrseitiges Formular könnte Signaturen an unterschiedlichen Positionen enthalten, oder unterschiedliche Seiten könnten Fotos, Stempel oder andere grafische Elemente an einzigartigen Orten enthalten. IronPDF umfasst seitenbezogene Methoden für die gezielte Regionen-Redaktion.
```cs
using IronPdf;
using IronSoftware.Drawing;
PdfDocument pdf = PdfDocument.FromFile("multi-page-application.pdf");
// Define page-specific redaction regions
// Page 1: Cover page with applicant photo
RectangleF page1Photo = new RectangleF(450, 600, 120, 150);
pdf.RedactRegionOnPage(0, page1Photo);
// Page 2: Personal information section
RectangleF page2InfoBlock = new RectangleF(50, 400, 250, 200);
pdf.RedactRegionOnPage(1, page2InfoBlock);
// Pages 3-5: Signature lines at the same position
RectangleF signatureLine = new RectangleF(100, 100, 200, 40);
int[] signaturePages = { 2, 3, 4 };
pdf.RedactRegionOnPages(signaturePages, signatureLine);
// Page 6: Multiple regions - notary stamp and witness signature
RectangleF notaryStamp = new RectangleF(400, 150, 150, 150);
RectangleF witnessSignature = new RectangleF(100, 150, 200, 40);
pdf.RedactRegionOnPage(5, notaryStamp);
pdf.RedactRegionOnPage(5, witnessSignature);
pdf.SaveAs("multi-page-application-redacted.pdf");
```
Dokumente mit einheitlichem Layout profitieren von wiederverwendbaren Bereichsdefinitionen:
```cs
using IronPdf;
using IronSoftware.Drawing;
public class FormRegions
{
// Standard form regions based on common templates
public static RectangleF HeaderLogo => new RectangleF(20, 720, 150, 60);
public static RectangleF SignatureBlock => new RectangleF(72, 72, 200, 50);
public static RectangleF DateField => new RectangleF(400, 72, 120, 20);
public static RectangleF PhotoId => new RectangleF(480, 650, 100, 130);
public static RectangleF AddressBlock => new RectangleF(72, 600, 250, 80);
}
class Program
{
static void Main()
{
PdfDocument pdf = PdfDocument.FromFile("standard-form.pdf");
// Apply standard redactions using predefined regions
pdf.RedactRegionsOnAllPages(FormRegions.SignatureBlock);
pdf.RedactRegionsOnAllPages(FormRegions.DateField);
pdf.RedactRegionOnPage(0, FormRegions.PhotoId);
pdf.SaveAs("standard-form-redacted.pdf");
}
}
```
---
<a id="anchor-remove-metadata"></a>
## Wie entferne ich Metadaten, die vertrauliche Informationen preisgeben könnten?
PDF-Metadaten stellen eine häufig übersehene Quelle für Informationsverluste dar. Jede PDF-Datei enthält Eigenschaften, die sensible Details preisgeben können: Name und Benutzername des Autors, die Software, mit der das Dokument erstellt wurde, Zeitstempel für die Erstellung und Änderung, den ursprünglichen Dateinamen, den Änderungsverlauf und benutzerdefinierte Eigenschaften, die von verschiedenen Anwendungen hinzugefügt wurden. Bevor die Dokumente extern weitergegeben werden, müssen diese Metadaten entfernt oder bereinigt werden. Einen umfassenden Überblick über Metadatenoperationen finden Sie in unserem [metadata how-to guide](/how-to/metadata/).
IronPDF stellt Dokumentmetadaten über die `MetaData` Eigenschaft bereit, sodass Sie bestehende Werte lesen, ändern oder vollständig entfernen können.
```cs
using IronPdf;
using System;
// Load a document containing sensitive metadata
PdfDocument pdf = PdfDocument.FromFile("internal-report.pdf");
// Access current metadata properties
string author = pdf.MetaData.Author;
string title = pdf.MetaData.Title;
string subject = pdf.MetaData.Subject;
string keywords = pdf.MetaData.Keywords;
string creator = pdf.MetaData.Creator;
string producer = pdf.MetaData.Producer;
DateTime? creationDate = pdf.MetaData.CreationDate;
DateTime? modifiedDate = pdf.MetaData.ModifiedDate;
// Get all metadata keys including custom properties
var allKeys = pdf.MetaData.Keys();
```
Vor der Verteilung müssen sensible Metadaten entfernt werden:
#### Eingabe
Ein internes Memo, das eingebettete Metadaten wie Autorennamen, Erstellungszeitstempel und benutzerdefinierte Eigenschaften enthält, die vertrauliche Unternehmensinformationen preisgeben könnten.
<iframe loading="lazy" src="/static-assets/pdf/tutorials/pdf-redaction-csharp/07-internal-report-before.pdf" width="100%" height="400px">
</iframe>
```cs
using IronPdf;
using System;
PdfDocument pdf = PdfDocument.FromFile("confidential-memo.pdf");
// Replace identifying metadata with generic values
pdf.MetaData.Author = "Organization Name";
pdf.MetaData.Creator = "Document System";
pdf.MetaData.Producer = "";
pdf.MetaData.Title = "Public Document";
pdf.MetaData.Subject = "";
pdf.MetaData.Keywords = "";
// Normalize dates to remove timing information
pdf.MetaData.CreationDate = DateTime.Now;
pdf.MetaData.ModifiedDate = DateTime.Now;
// Remove specific custom metadata keys
pdf.MetaData.RemoveMetaDataKey("OriginalFilename");
pdf.MetaData.RemoveMetaDataKey("LastSavedBy");
pdf.MetaData.RemoveMetaDataKey("Company");
pdf.MetaData.RemoveMetaDataKey("Manager");
// Remove custom properties added by applications
try
{
pdf.MetaData.CustomProperties.Remove("SourcePath");
}
catch { }
pdf.SaveAs("confidential-memo-cleaned.pdf");
```
Dieser Code ersetzt identifizierende Metadatenfelder durch generische Werte, normalisiert Zeitstempel auf das aktuelle Datum und entfernt benutzerdefinierte Metadatenschlüssel, die Anwendungen möglicherweise hinzugefügt haben. Die `RemoveMetaDataKey` Methode zielt auf spezifische Eigenschaften wie "OriginalFilename" und "LastSavedBy" ab, die interne Informationen preisgeben könnten.
#### Musterausgabe
<iframe loading="lazy" src="/static-assets/pdf/tutorials/pdf-redaction-csharp/07-internal-report-after.pdf" width="100%" height="400px">
</iframe>
Die gründliche Bereinigung von Metadaten bei Batch-Vorgängen erfordert einen systematischen Ansatz:
```cs
using IronPdf;
using System;
using System.Collections.Generic;
public class MetadataCleaner
{
private readonly string _defaultAuthor;
private readonly string _defaultCreator;
public MetadataCleaner(string organizationName)
{
_defaultAuthor = organizationName;
_defaultCreator = $"{organizationName} Document System";
}
public void CleanMetadata(PdfDocument pdf)
{
// Replace standard metadata fields
pdf.MetaData.Author = _defaultAuthor;
pdf.MetaData.Creator = _defaultCreator;
pdf.MetaData.Producer = "";
pdf.MetaData.Subject = "";
pdf.MetaData.Keywords = "";
// Normalize timestamps
DateTime now = DateTime.Now;
pdf.MetaData.CreationDate = now;
pdf.MetaData.ModifiedDate = now;
// Get all keys and remove potentially sensitive ones
List<string> keysToRemove = new List<string>();
foreach (string key in pdf.MetaData.Keys())
{
// Keep only essential keys
if (!IsEssentialKey(key))
{
keysToRemove.Add(key);
}
}
foreach (string key in keysToRemove)
{
pdf.MetaData.RemoveMetaDataKey(key);
}
}
private bool IsEssentialKey(string key)
{
// Keep only the basic display properties
string[] essentialKeys = { "Title", "Author", "CreationDate", "ModifiedDate" };
foreach (string essential in essentialKeys)
{
if (key.Equals(essential, StringComparison.OrdinalIgnoreCase))
{
return true;
}
}
return false;
}
}
// Usage
class Program
{
static void Main()
{
MetadataCleaner cleaner = new MetadataCleaner("Acme Corporation");
PdfDocument pdf = PdfDocument.FromFile("report.pdf");
cleaner.CleanMetadata(pdf);
pdf.SaveAs("report-clean.pdf");
}
}
```
---
<a id="anchor-sanitize-pdf"></a>
## Wie kann ich eine PDF-Datei säubern, um eingebettete Skripte und versteckte Bedrohungen zu entfernen?
Die PDF-Sanitisierung befasst sich mit Sicherheitsfragen, die über den sichtbaren Inhalt und die Metadaten hinausgehen. PDF-Dateien können JavaScript-Code, eingebettete ausführbare Dateien, Formularaktionen, die externe Verbindungen auslösen, und andere potenziell schädliche Elemente enthalten. Diese Funktionen dienen legitimen Zwecken wie interaktiven Formularen und Multimedia-Inhalten, schaffen aber auch Angriffsmöglichkeiten. Durch die Bereinigung einer PDF-Datei werden diese aktiven Elemente entfernt, während der visuelle Inhalt erhalten bleibt. Weitere Einzelheiten zu den Bereinigungsmethoden finden Sie in unserer [Anleitung zur Bereinigung von PDF-Dateien](/how-to/sanitize-pdf/).
Die `Cleaner` Klasse von IronPDF behandelt die Bereinigung durch einen eleganten Ansatz: Konvertieren des PDFs in ein Bildformat und Rückkonvertierung. Bei diesem Prozess werden JavaScript, eingebettete Objekte, Formularaktionen und Anmerkungen entfernt, während das visuelle Erscheinungsbild intakt bleibt. Die Bibliothek bietet zwei Bereinigungsmethoden mit unterschiedlichen Merkmalen.
#### Eingabe
Ein PDF-Dokument, das von einer externen Quelle stammt und möglicherweise JavaScript, eingebettete Objekte oder andere potenziell schädliche aktive Inhalte enthält.
<iframe loading="lazy" src="/static-assets/pdf/tutorials/pdf-redaction-csharp/08-received-document-before.pdf" width="100%" height="400px">
</iframe>
```cs
using IronPdf;
// Load a PDF that may contain active content
PdfDocument pdf = PdfDocument.FromFile("received-document.pdf");
// Sanitize using SVG conversion
// Faster processing, results in searchable text, slight layout variations possible
PdfDocument sanitizedSvg = Cleaner.SanitizeWithSvg(pdf);
sanitizedSvg.SaveAs("sanitized-svg.pdf");
// Sanitize using Bitmap conversion
// Slower processing, text becomes image (not searchable), exact visual reproduction
PdfDocument sanitizedBitmap = Cleaner.SanitizeWithBitmap(pdf);
sanitizedBitmap.SaveAs("sanitized-bitmap.pdf");
```
Dieser Code demonstriert zwei Bereinigungsmethoden, die von der `Cleaner` Klasse von IronPDF bereitgestellt werden. `SanitizeWithSvg` konvertiert das PDF über ein SVG-Zwischenformat, wobei durchsuchbarer Text erhalten bleibt, während aktiver Inhalt entfernt wird. `SanitizeWithBitmap` konvertiert Seiten zuerst in Bilder, wodurch exakte visuelle Kopien erzeugt werden, jedoch mit als nicht durchsuchbare Grafiken gerendertem Text.
#### Musterausgabe
<iframe loading="lazy" src="/static-assets/pdf/tutorials/pdf-redaction-csharp/08-received-document-after.pdf" width="100%" height="400px">
</iframe>
Die SVG-Methode arbeitet schneller und bewahrt den Text als durchsuchbaren Inhalt, so dass sie sich für Dokumente eignet, die indiziert oder zugänglich bleiben müssen. Die Bitmap-Methode erzeugt exakte visuelle Kopien, wandelt aber den Text in Bilder um, was eine Textauswahl und -suche verhindert. Wählen Sie entsprechend Ihren Anforderungen an das Ausgabedokument.
Sie können auch Rendering-Optionen während der Bereinigung anwenden, um die Ausgabe anzupassen:
```cs
using IronPdf;
// Load the potentially unsafe document
PdfDocument pdf = PdfDocument.FromFile("untrusted-source.pdf");
// Configure rendering options for sanitization
var renderOptions = new ChromePdfRenderOptions
{
MarginTop = 10,
MarginBottom = 10,
MarginLeft = 10,
MarginRight = 10
};
// Sanitize with custom options
PdfDocument sanitized = Cleaner.SanitizeWithSvg(pdf, renderOptions);
sanitized.SaveAs("untrusted-source-safe.pdf");
```
In hochsicheren Umgebungen ist häufig die Kombination von Säuberung mit weiteren Schutzmaßnahmen erforderlich:
```cs
using IronPdf;
using System;
public class SecureDocumentProcessor
{
public PdfDocument ProcessUntrustedDocument(string inputPath)
{
// Load the document
PdfDocument original = PdfDocument.FromFile(inputPath);
// Step 1: Sanitize to remove active content
PdfDocument sanitized = Cleaner.SanitizeWithSvg(original);
// Step 2: Clean metadata
sanitized.MetaData.Author = "Processed Document";
sanitized.MetaData.Creator = "Secure Processor";
sanitized.MetaData.Producer = "";
sanitized.MetaData.CreationDate = DateTime.Now;
sanitized.MetaData.ModifiedDate = DateTime.Now;
// Remove all custom metadata
foreach (string key in sanitized.MetaData.Keys())
{
if (key != "Title" && key != "Author" && key != "CreationDate" && key != "ModifiedDate")
{
sanitized.MetaData.RemoveMetaDataKey(key);
}
}
return sanitized;
}
}
// Usage
class Program
{
static void Main()
{
SecureDocumentProcessor processor = new SecureDocumentProcessor();
PdfDocument safe = processor.ProcessUntrustedDocument("email-attachment.pdf");
safe.SaveAs("email-attachment-safe.pdf");
}
}
```
<a id="anchor-scan-vulnerabilities"></a>
## Wie scanne ich eine PDF-Datei auf Sicherheitsschwachstellen?
Bevor Sie Dokumente bearbeiten oder bereinigen, sollten Sie prüfen, welche potenziellen Bedrohungen sie enthalten. Die `Cleaner.ScanPdf` Methode von IronPDF untersucht Dokumente unter Verwendung von YARA-Regeln, dies sind Musterdefinitionen, die häufig in der Malware-Analyse und Bedrohungserkennung verwendet werden. Der Scan identifiziert Merkmale, die mit bösartigen PDF-Dateien verbunden sind.
```cs
using IronPdf;
// Load the document to scan
PdfDocument pdf = PdfDocument.FromFile("suspicious-document.pdf");
// Scan using default YARA rules
CleanerScanResult scanResult = Cleaner.ScanPdf(pdf);
// Check the scan results
bool threatsDetected = scanResult.IsDetected;
int riskCount = scanResult.Risks.Count;
// Process identified risks
if (scanResult.IsDetected)
{
foreach (var risk in scanResult.Risks)
{
// Handle each identified risk
}
// Sanitize the document before use
PdfDocument sanitized = Cleaner.SanitizeWithSvg(pdf);
sanitized.SaveAs("suspicious-document-safe.pdf");
}
```
Sie können benutzerdefinierte YARA-Regeldateien für spezielle Erkennungsanforderungen bereitstellen. Organisationen mit spezifischen Bedrohungsmodellen oder Compliance-Anforderungen unterhalten oft ihre eigenen Regelsätze, die auf bestimmte Schwachstellenmuster abzielen.
```cs
using IronPdf;
PdfDocument pdf = PdfDocument.FromFile("incoming-document.pdf");
// Scan with custom YARA rules
string[] customYaraFiles = { "corporate-rules.yar", "industry-specific.yar" };
CleanerScanResult result = Cleaner.ScanPdf(pdf, customYaraFiles);
if (result.IsDetected)
{
// Document triggered custom rules and requires review or sanitization
PdfDocument sanitized = Cleaner.SanitizeWithSvg(pdf);
sanitized.SaveAs("incoming-document-safe.pdf");
}
```
Die Integration des Scannens in die Arbeitsabläufe der Dokumentenerfassung hilft bei der Automatisierung von Sicherheitsentscheidungen:
```cs
using IronPdf;
using System;
using System.IO;
public enum DocumentSafetyLevel
{
Safe,
Suspicious,
Dangerous
}
public class DocumentSecurityGateway
{
public DocumentSafetyLevel EvaluateDocument(string filePath)
{
PdfDocument pdf = PdfDocument.FromFile(filePath);
CleanerScanResult scan = Cleaner.ScanPdf(pdf);
if (!scan.IsDetected)
{
return DocumentSafetyLevel.Safe;
}
// Evaluate severity based on number of risks
if (scan.Risks.Count > 5)
{
return DocumentSafetyLevel.Dangerous;
}
return DocumentSafetyLevel.Suspicious;
}
public PdfDocument ProcessIncomingDocument(string filePath, string outputDirectory)
{
DocumentSafetyLevel safety = EvaluateDocument(filePath);
string fileName = Path.GetFileName(filePath);
switch (safety)
{
case DocumentSafetyLevel.Safe:
return PdfDocument.FromFile(filePath);
case DocumentSafetyLevel.Suspicious:
PdfDocument suspicious = PdfDocument.FromFile(filePath);
return Cleaner.SanitizeWithSvg(suspicious);
case DocumentSafetyLevel.Dangerous:
throw new SecurityException($"Document {fileName} contains dangerous content");
default:
throw new InvalidOperationException("Unknown safety level");
}
}
}
```
---
<a id="anchor-complete-pipeline"></a>
## Wie kann ich eine vollständige Redaktions- und Bereinigungspipeline erstellen?
Die Verarbeitung von Produktionsdokumenten erfordert in der Regel die Kombination mehrerer Schutztechniken in einem kohärenten Arbeitsablauf. Eine vollständige Pipeline könnte eingehende Dokumente auf Bedrohungen scannen, diejenigen, die das erste Screening bestehen, bereinigen, Text- und Bereichsredaktionen anwenden, Metadaten entfernen und Prüfprotokolle erstellen, die alle durchgeführten Aktionen dokumentieren. Dieses Beispiel veranschaulicht einen solchen integrierten Ansatz.
```cs
using IronPdf;
using IronSoftware.Drawing;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text.RegularExpressions;
public class DocumentProcessingResult
{
public string OriginalFile { get; set; }
public string OutputFile { get; set; }
public bool WasSanitized { get; set; }
public int TextRedactionsApplied { get; set; }
public int RegionRedactionsApplied { get; set; }
public bool MetadataCleaned { get; set; }
public List<string> SensitiveDataTypesFound { get; set; } = new List<string>();
public DateTime ProcessedAt { get; set; }
public bool Success { get; set; }
public string ErrorMessage { get; set; }
}
public class ComprehensiveDocumentProcessor
{
// Sensitive data patterns
private readonly Dictionary<string, string> _sensitivePatterns = new Dictionary<string, string>
{
{ "SSN", @"\b\d{3}-\d{2}-\d{4}\b" },
{ "Credit Card", @"\b(?:\d{4}[-\s]?){3}\d{1,4}\b" },
{ "Email", @"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b" },
{ "Phone", @"\b(?:\(\d{3}\)\s?|\d{3}[-.])\d{3}[-.]?\d{4}\b" }
};
// Standard regions to redact (signature areas, photo locations)
private readonly List<RectangleF> _standardRedactionRegions = new List<RectangleF>
{
new RectangleF(72, 72, 200, 50), // Bottom left signature
new RectangleF(350, 72, 200, 50) // Bottom right signature
};
private readonly string _organizationName;
public ComprehensiveDocumentProcessor(string organizationName)
{
_organizationName = organizationName;
}
public DocumentProcessingResult ProcessDocument(
string inputPath,
string outputPath,
bool sanitize = true,
bool redactPatterns = true,
bool redactRegions = true,
bool cleanMetadata = true,
List<string> additionalTermsToRedact = null)
{
var result = new DocumentProcessingResult
{
OriginalFile = inputPath,
OutputFile = outputPath,
ProcessedAt = DateTime.Now
};
try
{
// Load the document
PdfDocument pdf = PdfDocument.FromFile(inputPath);
// Step 1: Security scan
CleanerScanResult scanResult = Cleaner.ScanPdf(pdf);
if (scanResult.IsDetected && scanResult.Risks.Count > 10)
{
throw new SecurityException("Document contains too many security risks to process");
}
// Step 2: Sanitization (if needed or requested)
if (sanitize || scanResult.IsDetected)
{
pdf = Cleaner.SanitizeWithSvg(pdf);
result.WasSanitized = true;
}
// Step 3: Pattern-based text redaction
if (redactPatterns)
{
string fullText = pdf.ExtractAllText();
HashSet<string> valuesToRedact = new HashSet<string>();
foreach (var pattern in _sensitivePatterns)
{
Regex regex = new Regex(pattern.Value, RegexOptions.IgnoreCase);
MatchCollection matches = regex.Matches(fullText);
if (matches.Count > 0)
{
result.SensitiveDataTypesFound.Add($"{pattern.Key} ({matches.Count})");
foreach (Match match in matches)
{
valuesToRedact.Add(match.Value);
}
}
}
// Apply redactions
foreach (string value in valuesToRedact)
{
pdf.RedactTextOnAllPages(value);
result.TextRedactionsApplied++;
}
}
// Step 4: Additional specific terms
if (additionalTermsToRedact != null)
{
foreach (string term in additionalTermsToRedact)
{
pdf.RedactTextOnAllPages(term);
result.TextRedactionsApplied++;
}
}
// Step 5: Region-based redaction
if (redactRegions)
{
foreach (RectangleF region in _standardRedactionRegions)
{
pdf.RedactRegionsOnAllPages(region);
result.RegionRedactionsApplied++;
}
}
// Step 6: Metadata cleaning
if (cleanMetadata)
{
pdf.MetaData.Author = _organizationName;
pdf.MetaData.Creator = $"{_organizationName} Document Processor";
pdf.MetaData.Producer = "";
pdf.MetaData.Subject = "";
pdf.MetaData.Keywords = "";
pdf.MetaData.CreationDate = DateTime.Now;
pdf.MetaData.ModifiedDate = DateTime.Now;
result.MetadataCleaned = true;
}
// Step 7: Save the processed document
pdf.SaveAs(outputPath);
result.Success = true;
}
catch (Exception ex)
{
result.Success = false;
result.ErrorMessage = ex.Message;
}
return result;
}
}
// Usage example
class Program
{
static void Main()
{
var processor = new ComprehensiveDocumentProcessor("Acme Corporation");
// Process a single document with all protections
var result = processor.ProcessDocument(
inputPath: "customer-application.pdf",
outputPath: "customer-application-redacted.pdf",
sanitize: true,
redactPatterns: true,
redactRegions: true,
cleanMetadata: true,
additionalTermsToRedact: new List<string> { "Project Alpha", "Internal Use Only" }
);
// Batch process multiple documents
string[] inputFiles = Directory.GetFiles("incoming", "*.pdf");
foreach (string file in inputFiles)
{
string outputFile = Path.Combine("processed", Path.GetFileName(file));
processor.ProcessDocument(file, outputFile);
}
}
}
```
#### Eingabe
Ein Kundenantragsformular, das mehrere Arten sensibler Daten enthält, darunter Sozialversicherungsnummern, Kreditkartennummern, E-Mail-Adressen und Unterschriftenblöcke, die umfassend geschützt werden müssen.
<iframe loading="lazy" src="/static-assets/pdf/tutorials/pdf-redaction-csharp/09-complete-pipeline-before.pdf" width="100%" height="400px">
</iframe>
#### Musterausgabe
<iframe loading="lazy" src="/static-assets/pdf/tutorials/pdf-redaction-csharp/09-complete-pipeline-after.pdf" width="100%" height="400px">
</iframe>
Dieser umfassende Prozessor fasst alle in diesem Handbuch behandelten Techniken in einer einzigen, konfigurierbaren Klasse zusammen. Es scannt nach Bedrohungen, bereinigt, wenn nötig, findet und entfernt sensible Muster, wendet regionale Korrekturen an, bereinigt Metadaten und erstellt detaillierte Berichte. Sie können die Empfindlichkeitsmuster, Schwärzungsbereiche und Verarbeitungsoptionen an Ihre spezifischen Anforderungen anpassen.
---
<a id="anchor-next-steps"></a>
## Nächste Schritte
Der Schutz sensibler Informationen in PDF-Dokumenten erfordert mehr als nur oberflächliche Maßnahmen. Bei einer echten Schwärzung wird der Inhalt dauerhaft aus der Dokumentstruktur entfernt. [Musterabgleich](/how-to/redact-text/) automatisiert das Auffinden und Entfernen von Daten wie Sozialversicherungsnummern, Kreditkartendaten und E-Mail-Adressen. Die regionenbasierte Schwärzung behandelt Unterschriften, Fotos und andere grafische Elemente, die durch Textmatching nicht erfasst werden können. [Bereinigung von Metadaten](/how-to/metadata/) beseitigt versteckte Informationen, die Autoren, Zeitstempel oder interne Dateipfade verraten könnten. [Sanitization](/how-to/sanitize-pdf/) entfernt eingebettete Skripte und aktive Inhalte, die ein Sicherheitsrisiko darstellen.
[IronPDF](https://ironpdf.com/) bietet all diese Funktionen über eine konsistente, gut durchdachte API, die sich auf natürliche Weise in die C#- und .NET-Entwicklungspraktiken einfügt. Die in diesem Leitfaden vorgestellten Methoden können einzelne Dokumente bearbeiten oder auf [Stapelverarbeitung](/tutorials/batch-pdf-processing-csharp/) von Tausenden von Dateien skalieren. Ganz gleich, ob Sie [Compliance-Workflows](/tutorials/csharp-pdf-security-complete-tutorial/) für Daten aus dem Gesundheitswesen erstellen, juristische Dokumente für die Offenlegung vorbereiten oder einfach nur sicherstellen, dass interne Berichte sicher nach außen weitergegeben werden können, diese Techniken bilden die Grundlage für einen verantwortungsvollen Umgang mit Dokumenten. Für eine umfassende Sicherheitsabdeckung kombinieren Sie die Schwärzung mit [Passwortschutz und Berechtigungen](/how-to/pdf-permissions-passwords/) und [digitalen Signaturen](/how-to/signing/).
Bereit, loszulegen? [IronPDF herunterladen](download-modal) und mit einer kostenlosen Testversion ausprobieren. Die Bibliothek enthält eine kostenlose Entwicklungslizenz, so dass Sie die Redigier-, [Textextraktions-](/how-to/extract-text-and-images/) und Bereinigungsfunktionen ausgiebig testen können, bevor Sie sich für eine Produktionslizenz entscheiden. Wenn Sie Fragen zur Implementierung oder zu Compliance-Workflows haben, [wenden Sie sich an unser technisches Support-Team](/troubleshooting/engineering-request-pdf/).
die PDF-Redaktion in C# .NET mit IronPDF entfernt sensible Inhalte dauerhaft aus der internen Struktur eines Dokuments, anstatt sie nur optisch zu verdecken, so dass die Originaldaten weder durch Kopieren noch durch Suchen oder forensische Analysen wiederhergestellt werden können. Dies geht weit über schwarze Rechtecke über dem Text hinaus: IronPDF bietet Textschwärzung mit Regex-Musterabgleich, regionale Schwärzung für Signaturen und Bilder, Entfernen von Metadaten, Dokumentenbereinigung zur Eliminierung eingebetteter Skripte und Schwachstellen-Scanning, so dass .NET-Entwickler ein komplettes Toolkit für HIPAA-, GDPR- und PCI DSS-konforme Dokumentenschutz-Workflows erhalten.
TL;DR: Schnellstartanleitung
Dieses Tutorial behandelt das dauerhafte Entfernen sensibler Inhalte aus PDF-Dokumenten in C# .NET, einschließlich Textmustern, Bildbereichen, Metadaten und eingebetteten Skripten.
Für wen ist das?: .NET-Entwickler, die mit sensiblen Dokumenten in den Bereichen Gesundheitswesen, Recht, Finanzen oder Behörden arbeiten.
Was Sie erstellen werden: Textredaktion mit Regex-Musterabgleich (SSN, Kreditkarten, E-Mails), koordinatenbasierte Bereichsredaktion für Unterschriften und Fotos, Metadatenbereinigung, PDF-Sanitization zum Entfernen eingebetteter Skripte und YARA-basiertes Scannen auf Sicherheitslücken.
Wo es läuft: .NET 10, .NET 8 LTS, .NET Framework 4.6.2+, und .NET Standard 2.0. Alle Vorgänge werden lokal und ohne externe Abhängigkeiten ausgeführt.
Wann ist dieser Ansatz zu empfehlen: Wenn Sie Dokumente für die Offenlegung vor Gericht, für FOIA-Anfragen oder für die externe Verteilung freigeben und gleichzeitig sicherstellen müssen, dass entfernte Inhalte wirklich verschwunden sind.
Warum es technisch wichtig ist: Visuelle Überlagerungen lassen den Originaltext in den Inhaltsströmen der PDF-Datei wiederherstellbar. Die IronPDF-Redaktion löscht die Zeichendaten aus der Dokumentstruktur selbst, so dass eine Wiederherstellung unmöglich ist.
Schwärzen Sie sensiblen Text aus einer PDF-Datei mit nur wenigen Codezeilen:
1Install IronPDF with NuGet Package Manager
PM > Install-Package IronPdf
Install-Package IronPdf
2Kopieren Sie diesen Codeausschnitt und führen Sie ihn aus.
using IronPdf;PdfDocument pdf = PdfDocument.FromFile("confidential-report.pdf");pdf.RedactTextOnAllPages("CONFIDENTIAL");pdf.SaveAs("redacted-report.pdf");
using IronPdf;
PdfDocument pdf = PdfDocument.FromFile("confidential-report.pdf");
pdf.RedactTextOnAllPages("CONFIDENTIAL");
pdf.SaveAs("redacted-report.pdf");
C#
3Bereitstellen zum Testen in Ihrer Live-Umgebung
Beginnen Sie noch heute, IronPDF in Ihrem Projekt zu verwenden, mit einer kostenlosen Testversion
Nachdem Sie IronPDF gekauft oder sich für eine 30-tägige Testversion angemeldet haben, fügen Sie Ihren Lizenzschlüssel am Anfang Ihrer Anwendung hinzu.
Was ist der Unterschied zwischen echter Redaktion und visueller Überlagerung?
Das Verständnis des Unterschieds zwischen echter Schwärzung und visueller Überlagerung ist für jeden, der mit sensiblen Dokumenten umgeht, entscheidend. Viele Tools und manuelle Methoden erwecken den Anschein der Schwärzung, ohne dass die zugrunde liegenden Daten tatsächlich entfernt werden. Dieses falsche Sicherheitsgefühl hat zahlreiche hochkarätige Datenschutzverletzungen und Compliance-Verstöße verursacht.
Visuelle Überlagerungsansätze zeichnen normalerweise undurchsichtige Formen über sensible Inhalte. Der Text bleibt innerhalb der PDF-Struktur vollständig intakt. Wer das Dokument betrachtet, sieht ein schwarzes Rechteck, aber die Originalzeichen sind in den Inhaltsströmen der Datei noch vorhanden. Die Auswahl des gesamten Textes auf der Seite, die Verwendung von Werkzeugen für die Barrierefreiheit oder die Untersuchung der PDF-Rohdaten offenbaren alles, was vermeintlich verborgen war. Gerichtsprozesse wurden gefährdet, wenn geschwärzte Dokumente von der gegnerischen Verteidigung nicht geschwärzt wurden. Regierungsbehörden haben versehentlich Verschlusssachen veröffentlicht, die zensiert erschienen, aber vollständig wiederherstellbar waren.
Echtes Redigieren funktioniert anders. Wenn Sie die Redaktionsmethoden von IronPDF verwenden, sucht die Bibliothek den angegebenen Text in der internen Struktur der PDF-Datei und entfernt ihn vollständig. Die Zeichendaten werden aus den Inhaltsströmen gelöscht. Die visuelle Darstellung wird durch eine Schwärzungsmarkierung, in der Regel ein schwarzes Rechteck, ersetzt, aber der ursprüngliche Inhalt ist in der Datei nicht mehr vorhanden. Keine Auswahl, kein Kopieren und keine forensische Analyse kann wiederherstellen, was dauerhaft gelöscht wurde.
IronPDF implementiert echte Schwärzung, indem es die PDF-Datei auf struktureller Ebene verändert. Die RedactTextOnAllPages Methode und ihre Varianten durchsuchen den Seiteninhalt, identifizieren übereinstimmenden Text, entfernen ihn aus dem Dokumentobjektmodell und zeichnen optional einen visuellen Indikator an der Stelle, an der der Inhalt zuvor erschienen ist. Dieser Ansatz steht im Einklang mit den Richtlinien von Organisationen wie NIST für die sichere Schwärzung von Dokumenten.
Die praktischen Implikationen sind erheblich. Wenn Sie Dokumente extern weitergeben, Dateien für die gerichtliche Offenlegung einreichen, Aufzeichnungen im Rahmen der Informationsfreiheit veröffentlichen oder Berichte verteilen und dabei personenbezogene Daten schützen müssen, bietet nur eine echte Schwärzung angemessenen Schutz. Visuelle Überlagerungen mögen für interne Entwürfe ausreichen, bei denen Sie einfach nur die Aufmerksamkeit von bestimmten Abschnitten ablenken wollen, aber für den tatsächlichen Datenschutz sollte man ihnen nicht vertrauen. Weitere Maßnahmen zur Dokumentensicherheit finden Sie in unseren Leitfäden zur Verschlüsselung von PDFs und digitalen Signaturen.
How do I Redact PDF Text in C# Across an Entire Document?
Das häufigste Redaktionsszenario besteht darin, dass alle Instanzen eines bestimmten Textes in einem Dokument entfernt werden. Vielleicht müssen Sie den Namen einer Person aus einem Bericht streichen, Kontonummern aus Finanzberichten entfernen oder interne Referenzcodes vor der externen Verteilung entfernen. IronPDF macht dies mit der RedactTextOnAllPages Methode einfach.
Eingabe
Ein Dokument für Mitarbeiterunterlagen, das persönliche Informationen wie Namen, Sozialversicherungsnummern und Mitarbeiter-IDs enthält.
using IronPdf;// Load the source documentPdfDocument pdf = PdfDocument.FromFile("employee-records.pdf");// Redact an employee name from the entire documentpdf.RedactTextOnAllPages("John Smith");// Redact a Social Security Numberpdf.RedactTextOnAllPages("123-45-6789");// Redact an internal employee IDpdf.RedactTextOnAllPages("EMP-2024-0042");// Save the cleaned documentpdf.SaveAs("employee-records-redacted.pdf");
using IronPdf;
// Load the source document
PdfDocument pdf = PdfDocument.FromFile("employee-records.pdf");
// Redact an employee name from the entire document
pdf.RedactTextOnAllPages("John Smith");
// Redact a Social Security Number
pdf.RedactTextOnAllPages("123-45-6789");
// Redact an internal employee ID
pdf.RedactTextOnAllPages("EMP-2024-0042");
// Save the cleaned document
pdf.SaveAs("employee-records-redacted.pdf");
ImportsIronPdf' Load the source documentDim pdf AsPdfDocument = PdfDocument.FromFile("employee-records.pdf")' Redact an employee name from the entire documentpdf.RedactTextOnAllPages("John Smith")' Redact a Social Security Numberpdf.RedactTextOnAllPages("123-45-6789")' Redact an internal employee IDpdf.RedactTextOnAllPages("EMP-2024-0042")' Save the cleaned documentpdf.SaveAs("employee-records-redacted.pdf")
Imports IronPdf
' Load the source document
Dim pdf As PdfDocument = PdfDocument.FromFile("employee-records.pdf")
' Redact an employee name from the entire document
pdf.RedactTextOnAllPages("John Smith")
' Redact a Social Security Number
pdf.RedactTextOnAllPages("123-45-6789")
' Redact an internal employee ID
pdf.RedactTextOnAllPages("EMP-2024-0042")
' Save the cleaned document
pdf.SaveAs("employee-records-redacted.pdf")
Dieser Code lädt ein PDF-Dokument, das Mitarbeiterinformationen enthält, und entfernt drei vertrauliche Daten, indem er für jeden Wert RedactTextOnAllPages aufruft. Bei jedem Aufruf wird jede Seite des Dokuments durchsucht und alle übereinstimmenden Instanzen des Namens, der Sozialversicherungsnummer und der internen Kennung des Mitarbeiters werden dauerhaft entfernt.
Musterausgabe
Das Standardverhalten zeichnet schwarze Rechtecke an den Stellen, an denen der geschwärzte Text erschien, und ersetzt die tatsächlichen Zeichen durch Sternchen in der Dokumentstruktur. Dadurch wird sowohl visuell bestätigt, dass eine Schwärzung stattgefunden hat, als auch sichergestellt, dass der ursprüngliche Inhalt vollständig verschwunden ist.
Wenn Sie mit längeren Dokumenten oder mehreren Schwärzungszielen arbeiten, können Sie diese Aufrufe effizient verketten:
using IronPdf;using System.Collections.Generic;// Load the document oncePdfDocument pdf = PdfDocument.FromFile("quarterly-report.pdf");// Define all terms that need redactionList<string> sensitiveTerms = new List<string>{ "Project Titan", "Sarah Johnson", "Budget: $4.2M", "Q3-INTERNAL-2024", "sarah.johnson@company.com"};// Redact each termforeach (string term in sensitiveTerms){ pdf.RedactTextOnAllPages(term);}// Save the resultpdf.SaveAs("quarterly-report-public.pdf");
using IronPdf;
using System.Collections.Generic;
// Load the document once
PdfDocument pdf = PdfDocument.FromFile("quarterly-report.pdf");
// Define all terms that need redaction
List<string> sensitiveTerms = new List<string>
{
"Project Titan",
"Sarah Johnson",
"Budget: $4.2M",
"Q3-INTERNAL-2024",
"sarah.johnson@company.com"
};
// Redact each term
foreach (string term in sensitiveTerms)
{
pdf.RedactTextOnAllPages(term);
}
// Save the result
pdf.SaveAs("quarterly-report-public.pdf");
ImportsIronPdfImportsSystem.Collections.Generic' Load the document onceDim pdf AsPdfDocument = PdfDocument.FromFile("quarterly-report.pdf")' Define all terms that need redactionDim sensitiveTerms As New List(OfString) From { "Project Titan", "Sarah Johnson", "Budget: $4.2M", "Q3-INTERNAL-2024", "sarah.johnson@company.com"}' Redact each termFor Each term AsStringIn sensitiveTerms pdf.RedactTextOnAllPages(term)Next' Save the resultpdf.SaveAs("quarterly-report-public.pdf")
Imports IronPdf
Imports System.Collections.Generic
' Load the document once
Dim pdf As PdfDocument = PdfDocument.FromFile("quarterly-report.pdf")
' Define all terms that need redaction
Dim sensitiveTerms As New List(Of String) From {
"Project Titan",
"Sarah Johnson",
"Budget: $4.2M",
"Q3-INTERNAL-2024",
"sarah.johnson@company.com"
}
' Redact each term
For Each term As String In sensitiveTerms
pdf.RedactTextOnAllPages(term)
Next
' Save the result
pdf.SaveAs("quarterly-report-public.pdf")
Dieses Muster funktioniert gut, wenn Sie eine bekannte Liste sensibler Werte haben, die entfernt werden müssen. Das Dokument wird einmal geladen, alle Korrekturen werden im Speicher vorgenommen und das Endergebnis wird gespeichert. Jeder Begriff wird unabhängig bearbeitet, sodass partielle Übereinstimmungen oder Formatierungsunterschiede zwischen Begriffen keine Auswirkungen auf andere Redaktionen haben.
Wie kann ich Text nur auf bestimmten Seiten schwärzen?
Manchmal benötigen Sie eine genauere Kontrolle über die Stellen, an denen Schwärzungen vorgenommen werden. Ein Dokument kann ein Deckblatt mit Informationen enthalten, die intakt bleiben sollen, oder Sie wissen, dass vertrauliche Daten nur in bestimmten Abschnitten erscheinen. IronPDF bietet RedactTextOnPage für die Redaktion einer einzelnen Seite und RedactTextOnPages zum Anvisieren mehrerer spezifischer Seiten.
Eingabe
Ein mehrseitiges Vertragsbündel mit Kundennamen auf der Unterschriftenseite und finanziellen Bedingungen, die auf bestimmten Seiten im Dokument erscheinen.
using IronPdf;// Load the documentPdfDocument pdf = PdfDocument.FromFile("contract-bundle.pdf");// Redact text only on page 1 (index 0)pdf.RedactTextOnPage(0, "Client Name: Acme Corporation");// Redact text on pages 3, 5, and 7 (indices 2, 4, 6)int[] financialPages = { 2, 4, 6 };pdf.RedactTextOnPages(financialPages, "Payment Terms: Net 30");// Other pages remain untouched except for the specific redactions appliedpdf.SaveAs("contract-bundle-redacted.pdf");
using IronPdf;
// Load the document
PdfDocument pdf = PdfDocument.FromFile("contract-bundle.pdf");
// Redact text only on page 1 (index 0)
pdf.RedactTextOnPage(0, "Client Name: Acme Corporation");
// Redact text on pages 3, 5, and 7 (indices 2, 4, 6)
int[] financialPages = { 2, 4, 6 };
pdf.RedactTextOnPages(financialPages, "Payment Terms: Net 30");
// Other pages remain untouched except for the specific redactions applied
pdf.SaveAs("contract-bundle-redacted.pdf");
ImportsIronPdf' Load the documentDim pdf AsPdfDocument = PdfDocument.FromFile("contract-bundle.pdf")' Redact text only on page 1 (index 0)pdf.RedactTextOnPage(0, "Client Name: Acme Corporation")' Redact text on pages 3, 5, and 7 (indices 2, 4, 6)Dim financialPages AsInteger() = {2, 4, 6}pdf.RedactTextOnPages(financialPages, "Payment Terms: Net 30")' Other pages remain untouched except for the specific redactions appliedpdf.SaveAs("contract-bundle-redacted.pdf")
Imports IronPdf
' Load the document
Dim pdf As PdfDocument = PdfDocument.FromFile("contract-bundle.pdf")
' Redact text only on page 1 (index 0)
pdf.RedactTextOnPage(0, "Client Name: Acme Corporation")
' Redact text on pages 3, 5, and 7 (indices 2, 4, 6)
Dim financialPages As Integer() = {2, 4, 6}
pdf.RedactTextOnPages(financialPages, "Payment Terms: Net 30")
' Other pages remain untouched except for the specific redactions applied
pdf.SaveAs("contract-bundle-redacted.pdf")
Dieser Code demonstriert gezielte Redaktionen durch Verwendung von RedactTextOnPage für eine einzelne Seite und RedactTextOnPages für mehrere spezifische Seiten. Der Kundenname wird nur auf Seite 1 (Index 0) entfernt, während die Zahlungsbedingungen auf den Seiten 3, 5 und 7 (Indizes 2, 4, 6) geschwärzt werden, während alle anderen Seiten unberührt bleiben.
Musterausgabe
Seitenindizes in IronPDF sind nullbasiert, was bedeutet, dass die erste Seite den Index 0 hat, die zweite den Index 1 und so weiter. Dies entspricht den Standard-Programmierkonventionen und der Denkweise der meisten Entwickler über Array-Zugriff.
Die Ausrichtung auf bestimmte Seiten verbessert die Leistung bei der Verarbeitung großer Dokumente. Anstatt Hunderte von Seiten nach Text zu durchsuchen, der nur an einigen wenigen Stellen vorkommt, können Sie der Redaktionsmaschine genau sagen, wo sie suchen soll. Dies ist wichtig für Stapelverarbeitungsszenarien, in denen Sie möglicherweise Tausende von Dokumenten verarbeiten. Um einen maximalen Durchsatz zu erzielen, sollten Sie async und Multithreading Techniken verwenden.
using IronPdf;// Process a large document efficientlyPdfDocument pdf = PdfDocument.FromFile("annual-report-500-pages.pdf");// We know from document structure that:// - Executive summary with names is on pages 1-3// - Financial data is on pages 45-60// - Appendix with employee info is on pages 480-495// Redact executive names from summary sectionfor (int i = 0; i <= 2; i++){ pdf.RedactTextOnPage(i, "CEO: Robert Williams"); pdf.RedactTextOnPage(i, "CFO: Maria Garcia");}// Redact specific financial figures from the financial sectionint[] financialSection = { 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59 };pdf.RedactTextOnPages(financialSection, "Net Revenue: $847M");// Redact employee identifiers from appendixfor (int i = 479; i <= 494; i++){ pdf.RedactTextOnPage(i, "Employee ID:");}pdf.SaveAs("annual-report-public-release.pdf");
using IronPdf;
// Process a large document efficiently
PdfDocument pdf = PdfDocument.FromFile("annual-report-500-pages.pdf");
// We know from document structure that:
// - Executive summary with names is on pages 1-3
// - Financial data is on pages 45-60
// - Appendix with employee info is on pages 480-495
// Redact executive names from summary section
for (int i = 0; i <= 2; i++)
{
pdf.RedactTextOnPage(i, "CEO: Robert Williams");
pdf.RedactTextOnPage(i, "CFO: Maria Garcia");
}
// Redact specific financial figures from the financial section
int[] financialSection = { 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59 };
pdf.RedactTextOnPages(financialSection, "Net Revenue: $847M");
// Redact employee identifiers from appendix
for (int i = 479; i <= 494; i++)
{
pdf.RedactTextOnPage(i, "Employee ID:");
}
pdf.SaveAs("annual-report-public-release.pdf");
ImportsIronPdf' Process a large document efficientlyDim pdf AsPdfDocument = PdfDocument.FromFile("annual-report-500-pages.pdf")' We know from document structure that:' - Executive summary with names is on pages 1-3' - Financial data is on pages 45-60' - Appendix with employee info is on pages 480-495' Redact executive names from summary sectionFor i AsInteger = 0 To 2 pdf.RedactTextOnPage(i, "CEO: Robert Williams") pdf.RedactTextOnPage(i, "CFO: Maria Garcia")Next' Redact specific financial figures from the financial sectionDim financialSection AsInteger() = {44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59}pdf.RedactTextOnPages(financialSection, "Net Revenue: $847M")' Redact employee identifiers from appendixFor i AsInteger = 479 To 494 pdf.RedactTextOnPage(i, "Employee ID:")Nextpdf.SaveAs("annual-report-public-release.pdf")
Imports IronPdf
' Process a large document efficiently
Dim pdf As PdfDocument = PdfDocument.FromFile("annual-report-500-pages.pdf")
' We know from document structure that:
' - Executive summary with names is on pages 1-3
' - Financial data is on pages 45-60
' - Appendix with employee info is on pages 480-495
' Redact executive names from summary section
For i As Integer = 0 To 2
pdf.RedactTextOnPage(i, "CEO: Robert Williams")
pdf.RedactTextOnPage(i, "CFO: Maria Garcia")
Next
' Redact specific financial figures from the financial section
Dim financialSection As Integer() = {44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59}
pdf.RedactTextOnPages(financialSection, "Net Revenue: $847M")
' Redact employee identifiers from appendix
For i As Integer = 479 To 494
pdf.RedactTextOnPage(i, "Employee ID:")
Next
pdf.SaveAs("annual-report-public-release.pdf")
Dieser gezielte Ansatz verarbeitet nur die relevanten Abschnitte eines 500-seitigen Dokuments und reduziert die Ausführungszeit erheblich im Vergleich zur Durchsuchung jeder Seite nach jedem Redaktionsbegriff.
Wie kann ich das Erscheinungsbild von geschwärzten Inhalten anpassen?
IronPDF bietet mehrere Parameter, um zu steuern, wie Schwärzungen im endgültigen Dokument erscheinen. Sie können die Groß- und Kleinschreibung, den Abgleich ganzer Wörter, das Zeichnen visueller Rechtecke und den Ersatztext, der anstelle des geschwärzten Inhalts erscheint, anpassen.
Eingabe
Ein juristischer Schriftsatz mit verschiedenen sensiblen Begriffen wie Klassifizierungskennzeichen, Passwörtern und internen Referenzcodes, die unterschiedliche Schwärzungsmaßnahmen erfordern.
using IronPdf;// Load the documentPdfDocument pdf = PdfDocument.FromFile("legal-brief.pdf");// Case-sensitive redaction: only matches exact case// "CLASSIFIED" will be redacted but "classified" or "Classified" will notpdf.RedactTextOnAllPages( "CLASSIFIED",CaseSensitive: true,OnlyMatchWholeWords: true,DrawRectangles: true,ReplacementText: "[REDACTED]");// Case-insensitive redaction: matches regardless of case// Will redact "Secret", "SECRET", "secret", etc.pdf.RedactTextOnAllPages( "secret",CaseSensitive: false,OnlyMatchWholeWords: true,DrawRectangles: true,ReplacementText: "*****");// Whole word disabled: matches partial strings too// Will redact "password", "passwords", "mypassword123", etc.pdf.RedactTextOnAllPages( "password",CaseSensitive: false,OnlyMatchWholeWords: false,DrawRectangles: true,ReplacementText: "XXXXX");// No visual rectangle: text is removed but no black box appears// Useful when you want seamless removal without obvious redaction markspdf.RedactTextOnAllPages( "internal-reference-code",CaseSensitive: true,OnlyMatchWholeWords: true,DrawRectangles: false,ReplacementText: "");pdf.SaveAs("legal-brief-redacted.pdf");
using IronPdf;
// Load the document
PdfDocument pdf = PdfDocument.FromFile("legal-brief.pdf");
// Case-sensitive redaction: only matches exact case
// "CLASSIFIED" will be redacted but "classified" or "Classified" will not
pdf.RedactTextOnAllPages(
"CLASSIFIED",
CaseSensitive: true,
OnlyMatchWholeWords: true,
DrawRectangles: true,
ReplacementText: "[REDACTED]"
);
// Case-insensitive redaction: matches regardless of case
// Will redact "Secret", "SECRET", "secret", etc.
pdf.RedactTextOnAllPages(
"secret",
CaseSensitive: false,
OnlyMatchWholeWords: true,
DrawRectangles: true,
ReplacementText: "*****"
);
// Whole word disabled: matches partial strings too
// Will redact "password", "passwords", "mypassword123", etc.
pdf.RedactTextOnAllPages(
"password",
CaseSensitive: false,
OnlyMatchWholeWords: false,
DrawRectangles: true,
ReplacementText: "XXXXX"
);
// No visual rectangle: text is removed but no black box appears
// Useful when you want seamless removal without obvious redaction marks
pdf.RedactTextOnAllPages(
"internal-reference-code",
CaseSensitive: true,
OnlyMatchWholeWords: true,
DrawRectangles: false,
ReplacementText: ""
);
pdf.SaveAs("legal-brief-redacted.pdf");
ImportsIronPdf' Load the documentDim pdf AsPdfDocument = PdfDocument.FromFile("legal-brief.pdf")' Case-sensitive redaction: only matches exact case' "CLASSIFIED" will be redacted but "classified" or "Classified" will notpdf.RedactTextOnAllPages( "CLASSIFIED",CaseSensitive:=True,OnlyMatchWholeWords:=True,DrawRectangles:=True,ReplacementText:="[REDACTED]")' Case-insensitive redaction: matches regardless of case' Will redact "Secret", "SECRET", "secret", etc.pdf.RedactTextOnAllPages( "secret",CaseSensitive:=False,OnlyMatchWholeWords:=True,DrawRectangles:=True,ReplacementText:="*****")' Whole word disabled: matches partial strings too' Will redact "password", "passwords", "mypassword123", etc.pdf.RedactTextOnAllPages( "password",CaseSensitive:=False,OnlyMatchWholeWords:=False,DrawRectangles:=True,ReplacementText:="XXXXX")' No visual rectangle: text is removed but no black box appears' Useful when you want seamless removal without obvious redaction markspdf.RedactTextOnAllPages( "internal-reference-code",CaseSensitive:=True,OnlyMatchWholeWords:=True,DrawRectangles:=False,ReplacementText:="")pdf.SaveAs("legal-brief-redacted.pdf")
Imports IronPdf
' Load the document
Dim pdf As PdfDocument = PdfDocument.FromFile("legal-brief.pdf")
' Case-sensitive redaction: only matches exact case
' "CLASSIFIED" will be redacted but "classified" or "Classified" will not
pdf.RedactTextOnAllPages(
"CLASSIFIED",
CaseSensitive:=True,
OnlyMatchWholeWords:=True,
DrawRectangles:=True,
ReplacementText:="[REDACTED]"
)
' Case-insensitive redaction: matches regardless of case
' Will redact "Secret", "SECRET", "secret", etc.
pdf.RedactTextOnAllPages(
"secret",
CaseSensitive:=False,
OnlyMatchWholeWords:=True,
DrawRectangles:=True,
ReplacementText:="*****"
)
' Whole word disabled: matches partial strings too
' Will redact "password", "passwords", "mypassword123", etc.
pdf.RedactTextOnAllPages(
"password",
CaseSensitive:=False,
OnlyMatchWholeWords:=False,
DrawRectangles:=True,
ReplacementText:="XXXXX"
)
' No visual rectangle: text is removed but no black box appears
' Useful when you want seamless removal without obvious redaction marks
pdf.RedactTextOnAllPages(
"internal-reference-code",
CaseSensitive:=True,
OnlyMatchWholeWords:=True,
DrawRectangles:=False,
ReplacementText:=""
)
pdf.SaveAs("legal-brief-redacted.pdf")
Dieser Code demonstriert vier verschiedene Redaktionskonfigurationen unter Verwendung der optionalen Parameter von RedactTextOnAllPages. Sie zeigt den exakten Abgleich unter Berücksichtigung der Groß- und Kleinschreibung mit der Ersetzung von "[REDACTED]", den Abgleich ohne Berücksichtigung der Groß- und Kleinschreibung mit Sternchen, den Abgleich von Teilwörtern, um Variationen wie "Passwörter" zu erfassen, und die unsichtbare Entfernung ohne visuelle Rechtecke für die nahtlose Eliminierung von Inhalten.
Musterausgabe
Die Parameter dienen unterschiedlichen Zwecken, je nach Ihren Anforderungen:
CaseSensitive bestimmt, ob bei der Übereinstimmung die Groß- und Kleinschreibung berücksichtigt wird. Juristische Dokumente verwenden häufig spezifische Großschreibungen, die Bedeutung tragen, daher stellt die Fall-sensitive Übereinstimmung sicher, dass Sie nur exakte Übereinstimmungen entfernen. Die Verarbeitung allgemeiner Texte, bei denen der Fall variiert, kann eine Fall-unsensitive Übereinstimmung erfordern, um alle Instanzen zu erfassen.
OnlyMatchWholeWords kontrolliert, ob die Suche vollständige Wörter oder Teilstrings abgleicht. Bei der Schwärzung von Namen ist in der Regel ein Abgleich ganzer Wörter erforderlich, damit "Smith" nicht versehentlich einen Teil von "Blacksmith" oder "Smithfield" schwärzt. Beim Schwärzen von Mustern wie Kontonummern-Präfixen kann ein partieller Abgleich erforderlich sein, um Abweichungen zu erkennen.
DrawRectangles spezifiziert, ob schwarze Kästen erscheinen, wo Inhalte entfernt wurden. In den meisten rechtlichen und behördlichen Kontexten sind sichtbare Schwärzungsmarkierungen erforderlich, um zu belegen, dass der Inhalt absichtlich entfernt und nicht versehentlich weggelassen wurde. Interne Arbeitsabläufe können das Entfernen von unsichtbaren Elementen für eine saubere Ausgabe vorziehen.
ReplacementText definiert, welche Zeichen anstelle des redaktierten Inhalts erscheinen. Häufig werden Sternchen, "REDACTED"-Bezeichnungen oder leere Zeichenfolgen verwendet. Der Ersatztext erscheint in der Dokumentstruktur, wenn jemand versucht, den geschwärzten Bereich auszuwählen oder zu kopieren.
Wie kann ich reguläre Ausdrücke verwenden, um empfindliche Muster zu finden und zu bearbeiten?
Die Schwärzung bekannter Textzeichenfolgen funktioniert, wenn Sie bestimmte Werte zu entfernen haben, aber viele vertrauliche Datentypen folgen eher vorhersehbaren Mustern als festen Werten. Sozialversicherungsnummern, Kreditkartennummern, E-Mail-Adressen, Telefonnummern und Daten haben alle erkennbare Formate, die mit regulären Ausdrücken abgeglichen werden können. Der Aufbau eines auf Mustern basierenden Redaktionssystems ermöglicht es Ihnen, private Informationen aus PDF-Inhalten zu entfernen, ohne jeden spezifischen Wert im Voraus zu kennen.
IronPDFs Textextraktionsfunktionen in Kombination mit Redigiermethoden ermöglichen leistungsstarke Workflows für den Musterabgleich. Sie extrahieren den Text, identifizieren Übereinstimmungen mit regulären Ausdrücken in .NET und schwärzen dann jeden gefundenen Wert.
using IronPdf;using System.Text.RegularExpressions;using System.Collections.Generic;public class PatternRedactor{ // Common patterns for sensitive data private static readonly Dictionary<string, string> SensitivePatterns = new Dictionary<string, string> { // US Social Security Number: 123-45-6789 { "SSN", @"\b\d{3}-\d{2}-\d{4}\b" }, // Credit Card Numbers: various formats with 13-19 digits { "CreditCard", @"\b(?:\d{4}[-\s]?){3}\d{1,4}\b" }, // Email Addresses { "Email", @"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b" }, // US Phone Numbers: (123) 456-7890 or 123-456-7890 { "Phone", @"\b(?:\(\d{3}\)\s?|\d{3}[-.])\d{3}[-.]?\d{4}\b" }, // Dates: MM/DD/YYYY or MM-DD-YYYY { "Date", @"\b\d{1,2}[/-]\d{1,2}[/-]\d{2,4}\b" }, // IP Addresses { "IPAddress", @"\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b" } }; public voidRedactPatterns(string inputPath, string outputPath, params string[] patternNames) { // Load the PDF PdfDocument pdf = PdfDocument.FromFile(inputPath); // Extract all text from the document string fullText = pdf.ExtractAllText(); // Track unique matches to avoid duplicate redaction attempts HashSet<string> matchesToRedact = new HashSet<string>(); // Find all matches for requested patterns foreach (string patternName in patternNames) { if (SensitivePatterns.TryGetValue(patternName, out string pattern)) { Regex regex = new Regex(pattern, RegexOptions.IgnoreCase); MatchCollection matches = regex.Matches(fullText); foreach (Match match in matches) { matchesToRedact.Add(match.Value); } } } // Redact each unique match foreach (string sensitiveValue in matchesToRedact) { pdf.RedactTextOnAllPages(sensitiveValue); } // Save the redacted document pdf.SaveAs(outputPath); }}// Usage exampleclass Program{ static voidMain() { PatternRedactor redactor = new PatternRedactor(); // Redact SSNs and credit cards from a financial document redactor.RedactPatterns( "customer-data.pdf", "customer-data-safe.pdf", "SSN", "CreditCard", "Email" ); }}
using IronPdf;
using System.Text.RegularExpressions;
using System.Collections.Generic;
public class PatternRedactor
{
// Common patterns for sensitive data
private static readonly Dictionary<string, string> SensitivePatterns = new Dictionary<string, string>
{
// US Social Security Number: 123-45-6789
{ "SSN", @"\b\d{3}-\d{2}-\d{4}\b" },
// Credit Card Numbers: various formats with 13-19 digits
{ "CreditCard", @"\b(?:\d{4}[-\s]?){3}\d{1,4}\b" },
// Email Addresses
{ "Email", @"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b" },
// US Phone Numbers: (123) 456-7890 or 123-456-7890
{ "Phone", @"\b(?:\(\d{3}\)\s?|\d{3}[-.])\d{3}[-.]?\d{4}\b" },
// Dates: MM/DD/YYYY or MM-DD-YYYY
{ "Date", @"\b\d{1,2}[/-]\d{1,2}[/-]\d{2,4}\b" },
// IP Addresses
{ "IPAddress", @"\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b" }
};
public void RedactPatterns(string inputPath, string outputPath, params string[] patternNames)
{
// Load the PDF
PdfDocument pdf = PdfDocument.FromFile(inputPath);
// Extract all text from the document
string fullText = pdf.ExtractAllText();
// Track unique matches to avoid duplicate redaction attempts
HashSet<string> matchesToRedact = new HashSet<string>();
// Find all matches for requested patterns
foreach (string patternName in patternNames)
{
if (SensitivePatterns.TryGetValue(patternName, out string pattern))
{
Regex regex = new Regex(pattern, RegexOptions.IgnoreCase);
MatchCollection matches = regex.Matches(fullText);
foreach (Match match in matches)
{
matchesToRedact.Add(match.Value);
}
}
}
// Redact each unique match
foreach (string sensitiveValue in matchesToRedact)
{
pdf.RedactTextOnAllPages(sensitiveValue);
}
// Save the redacted document
pdf.SaveAs(outputPath);
}
}
// Usage example
class Program
{
static void Main()
{
PatternRedactor redactor = new PatternRedactor();
// Redact SSNs and credit cards from a financial document
redactor.RedactPatterns(
"customer-data.pdf",
"customer-data-safe.pdf",
"SSN", "CreditCard", "Email"
);
}
}
ImportsIronPdfImportsSystem.Text.RegularExpressionsImportsSystem.Collections.GenericPublic Class PatternRedactor ' Common patterns for sensitive data PrivateSharedReadOnlySensitivePatternsAs New Dictionary(OfString, String) From { ' US Social Security Number: 123-45-6789 {"SSN", "\b\d{3}-\d{2}-\d{4}\b"}, ' Credit Card Numbers: various formats with 13-19 digits {"CreditCard", "\b(?:\d{4}[-\s]?){3}\d{1,4}\b"}, ' Email Addresses {"Email", "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b"}, ' US Phone Numbers: (123) 456-7890 or 123-456-7890 {"Phone", "\b(?:\(\d{3}\)\s?|\d{3}[-.])\d{3}[-.]?\d{4}\b"}, ' Dates: MM/DD/YYYY or MM-DD-YYYY {"Date", "\b\d{1,2}[/-]\d{1,2}[/-]\d{2,4}\b"}, ' IP Addresses {"IPAddress", "\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b"} } Public Sub RedactPatterns(inputPath AsString, outputPath AsString, ParamArray patternNames AsString()) ' Load the PDF Dim pdf AsPdfDocument = PdfDocument.FromFile(inputPath) ' Extract all text from the document Dim fullText AsString = pdf.ExtractAllText() ' Track unique matches to avoid duplicate redaction attempts Dim matchesToRedact As New HashSet(OfString)() ' Find all matches for requested patterns For Each patternName AsStringIn patternNames Dim pattern AsString = Nothing IfSensitivePatterns.TryGetValue(patternName, pattern) Then Dim regex As New Regex(pattern, RegexOptions.IgnoreCase) Dim matches AsMatchCollection = regex.Matches(fullText) For Each match AsMatchIn matches matchesToRedact.Add(match.Value) Next End If Next ' Redact each unique match For Each sensitiveValue AsStringIn matchesToRedact pdf.RedactTextOnAllPages(sensitiveValue) Next ' Save the redacted document pdf.SaveAs(outputPath) End SubEnd Class' Usage exampleClass ProgramShared Sub Main() Dim redactor As New PatternRedactor() ' Redact SSNs and credit cards from a financial document redactor.RedactPatterns( "customer-data.pdf", "customer-data-safe.pdf", "SSN", "CreditCard", "Email" ) End SubEnd Class
Imports IronPdf
Imports System.Text.RegularExpressions
Imports System.Collections.Generic
Public Class PatternRedactor
' Common patterns for sensitive data
Private Shared ReadOnly SensitivePatterns As New Dictionary(Of String, String) From {
' US Social Security Number: 123-45-6789
{"SSN", "\b\d{3}-\d{2}-\d{4}\b"},
' Credit Card Numbers: various formats with 13-19 digits
{"CreditCard", "\b(?:\d{4}[-\s]?){3}\d{1,4}\b"},
' Email Addresses
{"Email", "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b"},
' US Phone Numbers: (123) 456-7890 or 123-456-7890
{"Phone", "\b(?:\(\d{3}\)\s?|\d{3}[-.])\d{3}[-.]?\d{4}\b"},
' Dates: MM/DD/YYYY or MM-DD-YYYY
{"Date", "\b\d{1,2}[/-]\d{1,2}[/-]\d{2,4}\b"},
' IP Addresses
{"IPAddress", "\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b"}
}
Public Sub RedactPatterns(inputPath As String, outputPath As String, ParamArray patternNames As String())
' Load the PDF
Dim pdf As PdfDocument = PdfDocument.FromFile(inputPath)
' Extract all text from the document
Dim fullText As String = pdf.ExtractAllText()
' Track unique matches to avoid duplicate redaction attempts
Dim matchesToRedact As New HashSet(Of String)()
' Find all matches for requested patterns
For Each patternName As String In patternNames
Dim pattern As String = Nothing
If SensitivePatterns.TryGetValue(patternName, pattern) Then
Dim regex As New Regex(pattern, RegexOptions.IgnoreCase)
Dim matches As MatchCollection = regex.Matches(fullText)
For Each match As Match In matches
matchesToRedact.Add(match.Value)
Next
End If
Next
' Redact each unique match
For Each sensitiveValue As String In matchesToRedact
pdf.RedactTextOnAllPages(sensitiveValue)
Next
' Save the redacted document
pdf.SaveAs(outputPath)
End Sub
End Class
' Usage example
Class Program
Shared Sub Main()
Dim redactor As New PatternRedactor()
' Redact SSNs and credit cards from a financial document
redactor.RedactPatterns(
"customer-data.pdf",
"customer-data-safe.pdf",
"SSN", "CreditCard", "Email"
)
End Sub
End Class
Dieser auf Mustern basierende Ansatz skaliert gut, da Sie die Muster einmal definieren und auf jedes Dokument anwenden können. Das Hinzufügen neuer Datentypen erfordert lediglich das Hinzufügen neuer Regex-Muster zum Wörterbuch.
Wie baue ich einen wiederverwendbaren Scanner für vertrauliche Daten?
In Produktionsumgebungen müssen Sie häufig Dokumente scannen und feststellen, welche vertraulichen Informationen vorhanden sind, bevor Sie entscheiden können, ob sie geschwärzt werden sollen. Dies hilft bei der Prüfung der Einhaltung von Vorschriften und ermöglicht eine menschliche Überprüfung von Schwärzungsentscheidungen. Die folgende Klasse bietet neben der Redigierung auch die Möglichkeit des Scannens.
using IronPdf;using System.Collections.Generic;using System.Text.RegularExpressions;using System.Linq;public class SensitiveDataMatch{ public stringPatternType { get; set; } public stringValue { get; set; } public intPageNumber { get; set; }}public class ScanResult{ public stringFilePath { get; set; } public List<SensitiveDataMatch> Matches { get; set; } = new List<SensitiveDataMatch>(); public boolContainsSensitiveData => Matches.Count > 0; public Dictionary<string, int> GetSummary() { returnMatches.GroupBy(m => m.PatternType) .ToDictionary(g => g.Key, g => g.Count()); }}public class DocumentScanner{ private readonly Dictionary<string, string> _patterns; publicDocumentScanner() { _patterns = new Dictionary<string, string> { { "Social Security Number", @"\b\d{3}-\d{2}-\d{4}\b" }, { "Credit Card", @"\b(?:\d{4}[-\s]?){3}\d{1,4}\b" }, { "Email Address", @"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b" }, { "Phone Number", @"\b(?:\(\d{3}\)\s?|\d{3}[-.])\d{3}[-.]?\d{4}\b" }, { "Date of Birth Pattern", @"\b(?:DOB|Date of Birth|Birth Date)[:\s]+\d{1,2}[/-]\d{1,2}[/-]\d{2,4}\b" } }; } public ScanResultScanDocument(string filePath) { ScanResult result = new ScanResult { FilePath = filePath }; PdfDocument pdf = PdfDocument.FromFile(filePath); // Scan each page individually to track location for (int pageIndex = 0; pageIndex < pdf.PageCount; pageIndex++) { string pageText = pdf.ExtractTextFromPage(pageIndex); foreach (var pattern in _patterns) { Regex regex = new Regex(pattern.Value, RegexOptions.IgnoreCase); MatchCollection matches = regex.Matches(pageText); foreach (Match match in matches) { result.Matches.Add(new SensitiveDataMatch {PatternType = pattern.Key,Value = MaskValue(match.Value, pattern.Key),PageNumber = pageIndex + 1 }); } } } return result; } // Partially mask values for safe storage private stringMaskValue(string value, string patternType) { if (patternType == "Social Security Number" && value.Length >= 4) { return "XXX-XX-" + value.Substring(value.Length - 4); } if (patternType == "Credit Card" && value.Length >= 4) { return "****-****-****-" + value.Substring(value.Length - 4); } if (patternType == "Email Address") { int atIndex = value.IndexOf('@'); if (atIndex > 2) { return value.Substring(0, 2) + "***" + value.Substring(atIndex); } } return value.Length > 4 ? value.Substring(0, 2) + "***" : "****"; } public voidScanAndRedact(string inputPath, string outputPath) { // First scan to identify sensitive data ScanResult scanResult = ScanDocument(inputPath); if (!scanResult.ContainsSensitiveData) { return; } // Load document for redaction PdfDocument pdf = PdfDocument.FromFile(inputPath); // Extract unique actual values (not masked) for redaction string fullText = pdf.ExtractAllText(); HashSet<string> valuesToRedact = new HashSet<string>(); foreach (var pattern in _patterns) { Regex regex = new Regex(pattern.Value, RegexOptions.IgnoreCase); foreach (Match match in regex.Matches(fullText)) { valuesToRedact.Add(match.Value); } } // Apply redactions foreach (string value in valuesToRedact) { pdf.RedactTextOnAllPages(value); } pdf.SaveAs(outputPath); }}// Usageclass Program{ static voidMain() { DocumentScanner scanner = new DocumentScanner(); // Scan only (for audit purposes) ScanResult result = scanner.ScanDocument("application-form.pdf"); var summary = result.GetSummary(); // Scan and redact in one operation scanner.ScanAndRedact("application-form.pdf", "application-form-redacted.pdf"); }}
using IronPdf;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.Linq;
public class SensitiveDataMatch
{
public string PatternType { get; set; }
public string Value { get; set; }
public int PageNumber { get; set; }
}
public class ScanResult
{
public string FilePath { get; set; }
public List<SensitiveDataMatch> Matches { get; set; } = new List<SensitiveDataMatch>();
public bool ContainsSensitiveData => Matches.Count > 0;
public Dictionary<string, int> GetSummary()
{
return Matches.GroupBy(m => m.PatternType)
.ToDictionary(g => g.Key, g => g.Count());
}
}
public class DocumentScanner
{
private readonly Dictionary<string, string> _patterns;
public DocumentScanner()
{
_patterns = new Dictionary<string, string>
{
{ "Social Security Number", @"\b\d{3}-\d{2}-\d{4}\b" },
{ "Credit Card", @"\b(?:\d{4}[-\s]?){3}\d{1,4}\b" },
{ "Email Address", @"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b" },
{ "Phone Number", @"\b(?:\(\d{3}\)\s?|\d{3}[-.])\d{3}[-.]?\d{4}\b" },
{ "Date of Birth Pattern", @"\b(?:DOB|Date of Birth|Birth Date)[:\s]+\d{1,2}[/-]\d{1,2}[/-]\d{2,4}\b" }
};
}
public ScanResult ScanDocument(string filePath)
{
ScanResult result = new ScanResult { FilePath = filePath };
PdfDocument pdf = PdfDocument.FromFile(filePath);
// Scan each page individually to track location
for (int pageIndex = 0; pageIndex < pdf.PageCount; pageIndex++)
{
string pageText = pdf.ExtractTextFromPage(pageIndex);
foreach (var pattern in _patterns)
{
Regex regex = new Regex(pattern.Value, RegexOptions.IgnoreCase);
MatchCollection matches = regex.Matches(pageText);
foreach (Match match in matches)
{
result.Matches.Add(new SensitiveDataMatch
{
PatternType = pattern.Key,
Value = MaskValue(match.Value, pattern.Key),
PageNumber = pageIndex + 1
});
}
}
}
return result;
}
// Partially mask values for safe storage
private string MaskValue(string value, string patternType)
{
if (patternType == "Social Security Number" && value.Length >= 4)
{
return "XXX-XX-" + value.Substring(value.Length - 4);
}
if (patternType == "Credit Card" && value.Length >= 4)
{
return "****-****-****-" + value.Substring(value.Length - 4);
}
if (patternType == "Email Address")
{
int atIndex = value.IndexOf('@');
if (atIndex > 2)
{
return value.Substring(0, 2) + "***" + value.Substring(atIndex);
}
}
return value.Length > 4 ? value.Substring(0, 2) + "***" : "****";
}
public void ScanAndRedact(string inputPath, string outputPath)
{
// First scan to identify sensitive data
ScanResult scanResult = ScanDocument(inputPath);
if (!scanResult.ContainsSensitiveData)
{
return;
}
// Load document for redaction
PdfDocument pdf = PdfDocument.FromFile(inputPath);
// Extract unique actual values (not masked) for redaction
string fullText = pdf.ExtractAllText();
HashSet<string> valuesToRedact = new HashSet<string>();
foreach (var pattern in _patterns)
{
Regex regex = new Regex(pattern.Value, RegexOptions.IgnoreCase);
foreach (Match match in regex.Matches(fullText))
{
valuesToRedact.Add(match.Value);
}
}
// Apply redactions
foreach (string value in valuesToRedact)
{
pdf.RedactTextOnAllPages(value);
}
pdf.SaveAs(outputPath);
}
}
// Usage
class Program
{
static void Main()
{
DocumentScanner scanner = new DocumentScanner();
// Scan only (for audit purposes)
ScanResult result = scanner.ScanDocument("application-form.pdf");
var summary = result.GetSummary();
// Scan and redact in one operation
scanner.ScanAndRedact("application-form.pdf", "application-form-redacted.pdf");
}
}
ImportsIronPdfImportsSystem.Collections.GenericImportsSystem.Text.RegularExpressionsImportsSystem.LinqPublic Class SensitiveDataMatch Public Property PatternTypeAsString Public Property ValueAsString Public Property PageNumberAsIntegerEnd ClassPublic Class ScanResult Public Property FilePathAsString Public Property MatchesAsList(OfSensitiveDataMatch) = New List(OfSensitiveDataMatch)() PublicReadOnlyPropertyContainsSensitiveDataAsBoolean Get ReturnMatches.Count > 0End Get End Property Public Function GetSummary() AsDictionary(OfString, Integer) ReturnMatches.GroupBy(Function(m) m.PatternType) _ .ToDictionary(Function(g) g.Key, Function(g) g.Count()) End FunctionEnd ClassPublic Class DocumentScanner PrivateReadOnly _patterns AsDictionary(OfString, String) Public Sub New() _patterns = New Dictionary(OfString, String) From { {"Social Security Number", "\b\d{3}-\d{2}-\d{4}\b"}, {"Credit Card", "\b(?:\d{4}[-\s]?){3}\d{1,4}\b"}, {"Email Address", "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b"}, {"Phone Number", "\b(?:\(\d{3}\)\s?|\d{3}[-.])\d{3}[-.]?\d{4}\b"}, {"Date of Birth Pattern", "\b(?:DOB|Date of Birth|Birth Date)[:\s]+\d{1,2}[/-]\d{1,2}[/-]\d{2,4}\b"} } End Sub Public Function ScanDocument(filePath AsString) AsScanResult Dim result As New ScanResultWith {.FilePath = filePath} Dim pdf AsPdfDocument = PdfDocument.FromFile(filePath) ' Scan each page individually to track location For pageIndex AsInteger = 0 To pdf.PageCount - 1 Dim pageText AsString = pdf.ExtractTextFromPage(pageIndex) For Each pattern In _patterns Dim regex As New Regex(pattern.Value, RegexOptions.IgnoreCase) Dim matches AsMatchCollection = regex.Matches(pageText) For Each match AsMatchIn matches result.Matches.Add(New SensitiveDataMatchWith { .PatternType = pattern.Key, .Value = MaskValue(match.Value, pattern.Key), .PageNumber = pageIndex + 1 }) Next Next Next Return result End Function ' Partially mask values for safe storage Private Function MaskValue(value AsString, patternType AsString) AsString If patternType = "Social Security Number"AndAlso value.Length >= 4 Then Return "XXX-XX-" & value.Substring(value.Length - 4) End If If patternType = "Credit Card"AndAlso value.Length >= 4 Then Return "****-****-****-" & value.Substring(value.Length - 4) End If If patternType = "Email Address" Then Dim atIndex AsInteger = value.IndexOf("@"c) If atIndex > 2 Then Return value.Substring(0, 2) & "***" & value.Substring(atIndex) End If End If Return If(value.Length > 4, value.Substring(0, 2) & "***", "****") End Function Public Sub ScanAndRedact(inputPath AsString, outputPath AsString) ' First scan to identify sensitive data Dim scanResult AsScanResult = ScanDocument(inputPath) IfNot scanResult.ContainsSensitiveDataThen Return End If ' Load document for redaction Dim pdf AsPdfDocument = PdfDocument.FromFile(inputPath) ' Extract unique actual values (not masked) for redaction Dim fullText AsString = pdf.ExtractAllText() Dim valuesToRedact As New HashSet(OfString)() For Each pattern In _patterns Dim regex As New Regex(pattern.Value, RegexOptions.IgnoreCase) For Each match AsMatchIn regex.Matches(fullText) valuesToRedact.Add(match.Value) Next Next ' Apply redactions For Each value AsStringIn valuesToRedact pdf.RedactTextOnAllPages(value) Next pdf.SaveAs(outputPath) End SubEnd Class' UsageModuleProgram Sub Main() Dim scanner As New DocumentScanner() ' Scan only (for audit purposes) Dim result AsScanResult = scanner.ScanDocument("application-form.pdf") Dim summary = result.GetSummary() ' Scan and redact in one operation scanner.ScanAndRedact("application-form.pdf", "application-form-redacted.pdf") End SubEndModule
Imports IronPdf
Imports System.Collections.Generic
Imports System.Text.RegularExpressions
Imports System.Linq
Public Class SensitiveDataMatch
Public Property PatternType As String
Public Property Value As String
Public Property PageNumber As Integer
End Class
Public Class ScanResult
Public Property FilePath As String
Public Property Matches As List(Of SensitiveDataMatch) = New List(Of SensitiveDataMatch)()
Public ReadOnly Property ContainsSensitiveData As Boolean
Get
Return Matches.Count > 0
End Get
End Property
Public Function GetSummary() As Dictionary(Of String, Integer)
Return Matches.GroupBy(Function(m) m.PatternType) _
.ToDictionary(Function(g) g.Key, Function(g) g.Count())
End Function
End Class
Public Class DocumentScanner
Private ReadOnly _patterns As Dictionary(Of String, String)
Public Sub New()
_patterns = New Dictionary(Of String, String) From {
{"Social Security Number", "\b\d{3}-\d{2}-\d{4}\b"},
{"Credit Card", "\b(?:\d{4}[-\s]?){3}\d{1,4}\b"},
{"Email Address", "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b"},
{"Phone Number", "\b(?:\(\d{3}\)\s?|\d{3}[-.])\d{3}[-.]?\d{4}\b"},
{"Date of Birth Pattern", "\b(?:DOB|Date of Birth|Birth Date)[:\s]+\d{1,2}[/-]\d{1,2}[/-]\d{2,4}\b"}
}
End Sub
Public Function ScanDocument(filePath As String) As ScanResult
Dim result As New ScanResult With {.FilePath = filePath}
Dim pdf As PdfDocument = PdfDocument.FromFile(filePath)
' Scan each page individually to track location
For pageIndex As Integer = 0 To pdf.PageCount - 1
Dim pageText As String = pdf.ExtractTextFromPage(pageIndex)
For Each pattern In _patterns
Dim regex As New Regex(pattern.Value, RegexOptions.IgnoreCase)
Dim matches As MatchCollection = regex.Matches(pageText)
For Each match As Match In matches
result.Matches.Add(New SensitiveDataMatch With {
.PatternType = pattern.Key,
.Value = MaskValue(match.Value, pattern.Key),
.PageNumber = pageIndex + 1
})
Next
Next
Next
Return result
End Function
' Partially mask values for safe storage
Private Function MaskValue(value As String, patternType As String) As String
If patternType = "Social Security Number" AndAlso value.Length >= 4 Then
Return "XXX-XX-" & value.Substring(value.Length - 4)
End If
If patternType = "Credit Card" AndAlso value.Length >= 4 Then
Return "****-****-****-" & value.Substring(value.Length - 4)
End If
If patternType = "Email Address" Then
Dim atIndex As Integer = value.IndexOf("@"c)
If atIndex > 2 Then
Return value.Substring(0, 2) & "***" & value.Substring(atIndex)
End If
End If
Return If(value.Length > 4, value.Substring(0, 2) & "***", "****")
End Function
Public Sub ScanAndRedact(inputPath As String, outputPath As String)
' First scan to identify sensitive data
Dim scanResult As ScanResult = ScanDocument(inputPath)
If Not scanResult.ContainsSensitiveData Then
Return
End If
' Load document for redaction
Dim pdf As PdfDocument = PdfDocument.FromFile(inputPath)
' Extract unique actual values (not masked) for redaction
Dim fullText As String = pdf.ExtractAllText()
Dim valuesToRedact As New HashSet(Of String)()
For Each pattern In _patterns
Dim regex As New Regex(pattern.Value, RegexOptions.IgnoreCase)
For Each match As Match In regex.Matches(fullText)
valuesToRedact.Add(match.Value)
Next
Next
' Apply redactions
For Each value As String In valuesToRedact
pdf.RedactTextOnAllPages(value)
Next
pdf.SaveAs(outputPath)
End Sub
End Class
' Usage
Module Program
Sub Main()
Dim scanner As New DocumentScanner()
' Scan only (for audit purposes)
Dim result As ScanResult = scanner.ScanDocument("application-form.pdf")
Dim summary = result.GetSummary()
' Scan and redact in one operation
scanner.ScanAndRedact("application-form.pdf", "application-form-redacted.pdf")
End Sub
End Module
Der Scanner bietet Einblick in die vertraulichen Informationen, bevor Änderungen vorgenommen werden. Dies unterstützt Compliance-Workflows, bei denen Sie dokumentieren müssen, was gefunden und entfernt wurde. Die Maskierungsfunktion stellt sicher, dass Protokolldateien und Berichte nicht selbst zu Quellen der Datenexposition werden.
Wie kann ich bestimmte Regionen oder Bereiche in einer PDF-Datei schwärzen?
Textredaktion behandelt zeichnungsbasierte Inhalte effektiv, aber PDFs enthalten oft sensible Informationen in Formen, die das Textmatching nicht abdecken kann. Unterschriften, Fotos, handschriftliche Anmerkungen, Stempel und grafische Elemente erfordern einen anderen Ansatz. Region-basierte Redaktion ermöglicht es Ihnen, rechteckige Bereiche nach ihren Koordinaten anzugeben und alles innerhalb dieser Grenzen dauerhaft unkenntlich zu machen.
IronPDF verwendet die RectangleF Struktur, um Redaktionsbereiche zu definieren. Sie geben die X- und Y-Koordinaten der oberen linken Ecke an, dann die Breite und Höhe des Bereichs. Die Koordinaten werden in Punkten von unten links auf der Seite gemessen, was dem Koordinatensystem der PDF-Spezifikation entspricht.
Eingabe
Ein unterschriebenes Vertragsdokument, das handschriftliche Unterschriften und einen Lichtbildausweis enthält, die mithilfe von koordinatenbasiertem Region-Targeting unkenntlich gemacht werden müssen.
using IronPdf;using IronSoftware.Drawing;// Load a document with signature blocks and photosPdfDocument pdf = PdfDocument.FromFile("signed-agreement.pdf");// Define a region for a signature block// Located 100 points from left, 650 points from bottom// Width of 200 points, height of 50 pointsRectangleF signatureRegion = new RectangleF(100, 650, 200, 50);// Redact the signature region on all pagespdf.RedactRegionsOnAllPages(signatureRegion);// Define a region for a photo ID in the upper rightRectangleF photoRegion = new RectangleF(450, 700, 100, 120);pdf.RedactRegionsOnAllPages(photoRegion);// Save the document with regions redactedpdf.SaveAs("signed-agreement-redacted.pdf");
using IronPdf;
using IronSoftware.Drawing;
// Load a document with signature blocks and photos
PdfDocument pdf = PdfDocument.FromFile("signed-agreement.pdf");
// Define a region for a signature block
// Located 100 points from left, 650 points from bottom
// Width of 200 points, height of 50 points
RectangleF signatureRegion = new RectangleF(100, 650, 200, 50);
// Redact the signature region on all pages
pdf.RedactRegionsOnAllPages(signatureRegion);
// Define a region for a photo ID in the upper right
RectangleF photoRegion = new RectangleF(450, 700, 100, 120);
pdf.RedactRegionsOnAllPages(photoRegion);
// Save the document with regions redacted
pdf.SaveAs("signed-agreement-redacted.pdf");
ImportsIronPdfImportsIronSoftware.Drawing' Load a document with signature blocks and photosDim pdf AsPdfDocument = PdfDocument.FromFile("signed-agreement.pdf")' Define a region for a signature block' Located 100 points from left, 650 points from bottom' Width of 200 points, height of 50 pointsDim signatureRegion As New RectangleF(100, 650, 200, 50)' Redact the signature region on all pagespdf.RedactRegionsOnAllPages(signatureRegion)' Define a region for a photo ID in the upper rightDim photoRegion As New RectangleF(450, 700, 100, 120)pdf.RedactRegionsOnAllPages(photoRegion)' Save the document with regions redactedpdf.SaveAs("signed-agreement-redacted.pdf")
Imports IronPdf
Imports IronSoftware.Drawing
' Load a document with signature blocks and photos
Dim pdf As PdfDocument = PdfDocument.FromFile("signed-agreement.pdf")
' Define a region for a signature block
' Located 100 points from left, 650 points from bottom
' Width of 200 points, height of 50 points
Dim signatureRegion As New RectangleF(100, 650, 200, 50)
' Redact the signature region on all pages
pdf.RedactRegionsOnAllPages(signatureRegion)
' Define a region for a photo ID in the upper right
Dim photoRegion As New RectangleF(450, 700, 100, 120)
pdf.RedactRegionsOnAllPages(photoRegion)
' Save the document with regions redacted
pdf.SaveAs("signed-agreement-redacted.pdf")
Dieser Code verwendet RectangleF Strukturen, um rechteckige Bereiche für die Redaktion zu definieren. Die Signaturregion befindet sich bei den Koordinaten (100, 650) mit einer Fläche von 200x50 Pixeln, während die Fotoregion bei (450, 700) mit einer Fläche von 100x120 Pixeln liegt. Die RedactRegionsOnAllPages Methode wendet schwarze Rechtecke über diese Bereiche auf allen Seiten an.
Musterausgabe
Die Bestimmung der richtigen Koordinaten erfordert oft einige Experimente oder Messungen. PDF-Seiten verwenden in der Regel ein Koordinatensystem, bei dem ein Punkt 1/72 eines Zolls entspricht. Eine Standardseite in US Letter ist 612 Punkte breit und 792 Punkte hoch. Der Umfang der A4-Seiten beträgt etwa 595 x 842 Punkte. PDF-Anzeigetools, die Koordinaten anzeigen, wenn Sie den Cursor bewegen, können helfen, oder Sie können die Seitenabmessungen programmatisch extrahieren:
using IronPdf;using IronSoftware.Drawing;PdfDocument pdf = PdfDocument.FromFile("form-document.pdf");// Get dimensions of the first pagevar pageInfo = pdf.Pages[0];// Calculate regions relative to page dimensions// Redact the bottom quarter of the page where signatures appearfloat signatureAreaHeight = (float)(pageInfo.Height / 4);RectangleF bottomQuarter = new RectangleF( 0, // Start at left edge 0, // Start at bottom (float)pageInfo.Width, // Full page width signatureAreaHeight // Quarter of page height);pdf.RedactRegionsOnAllPages(bottomQuarter);// Redact a header area at the top containing letterhead with addressfloat headerHeight = 100;RectangleF headerArea = new RectangleF( 0, (float)(pageInfo.Height - headerHeight), // Position from bottom (float)pageInfo.Width, headerHeight);pdf.RedactRegionsOnAllPages(headerArea);pdf.SaveAs("form-document-redacted.pdf");
using IronPdf;
using IronSoftware.Drawing;
PdfDocument pdf = PdfDocument.FromFile("form-document.pdf");
// Get dimensions of the first page
var pageInfo = pdf.Pages[0];
// Calculate regions relative to page dimensions
// Redact the bottom quarter of the page where signatures appear
float signatureAreaHeight = (float)(pageInfo.Height / 4);
RectangleF bottomQuarter = new RectangleF(
0, // Start at left edge
0, // Start at bottom
(float)pageInfo.Width, // Full page width
signatureAreaHeight // Quarter of page height
);
pdf.RedactRegionsOnAllPages(bottomQuarter);
// Redact a header area at the top containing letterhead with address
float headerHeight = 100;
RectangleF headerArea = new RectangleF(
0,
(float)(pageInfo.Height - headerHeight), // Position from bottom
(float)pageInfo.Width,
headerHeight
);
pdf.RedactRegionsOnAllPages(headerArea);
pdf.SaveAs("form-document-redacted.pdf");
ImportsIronPdfImportsIronSoftware.DrawingDim pdf AsPdfDocument = PdfDocument.FromFile("form-document.pdf")' Get dimensions of the first pageDim pageInfo = pdf.Pages(0)' Calculate regions relative to page dimensions' Redact the bottom quarter of the page where signatures appearDim signatureAreaHeight AsSingle = CSng(pageInfo.Height / 4)Dim bottomQuarter As New RectangleF(0, 0, CSng(pageInfo.Width), signatureAreaHeight)pdf.RedactRegionsOnAllPages(bottomQuarter)' Redact a header area at the top containing letterhead with addressDim headerHeight AsSingle = 100Dim headerArea As New RectangleF(0, CSng(pageInfo.Height - headerHeight), CSng(pageInfo.Width), headerHeight)pdf.RedactRegionsOnAllPages(headerArea)pdf.SaveAs("form-document-redacted.pdf")
Imports IronPdf
Imports IronSoftware.Drawing
Dim pdf As PdfDocument = PdfDocument.FromFile("form-document.pdf")
' Get dimensions of the first page
Dim pageInfo = pdf.Pages(0)
' Calculate regions relative to page dimensions
' Redact the bottom quarter of the page where signatures appear
Dim signatureAreaHeight As Single = CSng(pageInfo.Height / 4)
Dim bottomQuarter As New RectangleF(0, 0, CSng(pageInfo.Width), signatureAreaHeight)
pdf.RedactRegionsOnAllPages(bottomQuarter)
' Redact a header area at the top containing letterhead with address
Dim headerHeight As Single = 100
Dim headerArea As New RectangleF(0, CSng(pageInfo.Height - headerHeight), CSng(pageInfo.Width), headerHeight)
pdf.RedactRegionsOnAllPages(headerArea)
pdf.SaveAs("form-document-redacted.pdf")
Meine Lieblingsbibliothek dieser Art ist IronPDF. Es ermöglicht eine schnelle und effiziente Bearbeitung von PDF-Dateien. Es verfügt auch über viele wertvolle Funktionen, wie das Exportieren in das PDF/A-Format und das digitale Signieren von PDF-Dokumenten.
IronOCR bedeutet, dass wir jährlich 40.000 $ durch manuelle Verarbeitung einsparen können, während die Produktivität gesteigert wird und Ressourcen für wichtige Aufgaben freigesetzt werden. Ich würde es sehr empfehlen.
Wie kann ich mehrere Regionen über verschiedene Seiten hinweg redigieren?
Bei komplexen Dokumenten müssen oft verschiedene Bereiche auf verschiedenen Seiten geschwärzt werden. Ein mehrseitiges Formular könnte Signaturen an unterschiedlichen Positionen enthalten, oder unterschiedliche Seiten könnten Fotos, Stempel oder andere grafische Elemente an einzigartigen Orten enthalten. IronPDF umfasst seitenbezogene Methoden für die gezielte Regionen-Redaktion.
using IronPdf;using IronSoftware.Drawing;PdfDocument pdf = PdfDocument.FromFile("multi-page-application.pdf");// Define page-specific redaction regions// Page 1: Cover page with applicant photoRectangleF page1Photo = new RectangleF(450, 600, 120, 150);pdf.RedactRegionOnPage(0, page1Photo);// Page 2: Personal information sectionRectangleF page2InfoBlock = new RectangleF(50, 400, 250, 200);pdf.RedactRegionOnPage(1, page2InfoBlock);// Pages 3-5: Signature lines at the same positionRectangleF signatureLine = new RectangleF(100, 100, 200, 40);int[] signaturePages = { 2, 3, 4 };pdf.RedactRegionOnPages(signaturePages, signatureLine);// Page 6: Multiple regions - notary stamp and witness signatureRectangleF notaryStamp = new RectangleF(400, 150, 150, 150);RectangleF witnessSignature = new RectangleF(100, 150, 200, 40);pdf.RedactRegionOnPage(5, notaryStamp);pdf.RedactRegionOnPage(5, witnessSignature);pdf.SaveAs("multi-page-application-redacted.pdf");
using IronPdf;
using IronSoftware.Drawing;
PdfDocument pdf = PdfDocument.FromFile("multi-page-application.pdf");
// Define page-specific redaction regions
// Page 1: Cover page with applicant photo
RectangleF page1Photo = new RectangleF(450, 600, 120, 150);
pdf.RedactRegionOnPage(0, page1Photo);
// Page 2: Personal information section
RectangleF page2InfoBlock = new RectangleF(50, 400, 250, 200);
pdf.RedactRegionOnPage(1, page2InfoBlock);
// Pages 3-5: Signature lines at the same position
RectangleF signatureLine = new RectangleF(100, 100, 200, 40);
int[] signaturePages = { 2, 3, 4 };
pdf.RedactRegionOnPages(signaturePages, signatureLine);
// Page 6: Multiple regions - notary stamp and witness signature
RectangleF notaryStamp = new RectangleF(400, 150, 150, 150);
RectangleF witnessSignature = new RectangleF(100, 150, 200, 40);
pdf.RedactRegionOnPage(5, notaryStamp);
pdf.RedactRegionOnPage(5, witnessSignature);
pdf.SaveAs("multi-page-application-redacted.pdf");
ImportsIronPdfImportsIronSoftware.DrawingDim pdf AsPdfDocument = PdfDocument.FromFile("multi-page-application.pdf")' Define page-specific redaction regions' Page 1: Cover page with applicant photoDim page1Photo As New RectangleF(450, 600, 120, 150)pdf.RedactRegionOnPage(0, page1Photo)' Page 2: Personal information sectionDim page2InfoBlock As New RectangleF(50, 400, 250, 200)pdf.RedactRegionOnPage(1, page2InfoBlock)' Pages 3-5: Signature lines at the same positionDim signatureLine As New RectangleF(100, 100, 200, 40)Dim signaturePages AsInteger() = {2, 3, 4}pdf.RedactRegionOnPages(signaturePages, signatureLine)' Page 6: Multiple regions - notary stamp and witness signatureDim notaryStamp As New RectangleF(400, 150, 150, 150)Dim witnessSignature As New RectangleF(100, 150, 200, 40)pdf.RedactRegionOnPage(5, notaryStamp)pdf.RedactRegionOnPage(5, witnessSignature)pdf.SaveAs("multi-page-application-redacted.pdf")
Imports IronPdf
Imports IronSoftware.Drawing
Dim pdf As PdfDocument = PdfDocument.FromFile("multi-page-application.pdf")
' Define page-specific redaction regions
' Page 1: Cover page with applicant photo
Dim page1Photo As New RectangleF(450, 600, 120, 150)
pdf.RedactRegionOnPage(0, page1Photo)
' Page 2: Personal information section
Dim page2InfoBlock As New RectangleF(50, 400, 250, 200)
pdf.RedactRegionOnPage(1, page2InfoBlock)
' Pages 3-5: Signature lines at the same position
Dim signatureLine As New RectangleF(100, 100, 200, 40)
Dim signaturePages As Integer() = {2, 3, 4}
pdf.RedactRegionOnPages(signaturePages, signatureLine)
' Page 6: Multiple regions - notary stamp and witness signature
Dim notaryStamp As New RectangleF(400, 150, 150, 150)
Dim witnessSignature As New RectangleF(100, 150, 200, 40)
pdf.RedactRegionOnPage(5, notaryStamp)
pdf.RedactRegionOnPage(5, witnessSignature)
pdf.SaveAs("multi-page-application-redacted.pdf")
Dokumente mit einheitlichem Layout profitieren von wiederverwendbaren Bereichsdefinitionen:
using IronPdf;using IronSoftware.Drawing;public class FormRegions{ // Standard form regions based on common templates public static RectangleFHeaderLogo => new RectangleF(20, 720, 150, 60); public static RectangleFSignatureBlock => new RectangleF(72, 72, 200, 50); public static RectangleFDateField => new RectangleF(400, 72, 120, 20); public static RectangleFPhotoId => new RectangleF(480, 650, 100, 130); public static RectangleFAddressBlock => new RectangleF(72, 600, 250, 80);}class Program{ static voidMain() { PdfDocument pdf = PdfDocument.FromFile("standard-form.pdf"); // Apply standard redactions using predefined regions pdf.RedactRegionsOnAllPages(FormRegions.SignatureBlock); pdf.RedactRegionsOnAllPages(FormRegions.DateField); pdf.RedactRegionOnPage(0, FormRegions.PhotoId); pdf.SaveAs("standard-form-redacted.pdf"); }}
using IronPdf;
using IronSoftware.Drawing;
public class FormRegions
{
// Standard form regions based on common templates
public static RectangleF HeaderLogo => new RectangleF(20, 720, 150, 60);
public static RectangleF SignatureBlock => new RectangleF(72, 72, 200, 50);
public static RectangleF DateField => new RectangleF(400, 72, 120, 20);
public static RectangleF PhotoId => new RectangleF(480, 650, 100, 130);
public static RectangleF AddressBlock => new RectangleF(72, 600, 250, 80);
}
class Program
{
static void Main()
{
PdfDocument pdf = PdfDocument.FromFile("standard-form.pdf");
// Apply standard redactions using predefined regions
pdf.RedactRegionsOnAllPages(FormRegions.SignatureBlock);
pdf.RedactRegionsOnAllPages(FormRegions.DateField);
pdf.RedactRegionOnPage(0, FormRegions.PhotoId);
pdf.SaveAs("standard-form-redacted.pdf");
}
}
C#
Wie entferne ich Metadaten, die vertrauliche Informationen preisgeben könnten?
PDF-Metadaten stellen eine häufig übersehene Quelle für Informationsverluste dar. Jede PDF-Datei enthält Eigenschaften, die sensible Details preisgeben können: Name und Benutzername des Autors, die Software, mit der das Dokument erstellt wurde, Zeitstempel für die Erstellung und Änderung, den ursprünglichen Dateinamen, den Änderungsverlauf und benutzerdefinierte Eigenschaften, die von verschiedenen Anwendungen hinzugefügt wurden. Bevor die Dokumente extern weitergegeben werden, müssen diese Metadaten entfernt oder bereinigt werden. Einen umfassenden Überblick über Metadatenoperationen finden Sie in unserem metadata how-to guide.
IronPDF stellt Dokumentmetadaten über die MetaData Eigenschaft bereit, sodass Sie bestehende Werte lesen, ändern oder vollständig entfernen können.
using IronPdf;using System;// Load a document containing sensitive metadataPdfDocument pdf = PdfDocument.FromFile("internal-report.pdf");// Access current metadata propertiesstring author = pdf.MetaData.Author;string title = pdf.MetaData.Title;string subject = pdf.MetaData.Subject;string keywords = pdf.MetaData.Keywords;string creator = pdf.MetaData.Creator;string producer = pdf.MetaData.Producer;DateTime? creationDate = pdf.MetaData.CreationDate;DateTime? modifiedDate = pdf.MetaData.ModifiedDate;// Get all metadata keys including custom propertiesvar allKeys = pdf.MetaData.Keys();
using IronPdf;
using System;
// Load a document containing sensitive metadata
PdfDocument pdf = PdfDocument.FromFile("internal-report.pdf");
// Access current metadata properties
string author = pdf.MetaData.Author;
string title = pdf.MetaData.Title;
string subject = pdf.MetaData.Subject;
string keywords = pdf.MetaData.Keywords;
string creator = pdf.MetaData.Creator;
string producer = pdf.MetaData.Producer;
DateTime? creationDate = pdf.MetaData.CreationDate;
DateTime? modifiedDate = pdf.MetaData.ModifiedDate;
// Get all metadata keys including custom properties
var allKeys = pdf.MetaData.Keys();
ImportsIronPdfImportsSystem' Load a document containing sensitive metadataDim pdf AsPdfDocument = PdfDocument.FromFile("internal-report.pdf")' Access current metadata propertiesDim author AsString = pdf.MetaData.AuthorDim title AsString = pdf.MetaData.TitleDim subject AsString = pdf.MetaData.SubjectDim keywords AsString = pdf.MetaData.KeywordsDim creator AsString = pdf.MetaData.CreatorDim producer AsString = pdf.MetaData.ProducerDim creationDate AsDateTime? = pdf.MetaData.CreationDateDim modifiedDate AsDateTime? = pdf.MetaData.ModifiedDate' Get all metadata keys including custom propertiesDim allKeys = pdf.MetaData.Keys()
Imports IronPdf
Imports System
' Load a document containing sensitive metadata
Dim pdf As PdfDocument = PdfDocument.FromFile("internal-report.pdf")
' Access current metadata properties
Dim author As String = pdf.MetaData.Author
Dim title As String = pdf.MetaData.Title
Dim subject As String = pdf.MetaData.Subject
Dim keywords As String = pdf.MetaData.Keywords
Dim creator As String = pdf.MetaData.Creator
Dim producer As String = pdf.MetaData.Producer
Dim creationDate As DateTime? = pdf.MetaData.CreationDate
Dim modifiedDate As DateTime? = pdf.MetaData.ModifiedDate
' Get all metadata keys including custom properties
Dim allKeys = pdf.MetaData.Keys()
Vor der Verteilung müssen sensible Metadaten entfernt werden:
Eingabe
Ein internes Memo, das eingebettete Metadaten wie Autorennamen, Erstellungszeitstempel und benutzerdefinierte Eigenschaften enthält, die vertrauliche Unternehmensinformationen preisgeben könnten.
using IronPdf;using System;PdfDocument pdf = PdfDocument.FromFile("confidential-memo.pdf");// Replace identifying metadata with generic valuespdf.MetaData.Author = "Organization Name";pdf.MetaData.Creator = "Document System";pdf.MetaData.Producer = "";pdf.MetaData.Title = "Public Document";pdf.MetaData.Subject = "";pdf.MetaData.Keywords = "";// Normalize dates to remove timing informationpdf.MetaData.CreationDate = DateTime.Now;pdf.MetaData.ModifiedDate = DateTime.Now;// Remove specific custom metadata keyspdf.MetaData.RemoveMetaDataKey("OriginalFilename");pdf.MetaData.RemoveMetaDataKey("LastSavedBy");pdf.MetaData.RemoveMetaDataKey("Company");pdf.MetaData.RemoveMetaDataKey("Manager");// Remove custom properties added by applicationstry{ pdf.MetaData.CustomProperties.Remove("SourcePath");}catch { }pdf.SaveAs("confidential-memo-cleaned.pdf");
using IronPdf;
using System;
PdfDocument pdf = PdfDocument.FromFile("confidential-memo.pdf");
// Replace identifying metadata with generic values
pdf.MetaData.Author = "Organization Name";
pdf.MetaData.Creator = "Document System";
pdf.MetaData.Producer = "";
pdf.MetaData.Title = "Public Document";
pdf.MetaData.Subject = "";
pdf.MetaData.Keywords = "";
// Normalize dates to remove timing information
pdf.MetaData.CreationDate = DateTime.Now;
pdf.MetaData.ModifiedDate = DateTime.Now;
// Remove specific custom metadata keys
pdf.MetaData.RemoveMetaDataKey("OriginalFilename");
pdf.MetaData.RemoveMetaDataKey("LastSavedBy");
pdf.MetaData.RemoveMetaDataKey("Company");
pdf.MetaData.RemoveMetaDataKey("Manager");
// Remove custom properties added by applications
try
{
pdf.MetaData.CustomProperties.Remove("SourcePath");
}
catch { }
pdf.SaveAs("confidential-memo-cleaned.pdf");
ImportsIronPdfImportsSystemDim pdf AsPdfDocument = PdfDocument.FromFile("confidential-memo.pdf")' Replace identifying metadata with generic valuespdf.MetaData.Author = "Organization Name"pdf.MetaData.Creator = "Document System"pdf.MetaData.Producer = ""pdf.MetaData.Title = "Public Document"pdf.MetaData.Subject = ""pdf.MetaData.Keywords = ""' Normalize dates to remove timing informationpdf.MetaData.CreationDate = DateTime.Nowpdf.MetaData.ModifiedDate = DateTime.Now' Remove specific custom metadata keyspdf.MetaData.RemoveMetaDataKey("OriginalFilename")pdf.MetaData.RemoveMetaDataKey("LastSavedBy")pdf.MetaData.RemoveMetaDataKey("Company")pdf.MetaData.RemoveMetaDataKey("Manager")' Remove custom properties added by applicationsTry pdf.MetaData.CustomProperties.Remove("SourcePath")CatchEndTrypdf.SaveAs("confidential-memo-cleaned.pdf")
Imports IronPdf
Imports System
Dim pdf As PdfDocument = PdfDocument.FromFile("confidential-memo.pdf")
' Replace identifying metadata with generic values
pdf.MetaData.Author = "Organization Name"
pdf.MetaData.Creator = "Document System"
pdf.MetaData.Producer = ""
pdf.MetaData.Title = "Public Document"
pdf.MetaData.Subject = ""
pdf.MetaData.Keywords = ""
' Normalize dates to remove timing information
pdf.MetaData.CreationDate = DateTime.Now
pdf.MetaData.ModifiedDate = DateTime.Now
' Remove specific custom metadata keys
pdf.MetaData.RemoveMetaDataKey("OriginalFilename")
pdf.MetaData.RemoveMetaDataKey("LastSavedBy")
pdf.MetaData.RemoveMetaDataKey("Company")
pdf.MetaData.RemoveMetaDataKey("Manager")
' Remove custom properties added by applications
Try
pdf.MetaData.CustomProperties.Remove("SourcePath")
Catch
End Try
pdf.SaveAs("confidential-memo-cleaned.pdf")
Dieser Code ersetzt identifizierende Metadatenfelder durch generische Werte, normalisiert Zeitstempel auf das aktuelle Datum und entfernt benutzerdefinierte Metadatenschlüssel, die Anwendungen möglicherweise hinzugefügt haben. Die RemoveMetaDataKey Methode zielt auf spezifische Eigenschaften wie "OriginalFilename" und "LastSavedBy" ab, die interne Informationen preisgeben könnten.
Musterausgabe
Die gründliche Bereinigung von Metadaten bei Batch-Vorgängen erfordert einen systematischen Ansatz:
using IronPdf;using System;using System.Collections.Generic;public class MetadataCleaner{ private readonly string _defaultAuthor; private readonly string _defaultCreator; publicMetadataCleaner(string organizationName) { _defaultAuthor = organizationName; _defaultCreator = $"{organizationName} Document System"; } public voidCleanMetadata(PdfDocument pdf) { // Replace standard metadata fields pdf.MetaData.Author = _defaultAuthor; pdf.MetaData.Creator = _defaultCreator; pdf.MetaData.Producer = ""; pdf.MetaData.Subject = ""; pdf.MetaData.Keywords = ""; // Normalize timestamps DateTime now = DateTime.Now; pdf.MetaData.CreationDate = now; pdf.MetaData.ModifiedDate = now; // Get all keys and remove potentially sensitive ones List<string> keysToRemove = new List<string>(); foreach (string key in pdf.MetaData.Keys()) { // Keep only essential keys if (!IsEssentialKey(key)) { keysToRemove.Add(key); } } foreach (string key in keysToRemove) { pdf.MetaData.RemoveMetaDataKey(key); } } private boolIsEssentialKey(string key) { // Keep only the basic display properties string[] essentialKeys = { "Title", "Author", "CreationDate", "ModifiedDate" }; foreach (string essential in essentialKeys) { if (key.Equals(essential, StringComparison.OrdinalIgnoreCase)) { return true; } } return false; }}// Usageclass Program{ static voidMain() { MetadataCleaner cleaner = new MetadataCleaner("Acme Corporation"); PdfDocument pdf = PdfDocument.FromFile("report.pdf"); cleaner.CleanMetadata(pdf); pdf.SaveAs("report-clean.pdf"); }}
using IronPdf;
using System;
using System.Collections.Generic;
public class MetadataCleaner
{
private readonly string _defaultAuthor;
private readonly string _defaultCreator;
public MetadataCleaner(string organizationName)
{
_defaultAuthor = organizationName;
_defaultCreator = $"{organizationName} Document System";
}
public void CleanMetadata(PdfDocument pdf)
{
// Replace standard metadata fields
pdf.MetaData.Author = _defaultAuthor;
pdf.MetaData.Creator = _defaultCreator;
pdf.MetaData.Producer = "";
pdf.MetaData.Subject = "";
pdf.MetaData.Keywords = "";
// Normalize timestamps
DateTime now = DateTime.Now;
pdf.MetaData.CreationDate = now;
pdf.MetaData.ModifiedDate = now;
// Get all keys and remove potentially sensitive ones
List<string> keysToRemove = new List<string>();
foreach (string key in pdf.MetaData.Keys())
{
// Keep only essential keys
if (!IsEssentialKey(key))
{
keysToRemove.Add(key);
}
}
foreach (string key in keysToRemove)
{
pdf.MetaData.RemoveMetaDataKey(key);
}
}
private bool IsEssentialKey(string key)
{
// Keep only the basic display properties
string[] essentialKeys = { "Title", "Author", "CreationDate", "ModifiedDate" };
foreach (string essential in essentialKeys)
{
if (key.Equals(essential, StringComparison.OrdinalIgnoreCase))
{
return true;
}
}
return false;
}
}
// Usage
class Program
{
static void Main()
{
MetadataCleaner cleaner = new MetadataCleaner("Acme Corporation");
PdfDocument pdf = PdfDocument.FromFile("report.pdf");
cleaner.CleanMetadata(pdf);
pdf.SaveAs("report-clean.pdf");
}
}
C#
Wie kann ich eine PDF-Datei säubern, um eingebettete Skripte und versteckte Bedrohungen zu entfernen?
Die PDF-Sanitisierung befasst sich mit Sicherheitsfragen, die über den sichtbaren Inhalt und die Metadaten hinausgehen. PDF-Dateien können JavaScript-Code, eingebettete ausführbare Dateien, Formularaktionen, die externe Verbindungen auslösen, und andere potenziell schädliche Elemente enthalten. Diese Funktionen dienen legitimen Zwecken wie interaktiven Formularen und Multimedia-Inhalten, schaffen aber auch Angriffsmöglichkeiten. Durch die Bereinigung einer PDF-Datei werden diese aktiven Elemente entfernt, während der visuelle Inhalt erhalten bleibt. Weitere Einzelheiten zu den Bereinigungsmethoden finden Sie in unserer Anleitung zur Bereinigung von PDF-Dateien.
Die Cleaner Klasse von IronPDF behandelt die Bereinigung durch einen eleganten Ansatz: Konvertieren des PDFs in ein Bildformat und Rückkonvertierung. Bei diesem Prozess werden JavaScript, eingebettete Objekte, Formularaktionen und Anmerkungen entfernt, während das visuelle Erscheinungsbild intakt bleibt. Die Bibliothek bietet zwei Bereinigungsmethoden mit unterschiedlichen Merkmalen.
Eingabe
Ein PDF-Dokument, das von einer externen Quelle stammt und möglicherweise JavaScript, eingebettete Objekte oder andere potenziell schädliche aktive Inhalte enthält.
using IronPdf;// Load a PDF that may contain active contentPdfDocument pdf = PdfDocument.FromFile("received-document.pdf");// Sanitize using SVG conversion// Faster processing, results in searchable text, slight layout variations possiblePdfDocument sanitizedSvg = Cleaner.SanitizeWithSvg(pdf);sanitizedSvg.SaveAs("sanitized-svg.pdf");// Sanitize using Bitmap conversion// Slower processing, text becomes image (not searchable), exact visual reproductionPdfDocument sanitizedBitmap = Cleaner.SanitizeWithBitmap(pdf);sanitizedBitmap.SaveAs("sanitized-bitmap.pdf");
using IronPdf;
// Load a PDF that may contain active content
PdfDocument pdf = PdfDocument.FromFile("received-document.pdf");
// Sanitize using SVG conversion
// Faster processing, results in searchable text, slight layout variations possible
PdfDocument sanitizedSvg = Cleaner.SanitizeWithSvg(pdf);
sanitizedSvg.SaveAs("sanitized-svg.pdf");
// Sanitize using Bitmap conversion
// Slower processing, text becomes image (not searchable), exact visual reproduction
PdfDocument sanitizedBitmap = Cleaner.SanitizeWithBitmap(pdf);
sanitizedBitmap.SaveAs("sanitized-bitmap.pdf");
ImportsIronPdf' Load a PDF that may contain active contentDim pdf AsPdfDocument = PdfDocument.FromFile("received-document.pdf")' Sanitize using SVG conversion' Faster processing, results in searchable text, slight layout variations possibleDim sanitizedSvg AsPdfDocument = Cleaner.SanitizeWithSvg(pdf)sanitizedSvg.SaveAs("sanitized-svg.pdf")' Sanitize using Bitmap conversion' Slower processing, text becomes image (not searchable), exact visual reproductionDim sanitizedBitmap AsPdfDocument = Cleaner.SanitizeWithBitmap(pdf)sanitizedBitmap.SaveAs("sanitized-bitmap.pdf")
Imports IronPdf
' Load a PDF that may contain active content
Dim pdf As PdfDocument = PdfDocument.FromFile("received-document.pdf")
' Sanitize using SVG conversion
' Faster processing, results in searchable text, slight layout variations possible
Dim sanitizedSvg As PdfDocument = Cleaner.SanitizeWithSvg(pdf)
sanitizedSvg.SaveAs("sanitized-svg.pdf")
' Sanitize using Bitmap conversion
' Slower processing, text becomes image (not searchable), exact visual reproduction
Dim sanitizedBitmap As PdfDocument = Cleaner.SanitizeWithBitmap(pdf)
sanitizedBitmap.SaveAs("sanitized-bitmap.pdf")
Dieser Code demonstriert zwei Bereinigungsmethoden, die von der Cleaner Klasse von IronPDF bereitgestellt werden. SanitizeWithSvg konvertiert das PDF über ein SVG-Zwischenformat, wobei durchsuchbarer Text erhalten bleibt, während aktiver Inhalt entfernt wird. SanitizeWithBitmap konvertiert Seiten zuerst in Bilder, wodurch exakte visuelle Kopien erzeugt werden, jedoch mit als nicht durchsuchbare Grafiken gerendertem Text.
Musterausgabe
Die SVG-Methode arbeitet schneller und bewahrt den Text als durchsuchbaren Inhalt, so dass sie sich für Dokumente eignet, die indiziert oder zugänglich bleiben müssen. Die Bitmap-Methode erzeugt exakte visuelle Kopien, wandelt aber den Text in Bilder um, was eine Textauswahl und -suche verhindert. Wählen Sie entsprechend Ihren Anforderungen an das Ausgabedokument.
Sie können auch Rendering-Optionen während der Bereinigung anwenden, um die Ausgabe anzupassen:
using IronPdf;// Load the potentially unsafe documentPdfDocument pdf = PdfDocument.FromFile("untrusted-source.pdf");// Configure rendering options for sanitizationvar renderOptions = new ChromePdfRenderOptions{MarginTop = 10,MarginBottom = 10,MarginLeft = 10,MarginRight = 10};// Sanitize with custom optionsPdfDocument sanitized = Cleaner.SanitizeWithSvg(pdf, renderOptions);sanitized.SaveAs("untrusted-source-safe.pdf");
using IronPdf;
// Load the potentially unsafe document
PdfDocument pdf = PdfDocument.FromFile("untrusted-source.pdf");
// Configure rendering options for sanitization
var renderOptions = new ChromePdfRenderOptions
{
MarginTop = 10,
MarginBottom = 10,
MarginLeft = 10,
MarginRight = 10
};
// Sanitize with custom options
PdfDocument sanitized = Cleaner.SanitizeWithSvg(pdf, renderOptions);
sanitized.SaveAs("untrusted-source-safe.pdf");
ImportsIronPdf' Load the potentially unsafe documentDim pdf AsPdfDocument = PdfDocument.FromFile("untrusted-source.pdf")' Configure rendering options for sanitizationDim renderOptions As New ChromePdfRenderOptionsWith { .MarginTop = 10, .MarginBottom = 10, .MarginLeft = 10, .MarginRight = 10}' Sanitize with custom optionsDim sanitized AsPdfDocument = Cleaner.SanitizeWithSvg(pdf, renderOptions)sanitized.SaveAs("untrusted-source-safe.pdf")
Imports IronPdf
' Load the potentially unsafe document
Dim pdf As PdfDocument = PdfDocument.FromFile("untrusted-source.pdf")
' Configure rendering options for sanitization
Dim renderOptions As New ChromePdfRenderOptions With {
.MarginTop = 10,
.MarginBottom = 10,
.MarginLeft = 10,
.MarginRight = 10
}
' Sanitize with custom options
Dim sanitized As PdfDocument = Cleaner.SanitizeWithSvg(pdf, renderOptions)
sanitized.SaveAs("untrusted-source-safe.pdf")
In hochsicheren Umgebungen ist häufig die Kombination von Säuberung mit weiteren Schutzmaßnahmen erforderlich:
using IronPdf;using System;public class SecureDocumentProcessor{ public PdfDocumentProcessUntrustedDocument(string inputPath) { // Load the document PdfDocument original = PdfDocument.FromFile(inputPath); // Step 1: Sanitize to remove active content PdfDocument sanitized = Cleaner.SanitizeWithSvg(original); // Step 2: Clean metadata sanitized.MetaData.Author = "Processed Document"; sanitized.MetaData.Creator = "Secure Processor"; sanitized.MetaData.Producer = ""; sanitized.MetaData.CreationDate = DateTime.Now; sanitized.MetaData.ModifiedDate = DateTime.Now; // Remove all custom metadata foreach (string key in sanitized.MetaData.Keys()) { if (key != "Title" && key != "Author" && key != "CreationDate" && key != "ModifiedDate") { sanitized.MetaData.RemoveMetaDataKey(key); } } return sanitized; }}// Usageclass Program{ static voidMain() { SecureDocumentProcessor processor = new SecureDocumentProcessor(); PdfDocument safe = processor.ProcessUntrustedDocument("email-attachment.pdf"); safe.SaveAs("email-attachment-safe.pdf"); }}
using IronPdf;
using System;
public class SecureDocumentProcessor
{
public PdfDocument ProcessUntrustedDocument(string inputPath)
{
// Load the document
PdfDocument original = PdfDocument.FromFile(inputPath);
// Step 1: Sanitize to remove active content
PdfDocument sanitized = Cleaner.SanitizeWithSvg(original);
// Step 2: Clean metadata
sanitized.MetaData.Author = "Processed Document";
sanitized.MetaData.Creator = "Secure Processor";
sanitized.MetaData.Producer = "";
sanitized.MetaData.CreationDate = DateTime.Now;
sanitized.MetaData.ModifiedDate = DateTime.Now;
// Remove all custom metadata
foreach (string key in sanitized.MetaData.Keys())
{
if (key != "Title" && key != "Author" && key != "CreationDate" && key != "ModifiedDate")
{
sanitized.MetaData.RemoveMetaDataKey(key);
}
}
return sanitized;
}
}
// Usage
class Program
{
static void Main()
{
SecureDocumentProcessor processor = new SecureDocumentProcessor();
PdfDocument safe = processor.ProcessUntrustedDocument("email-attachment.pdf");
safe.SaveAs("email-attachment-safe.pdf");
}
}
ImportsIronPdfImportsSystemPublic Class SecureDocumentProcessor Public Function ProcessUntrustedDocument(inputPath AsString) AsPdfDocument ' Load the document Dim original AsPdfDocument = PdfDocument.FromFile(inputPath) ' Step 1: Sanitize to remove active content Dim sanitized AsPdfDocument = Cleaner.SanitizeWithSvg(original) ' Step 2: Clean metadata sanitized.MetaData.Author = "Processed Document" sanitized.MetaData.Creator = "Secure Processor" sanitized.MetaData.Producer = "" sanitized.MetaData.CreationDate = DateTime.Now sanitized.MetaData.ModifiedDate = DateTime.Now ' Remove all custom metadata For Each key AsStringIn sanitized.MetaData.Keys() If key <> "Title"AndAlso key <> "Author"AndAlso key <> "CreationDate"AndAlso key <> "ModifiedDate" Then sanitized.MetaData.RemoveMetaDataKey(key) End If Next Return sanitized End FunctionEnd Class' UsageModuleProgram Sub Main() Dim processor As New SecureDocumentProcessor() Dim safe AsPdfDocument = processor.ProcessUntrustedDocument("email-attachment.pdf") safe.SaveAs("email-attachment-safe.pdf") End SubEndModule
Imports IronPdf
Imports System
Public Class SecureDocumentProcessor
Public Function ProcessUntrustedDocument(inputPath As String) As PdfDocument
' Load the document
Dim original As PdfDocument = PdfDocument.FromFile(inputPath)
' Step 1: Sanitize to remove active content
Dim sanitized As PdfDocument = Cleaner.SanitizeWithSvg(original)
' Step 2: Clean metadata
sanitized.MetaData.Author = "Processed Document"
sanitized.MetaData.Creator = "Secure Processor"
sanitized.MetaData.Producer = ""
sanitized.MetaData.CreationDate = DateTime.Now
sanitized.MetaData.ModifiedDate = DateTime.Now
' Remove all custom metadata
For Each key As String In sanitized.MetaData.Keys()
If key <> "Title" AndAlso key <> "Author" AndAlso key <> "CreationDate" AndAlso key <> "ModifiedDate" Then
sanitized.MetaData.RemoveMetaDataKey(key)
End If
Next
Return sanitized
End Function
End Class
' Usage
Module Program
Sub Main()
Dim processor As New SecureDocumentProcessor()
Dim safe As PdfDocument = processor.ProcessUntrustedDocument("email-attachment.pdf")
safe.SaveAs("email-attachment-safe.pdf")
End Sub
End Module
Wie scanne ich eine PDF-Datei auf Sicherheitsschwachstellen?
Bevor Sie Dokumente bearbeiten oder bereinigen, sollten Sie prüfen, welche potenziellen Bedrohungen sie enthalten. Die Cleaner.ScanPdf Methode von IronPDF untersucht Dokumente unter Verwendung von YARA-Regeln, dies sind Musterdefinitionen, die häufig in der Malware-Analyse und Bedrohungserkennung verwendet werden. Der Scan identifiziert Merkmale, die mit bösartigen PDF-Dateien verbunden sind.
using IronPdf;// Load the document to scanPdfDocument pdf = PdfDocument.FromFile("suspicious-document.pdf");// Scan using default YARA rulesCleanerScanResult scanResult = Cleaner.ScanPdf(pdf);// Check the scan resultsbool threatsDetected = scanResult.IsDetected;int riskCount = scanResult.Risks.Count;// Process identified risksif (scanResult.IsDetected){ foreach (var risk in scanResult.Risks) { // Handle each identified risk } // Sanitize the document before use PdfDocument sanitized = Cleaner.SanitizeWithSvg(pdf); sanitized.SaveAs("suspicious-document-safe.pdf");}
using IronPdf;
// Load the document to scan
PdfDocument pdf = PdfDocument.FromFile("suspicious-document.pdf");
// Scan using default YARA rules
CleanerScanResult scanResult = Cleaner.ScanPdf(pdf);
// Check the scan results
bool threatsDetected = scanResult.IsDetected;
int riskCount = scanResult.Risks.Count;
// Process identified risks
if (scanResult.IsDetected)
{
foreach (var risk in scanResult.Risks)
{
// Handle each identified risk
}
// Sanitize the document before use
PdfDocument sanitized = Cleaner.SanitizeWithSvg(pdf);
sanitized.SaveAs("suspicious-document-safe.pdf");
}
ImportsIronPdf' Load the document to scanDim pdf AsPdfDocument = PdfDocument.FromFile("suspicious-document.pdf")' Scan using default YARA rulesDim scanResult AsCleanerScanResult = Cleaner.ScanPdf(pdf)' Check the scan resultsDim threatsDetected AsBoolean = scanResult.IsDetectedDim riskCount AsInteger = scanResult.Risks.Count' Process identified risksIf scanResult.IsDetectedThen For Each risk In scanResult.Risks ' Handle each identified risk Next ' Sanitize the document before use Dim sanitized AsPdfDocument = Cleaner.SanitizeWithSvg(pdf) sanitized.SaveAs("suspicious-document-safe.pdf")End If
Imports IronPdf
' Load the document to scan
Dim pdf As PdfDocument = PdfDocument.FromFile("suspicious-document.pdf")
' Scan using default YARA rules
Dim scanResult As CleanerScanResult = Cleaner.ScanPdf(pdf)
' Check the scan results
Dim threatsDetected As Boolean = scanResult.IsDetected
Dim riskCount As Integer = scanResult.Risks.Count
' Process identified risks
If scanResult.IsDetected Then
For Each risk In scanResult.Risks
' Handle each identified risk
Next
' Sanitize the document before use
Dim sanitized As PdfDocument = Cleaner.SanitizeWithSvg(pdf)
sanitized.SaveAs("suspicious-document-safe.pdf")
End If
Sie können benutzerdefinierte YARA-Regeldateien für spezielle Erkennungsanforderungen bereitstellen. Organisationen mit spezifischen Bedrohungsmodellen oder Compliance-Anforderungen unterhalten oft ihre eigenen Regelsätze, die auf bestimmte Schwachstellenmuster abzielen.
using IronPdf;PdfDocument pdf = PdfDocument.FromFile("incoming-document.pdf");// Scan with custom YARA rulesstring[] customYaraFiles = { "corporate-rules.yar", "industry-specific.yar" };CleanerScanResult result = Cleaner.ScanPdf(pdf, customYaraFiles);if (result.IsDetected){ // Document triggered custom rules and requires review or sanitization PdfDocument sanitized = Cleaner.SanitizeWithSvg(pdf); sanitized.SaveAs("incoming-document-safe.pdf");}
using IronPdf;
PdfDocument pdf = PdfDocument.FromFile("incoming-document.pdf");
// Scan with custom YARA rules
string[] customYaraFiles = { "corporate-rules.yar", "industry-specific.yar" };
CleanerScanResult result = Cleaner.ScanPdf(pdf, customYaraFiles);
if (result.IsDetected)
{
// Document triggered custom rules and requires review or sanitization
PdfDocument sanitized = Cleaner.SanitizeWithSvg(pdf);
sanitized.SaveAs("incoming-document-safe.pdf");
}
ImportsIronPdfDim pdf AsPdfDocument = PdfDocument.FromFile("incoming-document.pdf")' Scan with custom YARA rulesDim customYaraFiles AsString() = {"corporate-rules.yar", "industry-specific.yar"}Dim result AsCleanerScanResult = Cleaner.ScanPdf(pdf, customYaraFiles)If result.IsDetectedThen ' Document triggered custom rules and requires review or sanitization Dim sanitized AsPdfDocument = Cleaner.SanitizeWithSvg(pdf) sanitized.SaveAs("incoming-document-safe.pdf")End If
Imports IronPdf
Dim pdf As PdfDocument = PdfDocument.FromFile("incoming-document.pdf")
' Scan with custom YARA rules
Dim customYaraFiles As String() = {"corporate-rules.yar", "industry-specific.yar"}
Dim result As CleanerScanResult = Cleaner.ScanPdf(pdf, customYaraFiles)
If result.IsDetected Then
' Document triggered custom rules and requires review or sanitization
Dim sanitized As PdfDocument = Cleaner.SanitizeWithSvg(pdf)
sanitized.SaveAs("incoming-document-safe.pdf")
End If
Die Integration des Scannens in die Arbeitsabläufe der Dokumentenerfassung hilft bei der Automatisierung von Sicherheitsentscheidungen:
using IronPdf;using System;using System.IO;public enum DocumentSafetyLevel{Safe,Suspicious,Dangerous}public class DocumentSecurityGateway{ public DocumentSafetyLevelEvaluateDocument(string filePath) { PdfDocument pdf = PdfDocument.FromFile(filePath); CleanerScanResult scan = Cleaner.ScanPdf(pdf); if (!scan.IsDetected) { returnDocumentSafetyLevel.Safe; } // Evaluate severity based on number of risks if (scan.Risks.Count > 5) { returnDocumentSafetyLevel.Dangerous; } returnDocumentSafetyLevel.Suspicious; } public PdfDocumentProcessIncomingDocument(string filePath, string outputDirectory) { DocumentSafetyLevel safety = EvaluateDocument(filePath); string fileName = Path.GetFileName(filePath); switch (safety) { case DocumentSafetyLevel.Safe: returnPdfDocument.FromFile(filePath); case DocumentSafetyLevel.Suspicious: PdfDocument suspicious = PdfDocument.FromFile(filePath); returnCleaner.SanitizeWithSvg(suspicious); case DocumentSafetyLevel.Dangerous: throw new SecurityException($"Document {fileName} contains dangerous content"); default: throw new InvalidOperationException("Unknown safety level"); } }}
using IronPdf;
using System;
using System.IO;
public enum DocumentSafetyLevel
{
Safe,
Suspicious,
Dangerous
}
public class DocumentSecurityGateway
{
public DocumentSafetyLevel EvaluateDocument(string filePath)
{
PdfDocument pdf = PdfDocument.FromFile(filePath);
CleanerScanResult scan = Cleaner.ScanPdf(pdf);
if (!scan.IsDetected)
{
return DocumentSafetyLevel.Safe;
}
// Evaluate severity based on number of risks
if (scan.Risks.Count > 5)
{
return DocumentSafetyLevel.Dangerous;
}
return DocumentSafetyLevel.Suspicious;
}
public PdfDocument ProcessIncomingDocument(string filePath, string outputDirectory)
{
DocumentSafetyLevel safety = EvaluateDocument(filePath);
string fileName = Path.GetFileName(filePath);
switch (safety)
{
case DocumentSafetyLevel.Safe:
return PdfDocument.FromFile(filePath);
case DocumentSafetyLevel.Suspicious:
PdfDocument suspicious = PdfDocument.FromFile(filePath);
return Cleaner.SanitizeWithSvg(suspicious);
case DocumentSafetyLevel.Dangerous:
throw new SecurityException($"Document {fileName} contains dangerous content");
default:
throw new InvalidOperationException("Unknown safety level");
}
}
}
ImportsIronPdfImportsSystemImportsSystem.IOPublicEnumDocumentSafetyLevelSafeSuspiciousDangerousEndEnumPublic Class DocumentSecurityGateway Public Function EvaluateDocument(filePath AsString) AsDocumentSafetyLevel Dim pdf AsPdfDocument = PdfDocument.FromFile(filePath) Dim scan AsCleanerScanResult = Cleaner.ScanPdf(pdf) IfNot scan.IsDetectedThen ReturnDocumentSafetyLevel.Safe End If ' Evaluate severity based on number of risks If scan.Risks.Count > 5 Then ReturnDocumentSafetyLevel.Dangerous End If ReturnDocumentSafetyLevel.Suspicious End Function Public Function ProcessIncomingDocument(filePath AsString, outputDirectory AsString) AsPdfDocument Dim safety AsDocumentSafetyLevel = EvaluateDocument(filePath) Dim fileName AsString = Path.GetFileName(filePath) Select Case safety CaseDocumentSafetyLevel.Safe ReturnPdfDocument.FromFile(filePath) CaseDocumentSafetyLevel.Suspicious Dim suspicious AsPdfDocument = PdfDocument.FromFile(filePath) ReturnCleaner.SanitizeWithSvg(suspicious) CaseDocumentSafetyLevel.DangerousThrow New SecurityException($"Document {fileName} contains dangerous content") Case ElseThrow New InvalidOperationException("Unknown safety level") End Select End FunctionEnd Class
Imports IronPdf
Imports System
Imports System.IO
Public Enum DocumentSafetyLevel
Safe
Suspicious
Dangerous
End Enum
Public Class DocumentSecurityGateway
Public Function EvaluateDocument(filePath As String) As DocumentSafetyLevel
Dim pdf As PdfDocument = PdfDocument.FromFile(filePath)
Dim scan As CleanerScanResult = Cleaner.ScanPdf(pdf)
If Not scan.IsDetected Then
Return DocumentSafetyLevel.Safe
End If
' Evaluate severity based on number of risks
If scan.Risks.Count > 5 Then
Return DocumentSafetyLevel.Dangerous
End If
Return DocumentSafetyLevel.Suspicious
End Function
Public Function ProcessIncomingDocument(filePath As String, outputDirectory As String) As PdfDocument
Dim safety As DocumentSafetyLevel = EvaluateDocument(filePath)
Dim fileName As String = Path.GetFileName(filePath)
Select Case safety
Case DocumentSafetyLevel.Safe
Return PdfDocument.FromFile(filePath)
Case DocumentSafetyLevel.Suspicious
Dim suspicious As PdfDocument = PdfDocument.FromFile(filePath)
Return Cleaner.SanitizeWithSvg(suspicious)
Case DocumentSafetyLevel.Dangerous
Throw New SecurityException($"Document {fileName} contains dangerous content")
Case Else
Throw New InvalidOperationException("Unknown safety level")
End Select
End Function
End Class
Wie kann ich eine vollständige Redaktions- und Bereinigungspipeline erstellen?
Die Verarbeitung von Produktionsdokumenten erfordert in der Regel die Kombination mehrerer Schutztechniken in einem kohärenten Arbeitsablauf. Eine vollständige Pipeline könnte eingehende Dokumente auf Bedrohungen scannen, diejenigen, die das erste Screening bestehen, bereinigen, Text- und Bereichsredaktionen anwenden, Metadaten entfernen und Prüfprotokolle erstellen, die alle durchgeführten Aktionen dokumentieren. Dieses Beispiel veranschaulicht einen solchen integrierten Ansatz.
using IronPdf;using IronSoftware.Drawing;using System;using System.Collections.Generic;using System.IO;using System.Text.RegularExpressions;public class DocumentProcessingResult{ public stringOriginalFile { get; set; } public stringOutputFile { get; set; } public boolWasSanitized { get; set; } public intTextRedactionsApplied { get; set; } public intRegionRedactionsApplied { get; set; } public boolMetadataCleaned { get; set; } public List<string> SensitiveDataTypesFound { get; set; } = new List<string>(); public DateTimeProcessedAt { get; set; } public boolSuccess { get; set; } public stringErrorMessage { get; set; }}public class ComprehensiveDocumentProcessor{ // Sensitive data patterns private readonly Dictionary<string, string> _sensitivePatterns = new Dictionary<string, string> { { "SSN", @"\b\d{3}-\d{2}-\d{4}\b" }, { "Credit Card", @"\b(?:\d{4}[-\s]?){3}\d{1,4}\b" }, { "Email", @"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b" }, { "Phone", @"\b(?:\(\d{3}\)\s?|\d{3}[-.])\d{3}[-.]?\d{4}\b" } }; // Standard regions to redact (signature areas, photo locations) private readonly List<RectangleF> _standardRedactionRegions = new List<RectangleF> { new RectangleF(72, 72, 200, 50), // Bottom left signature new RectangleF(350, 72, 200, 50) // Bottom right signature }; private readonly string _organizationName; publicComprehensiveDocumentProcessor(string organizationName) { _organizationName = organizationName; } public DocumentProcessingResultProcessDocument( string inputPath, string outputPath, bool sanitize = true, bool redactPatterns = true, bool redactRegions = true, bool cleanMetadata = true, List<string> additionalTermsToRedact = null) { var result = new DocumentProcessingResult {OriginalFile = inputPath,OutputFile = outputPath,ProcessedAt = DateTime.Now }; try { // Load the document PdfDocument pdf = PdfDocument.FromFile(inputPath); // Step 1: Security scan CleanerScanResult scanResult = Cleaner.ScanPdf(pdf); if (scanResult.IsDetected && scanResult.Risks.Count > 10) { throw new SecurityException("Document contains too many security risks to process"); } // Step 2: Sanitization (if needed or requested) if (sanitize || scanResult.IsDetected) { pdf = Cleaner.SanitizeWithSvg(pdf); result.WasSanitized = true; } // Step 3: Pattern-based text redaction if (redactPatterns) { string fullText = pdf.ExtractAllText(); HashSet<string> valuesToRedact = new HashSet<string>(); foreach (var pattern in _sensitivePatterns) { Regex regex = new Regex(pattern.Value, RegexOptions.IgnoreCase); MatchCollection matches = regex.Matches(fullText); if (matches.Count > 0) { result.SensitiveDataTypesFound.Add($"{pattern.Key} ({matches.Count})"); foreach (Match match in matches) { valuesToRedact.Add(match.Value); } } } // Apply redactions foreach (string value in valuesToRedact) { pdf.RedactTextOnAllPages(value); result.TextRedactionsApplied++; } } // Step 4: Additional specific terms if (additionalTermsToRedact != null) { foreach (string term in additionalTermsToRedact) { pdf.RedactTextOnAllPages(term); result.TextRedactionsApplied++; } } // Step 5: Region-based redaction if (redactRegions) { foreach (RectangleF region in _standardRedactionRegions) { pdf.RedactRegionsOnAllPages(region); result.RegionRedactionsApplied++; } } // Step 6: Metadata cleaning if (cleanMetadata) { pdf.MetaData.Author = _organizationName; pdf.MetaData.Creator = $"{_organizationName} Document Processor"; pdf.MetaData.Producer = ""; pdf.MetaData.Subject = ""; pdf.MetaData.Keywords = ""; pdf.MetaData.CreationDate = DateTime.Now; pdf.MetaData.ModifiedDate = DateTime.Now; result.MetadataCleaned = true; } // Step 7: Save the processed document pdf.SaveAs(outputPath); result.Success = true; } catch (Exception ex) { result.Success = false; result.ErrorMessage = ex.Message; } return result; }}// Usage exampleclass Program{ static voidMain() { var processor = new ComprehensiveDocumentProcessor("Acme Corporation"); // Process a single document with all protections var result = processor.ProcessDocument( inputPath: "customer-application.pdf", outputPath: "customer-application-redacted.pdf", sanitize: true, redactPatterns: true, redactRegions: true, cleanMetadata: true, additionalTermsToRedact: new List<string> { "Project Alpha", "Internal Use Only" } ); // Batch process multiple documents string[] inputFiles = Directory.GetFiles("incoming", "*.pdf"); foreach (string file in inputFiles) { string outputFile = Path.Combine("processed", Path.GetFileName(file)); processor.ProcessDocument(file, outputFile); } }}
using IronPdf;
using IronSoftware.Drawing;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text.RegularExpressions;
public class DocumentProcessingResult
{
public string OriginalFile { get; set; }
public string OutputFile { get; set; }
public bool WasSanitized { get; set; }
public int TextRedactionsApplied { get; set; }
public int RegionRedactionsApplied { get; set; }
public bool MetadataCleaned { get; set; }
public List<string> SensitiveDataTypesFound { get; set; } = new List<string>();
public DateTime ProcessedAt { get; set; }
public bool Success { get; set; }
public string ErrorMessage { get; set; }
}
public class ComprehensiveDocumentProcessor
{
// Sensitive data patterns
private readonly Dictionary<string, string> _sensitivePatterns = new Dictionary<string, string>
{
{ "SSN", @"\b\d{3}-\d{2}-\d{4}\b" },
{ "Credit Card", @"\b(?:\d{4}[-\s]?){3}\d{1,4}\b" },
{ "Email", @"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b" },
{ "Phone", @"\b(?:\(\d{3}\)\s?|\d{3}[-.])\d{3}[-.]?\d{4}\b" }
};
// Standard regions to redact (signature areas, photo locations)
private readonly List<RectangleF> _standardRedactionRegions = new List<RectangleF>
{
new RectangleF(72, 72, 200, 50), // Bottom left signature
new RectangleF(350, 72, 200, 50) // Bottom right signature
};
private readonly string _organizationName;
public ComprehensiveDocumentProcessor(string organizationName)
{
_organizationName = organizationName;
}
public DocumentProcessingResult ProcessDocument(
string inputPath,
string outputPath,
bool sanitize = true,
bool redactPatterns = true,
bool redactRegions = true,
bool cleanMetadata = true,
List<string> additionalTermsToRedact = null)
{
var result = new DocumentProcessingResult
{
OriginalFile = inputPath,
OutputFile = outputPath,
ProcessedAt = DateTime.Now
};
try
{
// Load the document
PdfDocument pdf = PdfDocument.FromFile(inputPath);
// Step 1: Security scan
CleanerScanResult scanResult = Cleaner.ScanPdf(pdf);
if (scanResult.IsDetected && scanResult.Risks.Count > 10)
{
throw new SecurityException("Document contains too many security risks to process");
}
// Step 2: Sanitization (if needed or requested)
if (sanitize || scanResult.IsDetected)
{
pdf = Cleaner.SanitizeWithSvg(pdf);
result.WasSanitized = true;
}
// Step 3: Pattern-based text redaction
if (redactPatterns)
{
string fullText = pdf.ExtractAllText();
HashSet<string> valuesToRedact = new HashSet<string>();
foreach (var pattern in _sensitivePatterns)
{
Regex regex = new Regex(pattern.Value, RegexOptions.IgnoreCase);
MatchCollection matches = regex.Matches(fullText);
if (matches.Count > 0)
{
result.SensitiveDataTypesFound.Add($"{pattern.Key} ({matches.Count})");
foreach (Match match in matches)
{
valuesToRedact.Add(match.Value);
}
}
}
// Apply redactions
foreach (string value in valuesToRedact)
{
pdf.RedactTextOnAllPages(value);
result.TextRedactionsApplied++;
}
}
// Step 4: Additional specific terms
if (additionalTermsToRedact != null)
{
foreach (string term in additionalTermsToRedact)
{
pdf.RedactTextOnAllPages(term);
result.TextRedactionsApplied++;
}
}
// Step 5: Region-based redaction
if (redactRegions)
{
foreach (RectangleF region in _standardRedactionRegions)
{
pdf.RedactRegionsOnAllPages(region);
result.RegionRedactionsApplied++;
}
}
// Step 6: Metadata cleaning
if (cleanMetadata)
{
pdf.MetaData.Author = _organizationName;
pdf.MetaData.Creator = $"{_organizationName} Document Processor";
pdf.MetaData.Producer = "";
pdf.MetaData.Subject = "";
pdf.MetaData.Keywords = "";
pdf.MetaData.CreationDate = DateTime.Now;
pdf.MetaData.ModifiedDate = DateTime.Now;
result.MetadataCleaned = true;
}
// Step 7: Save the processed document
pdf.SaveAs(outputPath);
result.Success = true;
}
catch (Exception ex)
{
result.Success = false;
result.ErrorMessage = ex.Message;
}
return result;
}
}
// Usage example
class Program
{
static void Main()
{
var processor = new ComprehensiveDocumentProcessor("Acme Corporation");
// Process a single document with all protections
var result = processor.ProcessDocument(
inputPath: "customer-application.pdf",
outputPath: "customer-application-redacted.pdf",
sanitize: true,
redactPatterns: true,
redactRegions: true,
cleanMetadata: true,
additionalTermsToRedact: new List<string> { "Project Alpha", "Internal Use Only" }
);
// Batch process multiple documents
string[] inputFiles = Directory.GetFiles("incoming", "*.pdf");
foreach (string file in inputFiles)
{
string outputFile = Path.Combine("processed", Path.GetFileName(file));
processor.ProcessDocument(file, outputFile);
}
}
}
ImportsIronPdfImportsIronSoftware.DrawingImportsSystemImportsSystem.Collections.GenericImportsSystem.IOImportsSystem.Text.RegularExpressionsPublic Class DocumentProcessingResult Public Property OriginalFileAsString Public Property OutputFileAsString Public Property WasSanitizedAsBoolean Public Property TextRedactionsAppliedAsInteger Public Property RegionRedactionsAppliedAsInteger Public Property MetadataCleanedAsBoolean Public Property SensitiveDataTypesFoundAsList(OfString) = New List(OfString)() Public Property ProcessedAtAsDateTime Public Property SuccessAsBoolean Public Property ErrorMessageAsStringEnd ClassPublic Class ComprehensiveDocumentProcessor ' Sensitive data patterns PrivateReadOnly _sensitivePatterns AsDictionary(OfString, String) = New Dictionary(OfString, String) From { {"SSN", "\b\d{3}-\d{2}-\d{4}\b"}, {"Credit Card", "\b(?:\d{4}[-\s]?){3}\d{1,4}\b"}, {"Email", "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b"}, {"Phone", "\b(?:\(\d{3}\)\s?|\d{3}[-.])\d{3}[-.]?\d{4}\b"} } ' Standard regions to redact (signature areas, photo locations) PrivateReadOnly _standardRedactionRegions AsList(OfRectangleF) = New List(OfRectangleF) From { New RectangleF(72, 72, 200, 50), ' Bottom left signature New RectangleF(350, 72, 200, 50) ' Bottom right signature } PrivateReadOnly _organizationName AsString Public Sub New(organizationName AsString) _organizationName = organizationName End Sub Public Function ProcessDocument( inputPath AsString, outputPath AsString,Optional sanitize AsBoolean = True,Optional redactPatterns AsBoolean = True,Optional redactRegions AsBoolean = True,Optional cleanMetadata AsBoolean = True,Optional additionalTermsToRedact AsList(OfString) = Nothing) AsDocumentProcessingResult Dim result As New DocumentProcessingResultWith { .OriginalFile = inputPath, .OutputFile = outputPath, .ProcessedAt = DateTime.Now }Try ' Load the document Dim pdf AsPdfDocument = PdfDocument.FromFile(inputPath) ' Step 1: Security scan Dim scanResult AsCleanerScanResult = Cleaner.ScanPdf(pdf) If scanResult.IsDetectedAndAlso scanResult.Risks.Count > 10 ThenThrow New SecurityException("Document contains too many security risks to process") End If ' Step 2: Sanitization (if needed or requested) If sanitize OrElse scanResult.IsDetectedThen pdf = Cleaner.SanitizeWithSvg(pdf) result.WasSanitized = True End If ' Step 3: Pattern-based text redaction If redactPatterns Then Dim fullText AsString = pdf.ExtractAllText() Dim valuesToRedact As New HashSet(OfString)() For Each pattern In _sensitivePatterns Dim regex As New Regex(pattern.Value, RegexOptions.IgnoreCase) Dim matches AsMatchCollection = regex.Matches(fullText) If matches.Count > 0 Then result.SensitiveDataTypesFound.Add($"{pattern.Key} ({matches.Count})") For Each match AsMatchIn matches valuesToRedact.Add(match.Value) Next End If Next ' Apply redactions For Each value AsStringIn valuesToRedact pdf.RedactTextOnAllPages(value) result.TextRedactionsApplied += 1 Next End If ' Step 4: Additional specific terms If additionalTermsToRedact IsNot Nothing Then For Each term AsStringIn additionalTermsToRedact pdf.RedactTextOnAllPages(term) result.TextRedactionsApplied += 1 Next End If ' Step 5: Region-based redaction If redactRegions Then For Each region AsRectangleFIn _standardRedactionRegions pdf.RedactRegionsOnAllPages(region) result.RegionRedactionsApplied += 1 Next End If ' Step 6: Metadata cleaning If cleanMetadata Then pdf.MetaData.Author = _organizationName pdf.MetaData.Creator = $"{_organizationName} Document Processor" pdf.MetaData.Producer = "" pdf.MetaData.Subject = "" pdf.MetaData.Keywords = "" pdf.MetaData.CreationDate = DateTime.Now pdf.MetaData.ModifiedDate = DateTime.Now result.MetadataCleaned = True End If ' Step 7: Save the processed document pdf.SaveAs(outputPath) result.Success = TrueCatch ex AsException result.Success = False result.ErrorMessage = ex.MessageEndTry Return result End FunctionEnd Class' Usage exampleClass ProgramShared Sub Main() Dim processor As New ComprehensiveDocumentProcessor("Acme Corporation") ' Process a single document with all protections Dim result = processor.ProcessDocument( inputPath:="customer-application.pdf", outputPath:="customer-application-redacted.pdf", sanitize:=True, redactPatterns:=True, redactRegions:=True, cleanMetadata:=True, additionalTermsToRedact:=New List(OfString) From {"Project Alpha", "Internal Use Only"} ) ' Batch process multiple documents Dim inputFiles AsString() = Directory.GetFiles("incoming", "*.pdf") For Each file AsStringIn inputFiles Dim outputFile AsString = Path.Combine("processed", Path.GetFileName(file)) processor.ProcessDocument(file, outputFile) Next End SubEnd Class
Imports IronPdf
Imports IronSoftware.Drawing
Imports System
Imports System.Collections.Generic
Imports System.IO
Imports System.Text.RegularExpressions
Public Class DocumentProcessingResult
Public Property OriginalFile As String
Public Property OutputFile As String
Public Property WasSanitized As Boolean
Public Property TextRedactionsApplied As Integer
Public Property RegionRedactionsApplied As Integer
Public Property MetadataCleaned As Boolean
Public Property SensitiveDataTypesFound As List(Of String) = New List(Of String)()
Public Property ProcessedAt As DateTime
Public Property Success As Boolean
Public Property ErrorMessage As String
End Class
Public Class ComprehensiveDocumentProcessor
' Sensitive data patterns
Private ReadOnly _sensitivePatterns As Dictionary(Of String, String) = New Dictionary(Of String, String) From {
{"SSN", "\b\d{3}-\d{2}-\d{4}\b"},
{"Credit Card", "\b(?:\d{4}[-\s]?){3}\d{1,4}\b"},
{"Email", "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b"},
{"Phone", "\b(?:\(\d{3}\)\s?|\d{3}[-.])\d{3}[-.]?\d{4}\b"}
}
' Standard regions to redact (signature areas, photo locations)
Private ReadOnly _standardRedactionRegions As List(Of RectangleF) = New List(Of RectangleF) From {
New RectangleF(72, 72, 200, 50), ' Bottom left signature
New RectangleF(350, 72, 200, 50) ' Bottom right signature
}
Private ReadOnly _organizationName As String
Public Sub New(organizationName As String)
_organizationName = organizationName
End Sub
Public Function ProcessDocument(
inputPath As String,
outputPath As String,
Optional sanitize As Boolean = True,
Optional redactPatterns As Boolean = True,
Optional redactRegions As Boolean = True,
Optional cleanMetadata As Boolean = True,
Optional additionalTermsToRedact As List(Of String) = Nothing) As DocumentProcessingResult
Dim result As New DocumentProcessingResult With {
.OriginalFile = inputPath,
.OutputFile = outputPath,
.ProcessedAt = DateTime.Now
}
Try
' Load the document
Dim pdf As PdfDocument = PdfDocument.FromFile(inputPath)
' Step 1: Security scan
Dim scanResult As CleanerScanResult = Cleaner.ScanPdf(pdf)
If scanResult.IsDetected AndAlso scanResult.Risks.Count > 10 Then
Throw New SecurityException("Document contains too many security risks to process")
End If
' Step 2: Sanitization (if needed or requested)
If sanitize OrElse scanResult.IsDetected Then
pdf = Cleaner.SanitizeWithSvg(pdf)
result.WasSanitized = True
End If
' Step 3: Pattern-based text redaction
If redactPatterns Then
Dim fullText As String = pdf.ExtractAllText()
Dim valuesToRedact As New HashSet(Of String)()
For Each pattern In _sensitivePatterns
Dim regex As New Regex(pattern.Value, RegexOptions.IgnoreCase)
Dim matches As MatchCollection = regex.Matches(fullText)
If matches.Count > 0 Then
result.SensitiveDataTypesFound.Add($"{pattern.Key} ({matches.Count})")
For Each match As Match In matches
valuesToRedact.Add(match.Value)
Next
End If
Next
' Apply redactions
For Each value As String In valuesToRedact
pdf.RedactTextOnAllPages(value)
result.TextRedactionsApplied += 1
Next
End If
' Step 4: Additional specific terms
If additionalTermsToRedact IsNot Nothing Then
For Each term As String In additionalTermsToRedact
pdf.RedactTextOnAllPages(term)
result.TextRedactionsApplied += 1
Next
End If
' Step 5: Region-based redaction
If redactRegions Then
For Each region As RectangleF In _standardRedactionRegions
pdf.RedactRegionsOnAllPages(region)
result.RegionRedactionsApplied += 1
Next
End If
' Step 6: Metadata cleaning
If cleanMetadata Then
pdf.MetaData.Author = _organizationName
pdf.MetaData.Creator = $"{_organizationName} Document Processor"
pdf.MetaData.Producer = ""
pdf.MetaData.Subject = ""
pdf.MetaData.Keywords = ""
pdf.MetaData.CreationDate = DateTime.Now
pdf.MetaData.ModifiedDate = DateTime.Now
result.MetadataCleaned = True
End If
' Step 7: Save the processed document
pdf.SaveAs(outputPath)
result.Success = True
Catch ex As Exception
result.Success = False
result.ErrorMessage = ex.Message
End Try
Return result
End Function
End Class
' Usage example
Class Program
Shared Sub Main()
Dim processor As New ComprehensiveDocumentProcessor("Acme Corporation")
' Process a single document with all protections
Dim result = processor.ProcessDocument(
inputPath:="customer-application.pdf",
outputPath:="customer-application-redacted.pdf",
sanitize:=True,
redactPatterns:=True,
redactRegions:=True,
cleanMetadata:=True,
additionalTermsToRedact:=New List(Of String) From {"Project Alpha", "Internal Use Only"}
)
' Batch process multiple documents
Dim inputFiles As String() = Directory.GetFiles("incoming", "*.pdf")
For Each file As String In inputFiles
Dim outputFile As String = Path.Combine("processed", Path.GetFileName(file))
processor.ProcessDocument(file, outputFile)
Next
End Sub
End Class
Eingabe
Ein Kundenantragsformular, das mehrere Arten sensibler Daten enthält, darunter Sozialversicherungsnummern, Kreditkartennummern, E-Mail-Adressen und Unterschriftenblöcke, die umfassend geschützt werden müssen.
Musterausgabe
Dieser umfassende Prozessor fasst alle in diesem Handbuch behandelten Techniken in einer einzigen, konfigurierbaren Klasse zusammen. Es scannt nach Bedrohungen, bereinigt, wenn nötig, findet und entfernt sensible Muster, wendet regionale Korrekturen an, bereinigt Metadaten und erstellt detaillierte Berichte. Sie können die Empfindlichkeitsmuster, Schwärzungsbereiche und Verarbeitungsoptionen an Ihre spezifischen Anforderungen anpassen.
Nächste Schritte
Der Schutz sensibler Informationen in PDF-Dokumenten erfordert mehr als nur oberflächliche Maßnahmen. Bei einer echten Schwärzung wird der Inhalt dauerhaft aus der Dokumentstruktur entfernt. Musterabgleich automatisiert das Auffinden und Entfernen von Daten wie Sozialversicherungsnummern, Kreditkartendaten und E-Mail-Adressen. Die regionenbasierte Schwärzung behandelt Unterschriften, Fotos und andere grafische Elemente, die durch Textmatching nicht erfasst werden können. Bereinigung von Metadaten beseitigt versteckte Informationen, die Autoren, Zeitstempel oder interne Dateipfade verraten könnten. Sanitization entfernt eingebettete Skripte und aktive Inhalte, die ein Sicherheitsrisiko darstellen.
IronPDF bietet all diese Funktionen über eine konsistente, gut durchdachte API, die sich auf natürliche Weise in die C#- und .NET-Entwicklungspraktiken einfügt. Die in diesem Leitfaden vorgestellten Methoden können einzelne Dokumente bearbeiten oder auf Stapelverarbeitung von Tausenden von Dateien skalieren. Ganz gleich, ob Sie Compliance-Workflows für Daten aus dem Gesundheitswesen erstellen, juristische Dokumente für die Offenlegung vorbereiten oder einfach nur sicherstellen, dass interne Berichte sicher nach außen weitergegeben werden können, diese Techniken bilden die Grundlage für einen verantwortungsvollen Umgang mit Dokumenten. Für eine umfassende Sicherheitsabdeckung kombinieren Sie die Schwärzung mit Passwortschutz und Berechtigungen und digitalen Signaturen.
Bereit, loszulegen? IronPDF herunterladen und mit einer kostenlosen Testversion ausprobieren. Die Bibliothek enthält eine kostenlose Entwicklungslizenz, so dass Sie die Redigier-, Textextraktions- und Bereinigungsfunktionen ausgiebig testen können, bevor Sie sich für eine Produktionslizenz entscheiden. Wenn Sie Fragen zur Implementierung oder zu Compliance-Workflows haben, wenden Sie sich an unser technisches Support-Team.
Häufig gestellte Fragen
Was ist PDF-Redaktion?
Bei der PDF-Redaktion werden sensible Informationen dauerhaft aus einem PDF-Dokument entfernt. Dazu können Text, Bilder und Metadaten gehören, die aus Gründen des Datenschutzes oder der Einhaltung von Vorschriften unkenntlich gemacht werden müssen.
Wie kann ich mit C# Informationen in einer PDF-Datei schwärzen?
Mit IronPDF können Sie in C# Informationen in einer PDF-Datei zensieren. Damit können Sie Text, Bilder und Metadaten in PDF-Dokumenten dauerhaft entfernen oder ausblenden und sicherstellen, dass sie den Datenschutz- und Compliance-Standards entsprechen.
Warum ist die PDF-Redaktion für die Einhaltung von Vorschriften wichtig?
Die PDF-Redaktion ist entscheidend für die Einhaltung von Standards wie HIPAA, GDPR und PCI DSS, da sie dazu beiträgt, sensible Daten zu schützen und den unbefugten Zugriff auf vertrauliche Informationen zu verhindern.
Kann IronPDF ganze Bereiche einer PDF-Datei schwärzen?
Ja, IronPDF kann ganze Bereiche einer PDF-Datei schwärzen. Damit können Sie bestimmte Bereiche innerhalb eines Dokuments definieren, die aus Sicherheitsgründen ausgeblendet oder entfernt werden müssen.
Welche Arten von Daten können mit IronPDF geschwärzt werden?
IronPDF ist in der Lage, verschiedene Datentypen wie Text, Bilder und Metadaten aus PDF-Dokumenten zu entfernen und so einen umfassenden Datenschutz und Sicherheit zu gewährleisten.
Unterstützt IronPDF die Bereinigung von Dokumenten?
Ja, IronPDF unterstützt die Bereinigung von Dokumenten, d. h. das Entfernen von versteckten Daten oder Metadaten, die zwar nicht sichtbar sind, aber dennoch ein Risiko für die Privatsphäre darstellen könnten.
Ist es möglich, die PDF-Redaktion mit IronPDF zu automatisieren?
Ja, IronPDF ermöglicht die Automatisierung von PDF-Redaktionsprozessen in C# und erleichtert so den Umgang mit großen Mengen von Dokumenten, aus denen sensible Daten entfernt werden müssen.
Wie stellt IronPDF die Dauerhaftigkeit der Schwärzung sicher?
IronPDF stellt die Dauerhaftigkeit der Schwärzung sicher, indem es den ausgewählten Text und die Bilder dauerhaft aus dem Dokument entfernt, anstatt sie nur unkenntlich zu machen, was bedeutet, dass sie nicht wiederhergestellt oder angezeigt werden können.
Kann IronPDF Metadaten in einer PDF-Datei schwärzen?
Ja, IronPDF kann Metadaten in einem PDF-Dokument redigieren und so sicherstellen, dass alle Formen von sensiblen Daten, einschließlich versteckter oder im Hintergrund befindlicher Daten, gründlich entfernt werden.
Welche Vorteile bietet die Verwendung von IronPDF für die PDF-Redaktion?
Die Verwendung von IronPDF für die PDF-Redaktion bietet Vorteile wie die Einhaltung von Datenschutzbestimmungen, die Verbesserung der Dokumentensicherheit und die Bereitstellung eines effizienten, automatisierten Prozesses für die Verwaltung sensibler Informationen.
Curtis Chau hat einen Bachelor-Abschluss in Informatik von der Carleton University und ist spezialisiert auf Frontend-Entwicklung mit Expertise in Node.js, TypeScript, JavaScript und React. Leidenschaftlich widmet er sich der Erstellung intuitiver und ästhetisch ansprechender Benutzerschnittstellen und arbeitet gerne mit modernen Frameworks sowie der Erstellung gut strukturierter, optisch ansprechender Handbücher.