アイコン 株式会社トラスト・ソフトウェア・システム ロゴ

開発者向けPDFライブラリ - Pdftools SDK(Toolbox add-on)

PDFの編集

入力PDF文書からコンテンツを削除(または墨消し)し、出力文書に存在しないようにできます。
指定のページ、またはテキスト、画像、パスなどのコンテンツを削除できます。
テキストから個々の文字(グリフ)を削除または置換することで、対象を絞った墨消し処理を適用することもできます。

 INFO:
この機能はToolbox add-onの機能ですが、「Pdftools SDK」ライブラリ用のライセンスキーで機能します。
Toolbox add-onの全機能は無償で試用できますが、試用版のライセンスキーが必要です。
試用ライセンスキー要求からご要望ください。

Pdftools SDK 見積もり

APIリファレンス (Toolbox Add-on)

Toolbox Add-onのAPIリファレンスはこちらです。(すべて英文)

サンプル

C#のサンプルプロジェクトではPdftools SDK(Toolbox Add-on)ライブラリ(DLL)をNuGetから自動でダウンロードします。
CのサンプルプロジェクトにはPdftools SDK(Toolbox Add-on)ライブラリ(DLL)が含まれています。

ライセンスキー無し(無償)で試用できます。ただし、結果に「透かし」が入ります。
「透かし」の削除をご希望の場合は問い合わせページまたはメールでお問い合わせください。

License Agreement(利用許諾契約書)が含まれていますので必ず確認してください。


Content削除

PDFからホワイトテキストを削除

PDFの全ページからホワイトテキストを削除します。
リンク、注釈、フォームフィールド、アウトライン、論理構造、埋め込みファイルは破棄されます。


サンプル・プロジェクト(C#)をダウンロード
サンプル・プロジェクトをダウンロード
// 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の文字列を出力PDFにコピーする際に、先頭2文字を削除してから出力PDFに格納します。


サンプル・プロジェクト(C#)をダウンロード
サンプル・プロジェクトをダウンロード
// 入力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あてにお送りください。


ご購入前の技術的質問も無償で対応します。サポート受付ページからお願いします。

> PDF Structure (PDF構成)

> PDF Imager-LP (画像化)

> PDF Stamper (電子印鑑)

> Pdftools SDK

- Pdftools SDKサンプルの利用手順
- Toolbox Add-on
> Pdftools SDK APIリファレンス