PDF Redaction in C#: Remove Sensitive Data and Sanitize Documents with IronPDF
IronPDF ile PDF karartma işlemi, bir belgenin iç yapısındaki hassas içeriği kalıcı olarak kaldırır, sadece görsel olarak örtmekle kalmaz, böylece kopyalama, arama veya adli analiz yoluyla orijinal verilerin geri alınması imkansız hale gelir. Bu, sadece metin üzerindeki siyah dikdörtgenleri çok daha öteye taşır: IronPDF, düzenli ifade deseni eşleştirme ile metin karartma, imzalar ve resimler için bölge tabanlı karartma, metadata sıyırma, gömülü betikleri yok etmek için belge temizleme ve güvenli boşluk tarama sağlayarak .NET geliştiricileri için HIPAA, GDPR ve PCI DSS uyumlu belge koruma iş akışları için kapsamlı bir araç seti sunar.
Kısa-Özet: Hızlı Başlangıç Kılavuzu
Bu kılavuz, C# .NET'de PDF belgelerinden kalıcı olarak hassas içeriği kaldırmayı kapsar, metin desenleri, resim bölgeleri, metadata ve gömülü betikler.
- Kimler için: Sağlık, hukuk, mali veya hükümet bağlamlarında hassas belgeleri ele alan .NET geliştiricileri.
- Neler Oluşturacaksınız: Metin karartma için regex desen eşleştirme (SSN'ler, kredi kartları, e-postalar), imzalar ve fotoğraflar için koordinat tabanlı bölge karartma, metadata temizliği, gömülü betikleri sıyırmak için PDF temizlemesi ve YARA tabanlı güvenlik açığı tarama.
- Nerede çalışır: .NET 10, .NET 8 LTS, .NET Framework 4.6.2+ ve .NET Standard 2.0. Tüm işlemler yerel olarak, dış bağımlılık olmadan çalışır.
- Bu yaklaşımı ne zaman kullanmalısınız: Yasal keşif, FOIA istekleri veya dış dağıtım için belgeleri paylaşmanız gerektiğinde ve kaldırılan içeriğin gerçekten kaldırıldığını sağlayacak güvenceleri aradığınızda.
- Teknik olarak neden önemlidir: Görsel üst kaplamalar, PDF'nin içerik akışlarında orijinal metni geri kazanılabilir bırakır. IronPDF'in karartması, belge yapısının kendisinden karakter verilerini siler, geri almayı imkansız hale getirir.
Sadece birkaç satır kodla bir PDF'den hassas metinleri çıkarın:
-
IronPDF aşağıdaki NuGet Paket Yöneticisi ile yükleyin
PM > Install-Package IronPdf -
Bu kod parçacığını kopyalayın ve çalıştırın.
using IronPdf; PdfDocument pdf = PdfDocument.FromFile("confidential-report.pdf"); pdf.RedactTextOnAllPages("CONFIDENTIAL"); pdf.SaveAs("redacted-report.pdf"); -
Canlı ortamınızda test için dağıtım yapın
Ücretsiz deneme ile bugün projenizde IronPDF kullanmaya başlayın
IronPDF'yi satın aldıktan veya 30 günlük denemeye kaydolduktan sonra, başvurunuzda lisans anahtarınızı ekleyin.
IronPdf.License.LicenseKey = "KEY";
IronPdf.License.LicenseKey = "KEY";
Imports IronPdf
IronPdf.License.LicenseKey = "KEY"
Bugün IronPDF ile projenizde ücretsiz bir deneme ile başlayın.
İçindekiler
- Özet: Hızlı Başlangıç Kılavuzu
- PDF Belgelerinden Metni Karartma
- Desen Eşleştirme ve Otomatik Karartma
- Bölge Tabanlı Karartma
- PDF Metadata'dan Hassas Verileri Kaldırma
- .NET'de PDF Temizleme
- Komple İş Akışları
- Komple Bir Redaksiyon ve Temizleme Süreci Nasıl Oluşturabilirim?
- Sonraki Adımlar
Gerçek Redaksiyon ile Görsel Örtü Arasındaki Fark Nedir?
Gerçek redaksiyon ile görsel örtü arasındaki farkı anlamak, hassas belgelerle uğraşan herkes için kritiktir. Birçok araç ve manuel yöntem, veri altındaki bilgileri gerçekten kaldırmadan redaksiyon görünümü oluşturur. Bu sahte güvenlik duygusu, çok sayıda yüksek profilli veri ihlaline ve uyum başarısızlıklarına neden olmuştur.
Görsel örtü yaklaşımları tipik olarak hassas içerik üzerine opak şekiller çizmektedir. Metin, PDF yapısı içinde tamamen bozulmadan kalır. Belgeyi görüntüleyen biri siyah bir dikdörtgen görür, ancak orijinal karakterler dosya içeriği akışlarında hala mevcuttur. Sayfadaki tüm metni seçmek, erişilebilirlik araçlarını kullanmak veya ham PDF verilerini incelemek, sözde gizlenmiş olan her şeyi ortaya çıkarır. Dava dosyaları, karşıt avukatın basitçe redakte etmesiyle zayıflatılmıştır. Hükümet kurumları yanlışlıkla sansürlü görünen ancak tamamen kurtarılabilir olan sınıflandırılmış bilgileri yayımlamıştır.
Gerçek redaksiyon farklı çalışır. IronPDF'nin redaksiyon yöntemlerini kullandığınızda, kütüphane, PDF'nin iç yapısındaki belirli metni bulur ve tamamıyla kaldırır. Karakter verileri içerik akışlarından silinir. Görsel temsili bir redaksiyon işareti ile değiştirilir, genellikle siyah bir dikdörtgen, ancak orijinal içerik dosyanın hiçbir yerinde artık mevcut değildir. Herhangi bir seçme, kopyalama veya adli analiz, kalıcı olarak silinmiş olanı geri getiremez.
IronPDF, PDF'yi yapısal düzeyde değiştirerek gerçek redaksiyon uygular. RedactTextOnAllPages yöntemi ve varyantları, sayfa içeriğini tarar, eşleşen metni belirler, onu belge nesne modelinden kaldırır ve isteğe bağlı olarak içeriğin bulunduğu yere görsel bir gösterge çizer. Bu yaklaşım, güvenli belge redaksiyonu için NIST gibi kuruluşların kılavuzlarıyla uyumludur.
Pratik sonuçlar çok büyüktür. Belgeleri harici olarak paylaşmanız, yasal keşif için dosya teslim etmeniz, bilgi edinme hakkı istekleri altında kayıtlar yayımlamanız veya kişisel kimlik bilgilerini korurken raporları dağıtmanız gerektiğinde, yalnızca gerçek redaksiyon yeterli koruma sağlar. Görsel örtüler, belirli bölümlerden dikkat çekmek istediğiniz iç taslaklar için yeterli olabilir, ancak gerçek veri koruması için asla güvenilmemelidir. Ek belge güvenlik önlemleri için, PDF'lerin şifrelenmesine ve dijital imzalar konusundaki rehberlerimize bakın.
How do I Redact PDF Text in C# Across an Entire Document?
En yaygın redaksiyon senaryosu, belirli bir metnin bir belge boyunca tüm örneklerinin kaldırılmasını içerir. Belki bir kişinin adını bir rapordan çıkarmanız, mali tablolardan hesap numaralarını kaldırmanız veya harici dağıtım öncesi dahili referans kodlarını ortadan kaldırmanız gerekiyor. IronPDF, RedactTextOnAllPages yöntemi ile bunu kolaylaştırır.
Girdi
Kişisel bilgileri içeren, adları, Sosyal Güvenlik numaralarını ve çalışan kimlik numaralarını içeren bir çalışan kayıt belgesi.
:path=/static-assets/pdf/content-code-examples/tutorials/pdf-redaction-csharp/redact-text-all-pages.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");
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")
Bu kod, çalışan bilgilerini içeren bir PDF dosyasını yükler ve her değer için RedactTextOnAllPages çağrısı yaparak üç adet gizli veriyi kaldırır. Her çağrı, belgedeki her sayfayı tarar ve çalışanın adı, Sosyal Güvenlik numarası ve dahili tanımlayıcının tüm eşleşen örneklerini kalıcı olarak kaldırır.
Örnek Çıktı
Varsayılan davranış, redakte edilen metnin göründüğü yere siyah dikdörtgenler çizer ve gerçek karakterlerin yerine belge yapısında yıldız işaretleri koyar. Bu hem redaksiyonun gerçekleştiğinin görsel onayını sağlar hem de orijinal içeriğin tamamen kaybolmasını sağlar.
Daha uzun belgelerle veya birden fazla redaksiyon hedefiyle çalışırken, bu çağrıları verimli bir şekilde zincirleyebilirsiniz:
:path=/static-assets/pdf/content-code-examples/tutorials/pdf-redaction-csharp/redact-text-list.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");
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")
Bu model, kaldırılması gereken bilinen bir hassas değer listesine sahip olduğunuzda iyi çalışır. Belge bir kez yüklenir, tüm redaksiyonlar bellek içinde uygulanır ve nihai sonuç kaydedilir. Her terim bağımsız olarak işlenir, bu nedenle terimler arasındaki kısmi eşleşmeler veya biçimlendirme farklılıkları diğer redaksiyonları etkilemez.
Yalnızca Belirli Sayfalardaki Metni Nasıl Redakte Edebilirim?
Bazen redaksiyonların nerede gerçekleştiği üzerinde daha hassas kontrol gerekir. Bir belge, bilgi taşıyan ve bozulmadan kalması gereken bir kapak sayfasına sahip olabilir veya gizli verilerin yalnızca belirli bölümlerde göründüğünü biliyor olabilirsiniz. IronPDF, tek sayfa redaksiyonu için RedactTextOnPage ve birden fazla belirli sayfayı hedeflemek için RedactTextOnPages sunar.
Girdi
Birden fazla sayfalı bir sözleşme demeti, imza sayfasında müşteri adları ve belgede belirli sayfalarda görünen mali terimler.
:path=/static-assets/pdf/content-code-examples/tutorials/pdf-redaction-csharp/redact-specific-pages.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");
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")
Bu kod, tek bir sayfa için RedactTextOnPage ve birden fazla belirli sayfa için RedactTextOnPages kullanarak hedefli redaksiyonu göstermektedir. Müşteri adı yalnızca sayfa 1'den (indeks 0) kaldırılırken, ödeme koşulları sayfa 3, 5 ve 7'den (indeksler 2, 4, 6) redakte edilir, diğer tüm sayfalar dokunulmadan bırakılır.
Örnek Çıktı
IronPDF'teki sayfa indeksleri sıfır tabanlıdır, yani ilk sayfa indeks 0, ikinci indeks 1 ve bu şekilde devam eder. Bu, standart programlama kurallarıyla da uyuşur ve çoğu geliştiricinin dizi erişimi hakkında düşündüğü şeye uygun hale gelir.
Büyük belgeleri işlerken belirli sayfaları hedeflemek, performansı artırır. Yalnızca birkaç konumda görünen metin için yüzlerce sayfa taramak yerine, redaksiyon motorunu tam olarak nerede arayacağını yönlendirebilirsiniz. Bu, binlerce belgeyle uğraşabileceğiniz toplu işlem senaryolarında önemlidir. Maksimum verim elde etmek için tezgah ve çoklu iş parçacığı tekniklerini kullanmayı düşünün.
:path=/static-assets/pdf/content-code-examples/tutorials/pdf-redaction-csharp/redact-large-document.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");
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")
Bu hedefli yaklaşım, 500 sayfalık bir belgenin yalnızca ilgili bölümlerini işler, her redaksiyon terimi için her sayfayı taramaya kıyasla yürütme süresini önemli ölçüde azaltır.
Redakte Edilen İçeriğin Görünümünü Nasıl Özelleştirebilirim?
IronPDF, redaksiyonların son belgede nasıl görüneceğini kontrol etmek için çeşitli parametreler sunar. Büyük/küçük harf duyarlılığını, tam kelime eşleşmesini, görsel dikdörtgenler çizmeyi ve redakte edilen içeriğin yerine hangi metnin görüneceğini ayarlayabilirsiniz.
Girdi
Sınıflandırma etiketleri, şifreler ve farklı redaksiyon işlemleri gerektiren dahili referans kodları dahil olmak üzere çeşitli hassas terimler içeren bir yasal dosya.
:path=/static-assets/pdf/content-code-examples/tutorials/pdf-redaction-csharp/customize-redaction-appearance.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");
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")
Bu kod, RedactTextOnAllPages isteğe bağlı parametrelerini kullanarak dört farklı redaksiyon yapılandırmasını göstermektedir. Büyük/küçük harf duyarlı tam eşleşme ile "[REDACTED]" değişimi, yıldız işaretleriyle büyük/küçük harf duyarsız eşleşme, "şifreler" gibi varyasyonları yakalamak için kısmi kelime eşleşmesi ve naif kalan içerik temizlemek için görsel dikdörtgenler olmadan görünmez kaldırımı gösterir.
Örnek Çıktı
Parametreler, gereksinimlerinize bağlı olarak farklı amaçlara hizmet eder:
CaseSensitive, eşleşmede harf büyük/küçük yazımının dikkate alınıp alınmayacağını belirler. Yasal belgeler genellikle anlam taşıyan belirli büyük harf kullanımlarını içerir, bu yüzden büyük/küçük harf duyarlı eşleştirme, yalnızca tam eşleşmeleri kaldırmanızı sağlar. Genel metin işleme sırasında harf değişikliği olabilen durumlar için, tüm örnekleri yakalamak amacıyla büyük/küçük harf duyarlı olmayan eşleştirme gerekebilir.
OnlyMatchWholeWords, aramanın tam WORDlerle mi yoksa kısmi dizelerle mi eşleşeceğini kontrol eder. İsimleri redakte ederken, genellikle "Smith"in "Blacksmith" veya "Smithfield"'in bir bölümünü kazara redakte etmemesi için tam kelime eşleşmesini istersiniz. Hesap numarası önekleri gibi kalıpları redakte ederken, varyasyonları yakalamak için kısmi eşleşme gerekebilir.
DrawRectangles, içeriğin kaldırıldığı yerlerde siyah kutuların görünip görünmeyeceğini belirtir. Çoğu düzenleyici ve yasal bağlam, içeriğin kasten kaldırıldığına dair kanıt olarak görünen redaksiyon işaretlerini gerektirir. Dahili iş akışları ise daha temiz bir çıktı için görünmez kaldırmayı tercih edebilir.
ReplacementText, sansürlenmiş içeriğin yerine hangi karakterlerin görüneceğini tanımlar. Yaygın seçimler arasında yıldız işaretleri, "REDACTED" etiketleri veya boş dizgiler bulunur. Birisi redakte edilen alanı seçmeye veya kopyalamaya çalışırsa, yer değiştirme metni belge yapısında görünür.
Hassas Kalıpları Bulmak ve Redakte Etmek için Düzenli İfadeleri Nasıl Kullanabilirim?
Bilinen metin dizgilerini redakte etmek, çıkarılması için belirli değerleriniz olduğunda işe yarar, ancak birçok gizli veri türü, belirli değerler yerine öngörülebilir kalıpları izler. Sosyal Güvenlik numaraları, kredi kartı numaraları, e-posta adresleri, telefon numaraları ve tarihler, düzenli ifadelerle eşleşebilecek tanınabilir biçimlere sahiptir. Model tabanlı bir redaksiyon sistemi oluşturmak, her bir belirli değeri önceden bilmeden PDF içeriğinden özel bilgileri kaldırmanıza izin verir.
IronPDF'nin metin çıkarma yetenekleri ile redaksiyon yöntemleri güçlü kalıp eşleme iş akışlarını mümkün kılar. Metni çıkarır, .NET düzenli ifadelerini kullanarak eşleşmeleri tanımlar ve ardından bulunan her değeri redakte edersiniz.
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"
);
}
}
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"
);
}
}
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
Bu model tabanlı yaklaşım iyi ölçeklenir çünkü desenleri bir kez tanımlar ve herhangi bir belgeye uygularsınız. Yeni veri türleri eklemek sadece sözlüğe yeni regex kalıpları eklemeyi gerektirir.
Yeniden Kullanılabilir Hassas Veri Tarayıcı Nasıl Kurabilirim?
Üretim ortamları için belgeleri taramanıza ve redaksiyon yapılması gerekip gerekmediğine karar vermeden önce hangi gizli bilgilerin mevcut olduğunu rapor etmenize sıklıkla ihtiyaç duyarsınız. Bu, uyum denetlemesi ile yardımcı olur ve redaksiyon kararlarının insan incelemesine olanak tanır. Aşağıdaki sınıf, redaksiyonla birlikte tarama yetenekleri sunar.
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");
}
}
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");
}
}
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
Tarayıcı, herhangi bir değişiklik oluşmadan önce hangi gizli bilgilerin mevcut olduğunu görmenizi sağlar. Bu, bulguların ve kaldırılanların belgelenmesi gereken uyum iş akışlarını destekler. Maskeleme işlevi, günlük dosyalarının ve raporların kendilerinin veri açığı kaynakları olmamasını sağlar.
Bir PDF'de Belirli Bölgeleri veya Alanları Nasıl Redakte Edebilirim?
Metin redaksiyonu, karakter tabanlı içeriği etkili bir şekilde işler, ancak PDF'ler genellikle metin eşleştirme ile adreslenemeyen formlar halinde hassas bilgiler içerir. İmzalar, fotoğraflar, el yazısı notlar, damgalar ve grafik öğeler farklı bir yaklaşım gerektirir. Bölge tabanlı redaksiyon, koordinatlarıyla dikdörtgen alanları belirtmenize ve bu sınırlar içindeki her şeyi kalıcı olarak örtmenize izin verir.
IronPDF, redaksiyon bölgelerini tanımlamak için RectangleF yapısını kullanır. Üst sol köşenin X ve Y koordinatlarını, ardından alanın genişlik ve yüksekliğini belirtirsiniz. Koordinatlar, sayfanın sol altından, PDF gerekliliklerinin koordinat sistemiyle eşleşecek şekilde ölçülür.
Girdi
El yazısıyla imzalar ve kimlik fotoğrafı içeren bir anlaşma belgesi, koordinat tabanlı bölge hedefleme kullanılarak redakte edilmesi gerekmektedir.
:path=/static-assets/pdf/content-code-examples/tutorials/pdf-redaction-csharp/redact-region-basic.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");
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")
Bu kod, sansürlenecek dikdörtgen alanları tanımlamak için RectangleF yapılarını kullanır. İmza bölgesi, (100, 650) koordinatlarında 200x50 piksel alanda yerleştirilirken, fotoğraf bölgesi (450, 700) koordinatlarında 100x120 piksel alanda yer almaktadır. RedactRegionsOnAllPages yöntemi, tüm sayfalarda bu bölgelere siyah dikdörtgenler uygular.
Örnek Çıktı
Doğru koordinatları belirlemek genellikle biraz deneme veya ölçüm gerektirebilir. PDF sayfaları genellikle bir noktanın, bir inçin 1/72'si olduğu bir koordinat sistemi kullanır. Standart bir ABD Mektup sayfası 612 puan genişliğinde ve 792 puan uzunluğundadır. A4 sayfaları yaklaşık olarak 595'e 842 puandır. PDF görüntüleme araçları, imleçle hareket ettikçe koordinatları gösteren, yardımcı olabilir veya sayfa boyutlarını programatik olarak çıkarabilirsiniz:
:path=/static-assets/pdf/content-code-examples/tutorials/pdf-redaction-csharp/redact-region-dimensions.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");
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")
Farklı Sayfalardaki Çoklu Bölgeleri Nasıl Redakte Edebilirim?
Karmaşık belgeler genellikle farklı sayfalarda farklı bölgelerin redakte edilmesini gerektirir. Çok sayfalı bir formda imza çizgileri farklı konumlarda olabilir veya farklı sayfalarda fotoğraflar, damgalar veya diğer grafiksel öğeler özgün yerlerde olabilir. IronPDF tarafında, hedefli bölge redaksiyonu için sayfa özelinde yöntemler bulunmaktadır.
:path=/static-assets/pdf/content-code-examples/tutorials/pdf-redaction-csharp/redact-multiple-regions.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");
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")
Tutarlı düzenlere sahip belgeler, yeniden kullanılabilir bölge tanımlamalarından yararlanır:
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");
}
}
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");
}
}
Imports IronPdf
Imports IronSoftware.Drawing
Public Class FormRegions
' Standard form regions based on common templates
Public Shared ReadOnly Property HeaderLogo As RectangleF
Get
Return New RectangleF(20, 720, 150, 60)
End Get
End Property
Public Shared ReadOnly Property SignatureBlock As RectangleF
Get
Return New RectangleF(72, 72, 200, 50)
End Get
End Property
Public Shared ReadOnly Property DateField As RectangleF
Get
Return New RectangleF(400, 72, 120, 20)
End Get
End Property
Public Shared ReadOnly Property PhotoId As RectangleF
Get
Return New RectangleF(480, 650, 100, 130)
End Get
End Property
Public Shared ReadOnly Property AddressBlock As RectangleF
Get
Return New RectangleF(72, 600, 250, 80)
End Get
End Property
End Class
Module Program
Sub Main()
Dim pdf As PdfDocument = 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")
End Sub
End Module
Gizli Bilgiyi Açığa Çıkarabilecek Metadata Nasıl Kaldırılır?
PDF meta verileri, genellikle gözden kaçan bir bilgi sızıntısı kaynağını temsil eder. Her PDF, hassas ayrıntıları ortaya çıkarabilecek özellikler taşır: belgenin yazarı ve kullanıcı adı, belgeyi oluşturmak için kullanılan yazılım, oluşturulma ve değiştirilme zaman damgaları, orijinal dosya adı, revizyon geçmişi ve çeşitli uygulamalar tarafından eklenen özel özellikler. Belgeleri harici olarak paylaşmadan önce, bu meta veriyi çıkarmak veya temizlemek hayati önem taşır. Meta veri işlemlerinin kapsamlı bir özeti için meta veri nasıl yapılır kılavuzumuza bakın.
IronPDF, MetaData özelliği aracılığıyla belge meta verilerini ortaya çıkarır ve mevcut değerleri okumanıza, değiştirmenize veya tamamen kaldırmanıza olanak tanır.
:path=/static-assets/pdf/content-code-examples/tutorials/pdf-redaction-csharp/view-metadata.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();
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()
Dağıtmadan önce gizli metaverileri çıkarmak amacıyla:
Girdi
Yazar adları, oluşturulma zaman damgaları ve çeşitli uygulamalar tarafından eklenen özel özellikler gibi gömülü metaveri içeren bir dahili memo.
:path=/static-assets/pdf/content-code-examples/tutorials/pdf-redaction-csharp/remove-metadata.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");
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")
Bu kod, kimlik belirleyen metaveri alanlarını genel değerlerle değiştirir, zaman damgalarını geçerli tarih için normalleştirir ve uygulamaların eklemiş olabileceği özel deniklendirme anahtarlarını kaldırır. RemoveMetaDataKey yöntemi, "OriginalFilename" ve "LastSavedBy" gibi iç bilgileri açığa çıkarabilecek belirli özellikleri hedefler.
Örnek Çıktı
Toplu işlemler için kapsamlı meta veri temizleme, sistematik bir yaklaşım gerektirir:
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");
}
}
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");
}
}
Imports IronPdf
Imports System
Imports System.Collections.Generic
Public Class MetadataCleaner
Private ReadOnly _defaultAuthor As String
Private ReadOnly _defaultCreator As String
Public Sub New(organizationName As String)
_defaultAuthor = organizationName
_defaultCreator = $"{organizationName} Document System"
End Sub
Public Sub CleanMetadata(pdf As PdfDocument)
' Replace standard metadata fields
pdf.MetaData.Author = _defaultAuthor
pdf.MetaData.Creator = _defaultCreator
pdf.MetaData.Producer = ""
pdf.MetaData.Subject = ""
pdf.MetaData.Keywords = ""
' Normalize timestamps
Dim now As DateTime = DateTime.Now
pdf.MetaData.CreationDate = now
pdf.MetaData.ModifiedDate = now
' Get all keys and remove potentially sensitive ones
Dim keysToRemove As New List(Of String)()
For Each key As String In pdf.MetaData.Keys()
' Keep only essential keys
If Not IsEssentialKey(key) Then
keysToRemove.Add(key)
End If
Next
For Each key As String In keysToRemove
pdf.MetaData.RemoveMetaDataKey(key)
Next
End Sub
Private Function IsEssentialKey(key As String) As Boolean
' Keep only the basic display properties
Dim essentialKeys As String() = {"Title", "Author", "CreationDate", "ModifiedDate"}
For Each essential As String In essentialKeys
If key.Equals(essential, StringComparison.OrdinalIgnoreCase) Then
Return True
End If
Next
Return False
End Function
End Class
' Usage
Class Program
Shared Sub Main()
Dim cleaner As New MetadataCleaner("Acme Corporation")
Dim pdf As PdfDocument = PdfDocument.FromFile("report.pdf")
cleaner.CleanMetadata(pdf)
pdf.SaveAs("report-clean.pdf")
End Sub
End Class
Emdirilmiş Skriptler ve Gizli Tehditleri Kaldırmak İçin PDF Nasıl Temizlenir?
PDF temizleme, görünen içerik ve meta verilerin ötesine geçen güvenlik kaygılarını ele alır. PDF dosyaları JavaScript kodu, gömülü yürütülebilir dosyalar, harici bağlantıları tetikleyen form eylemleri ve diğer potansiyel zararlı öğeler içerebilir. Bu beceriler, etkileşimli formlar ve multimedya içerikler gibi yasal amaçlar için mevcuttur, ancak aynı zamanda saldırı vektörleri oluştururlar. Temizleme, PDF'nin bu aktif öğelerini kaldırırken görsel içeriği korur. Temizleme yöntemleriyle ilgili ek ayrıntılar için PDF nasıl temizlenir kılavuzumuza bakın.
IronPDF'nin Cleaner sınıfı, PDF'yi bir görüntü formatına dönüştürerek ve ardından tekrar geri dönüştürerek, zararlı verileri temizleme işlemini zarif bir yaklaşımla gerçekleştirir. Bu işlem, JavaScript'i, gömülü nesneleri, form eylemlerini ve ek notları çıkarırken görsel görünümü bozulmadan tutar. Kütüphane, farklı özelliklere sahip iki temizleme yöntemi sunar.
Girdi
Bir dış kaynaktan alınan PDF belgesi, JavaScript, gömülü nesneler veya başka potansiyel olarak zararlı aktif içerik içerebilir.
:path=/static-assets/pdf/content-code-examples/tutorials/pdf-redaction-csharp/sanitize-pdf.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");
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")
Bu kod, IronPDF'nin Cleaner sınıfı tarafından sağlanan iki temizleme yöntemini göstermektedir. SanitizeWithSvg, PDF'yi SVG ara formatına dönüştürür, aranabilir metni korurken aktif içeriği kaldırır. SanitizeWithBitmap, sayfaları önce görüntülere dönüştürür ve tam görsel kopyalar üretir, ancak metinler aranamaz grafikler olarak görüntülenir.
Örnek Çıktı
SVG yöntemi daha hızlı çalışır ve metni aranabilir içerik olarak korur, bu da belgelerin indekslenmesi veya erişilebilir kalması gerektiğinde uygun hale getirir. Bitmap yöntemi tam görsel kopyalar üretir, ancak metni görüntülere dönüştürür, bu da metin seçimini ve aramayı engeller. Çıkış belgesi için gereksinimlerinize bağlı olarak seçim yapın.
Temizleme sırasında çıkış seçeneklerini ayarlamak için görüntüleme seçeneklerini de uygulayabilirsiniz:
:path=/static-assets/pdf/content-code-examples/tutorials/pdf-redaction-csharp/sanitize-with-options.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");
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")
Yüksek güvenlikli ortamlar genellikle temizleme işlemini diğer koruyucu önlemlerle birleştirmeyi gerektirir:
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");
}
}
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");
}
}
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
Bir PDF'yi Güvenlik Açıkları için Nasıl Tararım?
Belgeleri işlemeye veya temizlemeye başlamadan önce hangi potansiyel tehditleri içerdiğini değerlendirmek isteyebilirsiniz. IronPDF'nin Cleaner.ScanPdf yöntemi, kötü amaçlı yazılım analizi ve tehdit algılamada yaygın olarak kullanılan desen tanımları olan YARA kurallarını kullanarak belgeleri inceler. Tarama, zararlı PDF dosyalarıyla ilişkili özellikleri tanımlar.
:path=/static-assets/pdf/content-code-examples/tutorials/pdf-redaction-csharp/scan-vulnerabilities.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");
}
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
Özel tespit gereksinimleri için özel YARA kural dosyaları sağlayabilirsiniz. Belirli tehdit modelleri veya uyum ihtiyaçları olan kuruluşlar, genellikle belirli zafiyet kalıplarını hedefleyen kendi kural dizilerini korur.
:path=/static-assets/pdf/content-code-examples/tutorials/pdf-redaction-csharp/scan-custom-yara.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");
}
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
Belge alma iş akışlarına tarama entegrasyonu, güvenlik kararlarını otomatikleştirmeye yardımcı olur:
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");
}
}
}
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");
}
}
}
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
Komple Bir Redaksiyon ve Temizleme Süreci Nasıl Oluşturabilirim?
Üretim belge işlemesi genellikle birçok koruma tekniğini uyumlu bir iş akışına birleştirmeyi gerektirir. Komple bir süreç, gelen belgeleri tehditler açısından tarayabilir, başlangıç taramasını geçenleri temizleyebilir, metin ve bölge redaksiyonu uygulayabilir, meta verileri temizleyebilir ve yapılan tüm işlemleri belgeleyen denetim günlükleri üretebilir. Bu örnek, böyle bir tümleşik yaklaşımı göstermektedir.
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);
}
}
}
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);
}
}
}
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
Girdi
Bir müşteri başvuru formu, SSN'ler, kredi kartı numaraları, e-posta adresleri ve imza blokları dahil olmak üzere çeşitli hassas veri türlerini içermektedir ve kapsamlı koruma gerektirir.
Örnek Çıktı
Bu kapsamlı işlemci, bu kılavuzda ele alınan tüm teknikleri tek, yapılandırılabilir bir sınıfta birleştirir. Tehditleri tarar, gerekirse temizler, hassas kalıpları bulur ve redakte eder, bölge redaksiyonu uygular, meta verileri temizler ve ayrıntılı raporlar üretir. Özelleştirilebilir duyarlılık kalıplarını, redaksiyon bölgelerini ve işleme seçeneklerini, özel gereksinimlerinizle eşleşecek şekilde ayarlayabilirsiniz.
Sonraki Adımlar
PDF belgelerinde hassas bilgileri korumak, yüzeysel önlemlerden daha fazlasını gerektirir. Gerçek redaksiyon, belge yapısından içeriği kalıcı olarak siler. Kalıp Eşleme, Sosyal Güvenlik numaraları, kredi kartı bilgileri ve e-posta adresleri gibi verilerin keşfini ve kaldırılmasını otomatikleştirir. Bölge tabanlı redaksiyon, metin eşleme ile ele alınamayan imzalar, fotoğraflar ve diğer grafik öğeleri işler. Meta veri temizliği, yazarları, zaman damgalarını veya dahili dosya yollarını açığa çıkarabilecek gizli bilgileri yok eder. Temizleme, güvenlik riskleri oluşturan gömülü skriptleri ve aktif içerikleri çıkarır.
IronPDF, C# ve .NET geliştirme uygulamalarıyla doğal olarak bütünleşen, tutarlı, iyi tasarlanmış bir API aracılığıyla bu yeteneklerin tümünü sunar. Bu kılavuzda gösterilen yöntemler, binlerce dosyayı toplu işlemeye ölçeklendirebilir. İster sağlık verileri için uyum iş akışları kuruyor olun, ister hukuki belgeleri keşif için hazırlıyor olun, isterse de iç raporlarınızın güvenli bir şekilde paylaşılmasını sağlamak istiyor olun, bu teknikler sorumlu belge işleme temelini oluşturur. Kapsamlı güvenlik kapsaması için redaksiyonu şifre koruması ve izinleri ve dijital imzalar ile birleştirin.
İşe başlamaya hazır mısınız? IronPDF'i İndirin ve ücretsiz bir deneme ile deneyin. Kütüphane, ücretsiz bir geliştirme lisansı içerdiğinden, redaksiyon, metin çıkarma ve temizleme özelliklerini üretime yönelik bir lisansa geçmeden önce tam olarak değerlendirebilirsiniz. Uygulama veya uyum iş akışları hakkında sorularınız varsa, mühendislik destek ekibimize ulaşın.
Sıkça Sorulan Sorular
PDF düzenleme nedir?
PDF düzenleme, bir PDF belgesinden hassas bilgilerin kalıcı olarak kaldırılması işlemidir. Bu, gizlilik veya uyumluluk nedenleriyle gizlenmesi gereken metin, görüntüler ve meta verileri içerebilir.
C# kullanarak bir PDF'de bilgiyi nasıl düzenleyebilirim?
C# kullanarak bir PDF'de bilgiyi düzenlemek için IronPDF kullanabilirsiniz. Bu, PDF belgelerinizdeki metni, görüntüleri ve meta verileri kalıcı olarak kaldırmanıza veya gizlemenize olanak tanıyarak gizlilik ve uyumluluk standartlarına uymasını sağlar.
Uyumluluk için PDF düzenleme neden önemlidir?
PDF düzenleme, hassas verileri güvence altına alarak ve gizli bilgilere yetkisiz erişimi önleyerek HIPAA, GDPR ve PCI DSS gibi standartlarla uyum sağlamak için kritik önem taşır.
IronPDF bir PDF'nin tüm bölgelerini düzenleyebilir mi?
Evet, IronPDF bir PDF'nin tüm bölgelerini düzenleyebilir. Bu, güvenlik amaçları için belge içindeki spesifik alanları tanımlamanıza olanak tanır.
IronPDF ile hangi tür veriler düzenlenebilir?
IronPDF, PDF belgelerinden metin, görüntü ve meta veriler dahil çeşitli veri türlerini düzenleyebilir, böylece kapsamlı veri gizliliği ve güvenliği sağlar.
IronPDF belgeleri temizlemeyi destekliyor mu?
Evet, IronPDF, görünmeyebilir ancak gizlilik riski taşıyan gizli veri veya meta verileri kaldırarak belgeleri temizlemeyi destekler.
IronPDF ile PDF düzenleme otomasyonu mümkün mü?
Evet, IronPDF, belgelerin çok büyük miktarlarının hassas veri kaldırmayı gerektirdiği durumlarda PDF düzenleme süreçlerini C# içinde otomatikleştirmeyi mümkün kılar.
IronPDF düzenlemenin kalıcılığını nasıl sağlar?
IronPDF, seçilmiş metin ve görüntüleri belgeden kalıcı olarak çıkararak, yalnızca görünmez hale getirmek yerine tamamen kaldırarak geri erişilemeyecek veya görüntülenemeyecek şekilde düzenlemenin kalıcılığını sağlar.
IronPDF bir PDF'deki meta verileri düzenleyebilir mi?
Evet, IronPDF, gizli veya arka plan verileri dahil tüm hassas veri biçimlerini tamamen çıkararak bir PDF belgesindeki meta verileri düzenleyebilir.
IronPDF'yi PDF düzenleme için kullanmanın faydaları nelerdir?
IronPDF'yi PDF düzenleme için kullanmak, veri koruma düzenlemelerine uyumluluğu sağlama, belge güvenliğini artırma ve hassas bilgileri yönetmek için verimli, otomatik bir süreç sunmak gibi avantajlar sunar.

