入力PDF文書からコンテンツを削除(または墨消し)し、出力文書に存在しないようにできます。
指定のページ、またはテキスト、画像、パスなどのコンテンツを削除できます。
テキストから個々の文字(グリフ)を削除または置換することで、対象を絞った墨消し処理を適用することもできます。
Toolbox Add-onのAPIリファレンスはこちらです。(すべて英文)
C#のサンプルプロジェクトではPdftools SDK(Toolbox Add-on)ライブラリ(DLL)をNuGetから自動でダウンロードします。
CのサンプルプロジェクトにはPdftools SDK(Toolbox Add-on)ライブラリ(DLL)が含まれています。
ライセンスキー無し(無償)で試用できます。ただし、結果に「透かし」が入ります。
「透かし」の削除をご希望の場合は問い合わせページまたはメールでお問い合わせください。
License Agreement(利用許諾契約書)が含まれていますので必ず確認してください。
PDFの全ページからホワイトテキストを削除します。
リンク、注釈、フォームフィールド、アウトライン、論理構造、埋め込みファイルは破棄されます。
// Open input document using (Stream inStream = new FileStream(inPath, FileMode.Open, FileAccess.Read)) using (Document inDoc = Document.Open(inStream, null)) // Create output document using (Stream outStream = new FileStream(outPath, FileMode.Create, FileAccess.ReadWrite)) using (Document outDoc = Document.Create(outStream, inDoc.Conformance, null)) { // Copy document-wide data CopyDocumentData(inDoc, outDoc); // Process each page foreach (var inPage in inDoc.Pages) { // Create empty output page Page outPage = Page.Create(outDoc, inPage.Size); // Copy page content from input to output CopyContent(inPage.Content, outPage.Content, outDoc); // Add the new page to the output document's page list outDoc.Pages.Add(outPage); } }
private static void CopyDocumentData(Document inDoc, Document outDoc) { // Copy document-wide data // Output intent if (inDoc.OutputIntent != null) outDoc.OutputIntent = IccBasedColorSpace.Copy(outDoc, inDoc.OutputIntent); // Metadata outDoc.Metadata = Metadata.Copy(outDoc, inDoc.Metadata); // Viewer settings outDoc.ViewerSettings = ViewerSettings.Copy(outDoc, inDoc.ViewerSettings); // Associated files (for PDF/A-3 and PDF 2.0 only) FileReferenceList outAssociatedFiles = outDoc.AssociatedFiles; foreach (FileReference inFileRef in inDoc.AssociatedFiles) outAssociatedFiles.Add(FileReference.Copy(outDoc, inFileRef)); // Plain embedded files FileReferenceList outEmbeddedFiles = outDoc.PlainEmbeddedFiles; foreach (FileReference inFileRef in inDoc.PlainEmbeddedFiles) outEmbeddedFiles.Add(FileReference.Copy(outDoc, inFileRef)); }
private static void CopyContent(Content inContent, Content outContent, Document outDoc) { // Use a content extractor and a content generator to copy content ContentExtractor extractor = new ContentExtractor(inContent); using ContentGenerator generator = new ContentGenerator(outContent, false); // Iterate over all content elements foreach (ContentElement inElement in extractor) { ContentElement outElement; // Special treatment for group elements if (inElement is GroupElement inGroupElement) { // Create empty output group element GroupElement outGroupElement = GroupElement.CopyWithoutContent(outDoc, inGroupElement); outElement = outGroupElement; // Call CopyContent() recursively for the group element's content CopyContent(inGroupElement.Group.Content, outGroupElement.Group.Content, outDoc); } else { // Copy the content element to the output document outElement = ContentElement.Copy(outDoc, inElement); if (outElement is TextElement outTextElement) { // Special treatment for text element Text text = outTextElement.Text; // Remove all those text fragments whose fill and stroke paint is white for (int iFragment = text.Count - 1; iFragment >= 0; iFragment--) { TextFragment fragment = text[iFragment]; if ((fragment.Fill == null || IsWhite(fragment.Fill.Paint)) && (fragment.Stroke == null || IsWhite(fragment.Stroke.Paint))) text.RemoveAt(iFragment); } // Prevent appending an empty text element if (text.Count == 0) outElement = null; } } // Append the finished output element to the content generator if (outElement != null) generator.AppendContentElement(outElement); } }
private static bool IsWhite(Paint paint) { ColorSpace colorSpace = paint.ColorSpace; if (colorSpace is DeviceGrayColorSpace || colorSpace is CalibratedGrayColorSpace || colorSpace is DeviceRgbColorSpace || colorSpace is CalibratedRgbColorSpace) { // These color spaces are additive: white is 1.0 return paint.Color.Min() == 1.0; } if (colorSpace is DeviceCmykColorSpace) { // This color space is subtractive: white is 0.0 return paint.Color.Max() == 0.0; } return false; }
入力PDFの文字列を出力PDFにコピーする際に、先頭2文字を削除してから出力PDFに格納します。
// 入力PDFを開く using (Stream inStream = new FileStream(inPath, FileMode.Open, FileAccess.Read)) using (Document inDoc = Document.Open(inStream, null)) // 出力PDFを生成 using (Stream outStream = new FileStream(outPath, FileMode.Create, FileAccess.ReadWrite)) using (Document outDoc = Document.Create(outStream, inDoc.Conformance, null)) { // ドキュメント全体のデータをコピー CopyDocumentData(inDoc, outDoc); // 各ページを処理 foreach (var inPage in inDoc.Pages) { // 空の出力ページを作成 Page outPage = Page.Create(outDoc, inPage.Size); // 入力から出力にページコンテンツをコピーし、グリフを削除 CopyContentAndRemoveGlyphs(inPage.Content, outPage.Content, outDoc); // 新しいページを出力ドキュメントのページリストに追加 outDoc.Pages.Add(outPage); } }
private static void CopyDocumentData(Document inDoc, Document outDoc) { // ドキュメント全体のデータをコピー // 出力設定 if (inDoc.OutputIntent != null) outDoc.OutputIntent = IccBasedColorSpace.Copy(outDoc, inDoc.OutputIntent); // メタデータ outDoc.Metadata = Metadata.Copy(outDoc, inDoc.Metadata); // ビュワー設定 outDoc.ViewerSettings = ViewerSettings.Copy(outDoc, inDoc.ViewerSettings); // 関連ファイル(PDF/A-3およびPDF 2.0のみ) FileReferenceList outAssociatedFiles = outDoc.AssociatedFiles; foreach (FileReference inFileRef in inDoc.AssociatedFiles) outAssociatedFiles.Add(FileReference.Copy(outDoc, inFileRef)); // プレーンな埋め込みファイル FileReferenceList outEmbeddedFiles = outDoc.PlainEmbeddedFiles; foreach (FileReference inFileRef in inDoc.PlainEmbeddedFiles) outEmbeddedFiles.Add(FileReference.Copy(outDoc, inFileRef)); }
private static void CopyContentAndRemoveGlyphs(Content inContent, Content outContent, Document outDoc) { // コンテンツ抽出ツールとコンテンツジェネレータを使用してコンテンツをコピー ContentExtractor extractor = new ContentExtractor(inContent); using ContentGenerator generator = new ContentGenerator(outContent, false); // すべてのコンテンツ要素を反復処理 foreach (ContentElement inElement in extractor) { ContentElement outElement; // グループ要素の特別な処理 if (inElement is GroupElement inGroupElement) { // 空の出力グループ要素を作成 GroupElement outGroupElement = GroupElement.CopyWithoutContent(outDoc, inGroupElement); outElement = outGroupElement; // グループ要素のコンテンツに対してCopyContentAndRemoveGlyphs()を再帰的にコール CopyContentAndRemoveGlyphs(inGroupElement.Group.Content, outGroupElement.Group.Content, outDoc); } else { // コンテンツ要素を出力ドキュメントにコピー outElement = ContentElement.Copy(outDoc, inElement); if (outElement is TextElement outTextElement) { // テキスト要素の特別な処理 Text text = outTextElement.Text; // 各テキストフラグメントから最初の2つのグリフを削除 foreach (var fragment in text) { // フラグメントに2つ以上のグリフがあることを確認 if (fragment.Count > 2) { // RemoveAtを2回コール fragment.RemoveAt(0); fragment.RemoveAt(0); } } } } // 完成した出力要素をコンテンツジェネレーターに追加 generator.AppendContentElement(outElement); } }
質問のページからお送りいただくようお願いします。
または、メールでsupport@trustss.co.jpあてにお送りください。
ご購入前の技術的質問も無償で対応します。サポート受付ページからお願いします。