このページには自動翻訳されたテキストを含めることができます。

C# で PDF を編集する

Docotic.Pdf を使用して PDF ドキュメントを変更します。これは、強力な機能と直感的な API を組み合わせた C# および VB.NET 用の PDF 編集ライブラリです。

Docotic.Pdf ライブラリ 9.5.17615-dev 回帰テスト 14,813人が合格 NuGet の合計ダウンロード数 4,924,084
PDF エディター アイコン

Docotic.Pdf には、PDF ドキュメントを編集するためのさまざまな手段が用意されています。ライブラリの PDF 編集の主な機能は次のとおりです。

  • 複数の PDF を 1 つに結合したり、1 つの PDF を複数のファイルに分割したりできます。
  • PDF ファイルのサイズを縮小します。
  • ページの並べ替え、削除、回転、または抽出を行います。
  • PDF メタデータの読み取り、変更、または削除を行います。
  • デジタル署名を使用して PDF に署名します。
  • ドキュメントを暗号化したり、PDF からパスワードを削除したりできます。
  • 注釈や添付ファイルを追加、編集、または削除します。
  • AcroForms に入力し、フォーム コントロールを追加または削除します。
  • フォーム フィールドと注釈をフラット化して、PDF コンテンツの一部にします。
  • PDF 内のテキストを追加、削除、または置換します。
  • 画像を挿入、置換、およびサイズ変更します。
  • 透かしと背景を追加します。
  • スキャンしたドキュメントを編集可能で検索可能なテキストに変換します。

次のセクションでは、PDF 編集機能について詳しく説明します。また、これらのセクションには、コード スニペットと関連リソースへのリンクも含まれています。

PDFの結合と分割

このセクションでは、反対の目標を持つ 2 つの機能について説明します。

C# と VB.NET で PDF を分割および結合する

PDFを結合

PDF ファイルを統合すると、1 つの PDF ドキュメントが作成されます。結合された PDF には通常、複数の既存の PDF ファイルからの関連情報が含まれます。

以下は、Docotic.Pdf を使用して PDF ファイルを結合する方法を示したコード スニペットです。

using var pdf = new PdfDocument("first.pdf");
pdf.Append("second.pdf");
pdf.Save("merged.pdf");

このコードは最も基本的なケースを示しているため、非常にシンプルです。より複雑なマージケース について説明した記事があります。たとえば、暗号化されたドキュメントを結合する方法を示しています。

PDFを分割

分割とは、元の PDF から選択したページを抽出して、1 つ以上の新しい PDF ファイルを作成することを意味します。このプロセスは、ドキュメントの一部のみを共有する場合に便利です。

次のコード スニペットは、PDF の各ページから新しいドキュメントを作成する方法を示しています。

using var pdf = new PdfDocument("compound.pdf");
for (int i = 0; i < pdf.PageCount; ++i)
{
    using PdfDocument copy = pdf.CopyPages(i, 1);

    // Helps to reduce file size when the copied pages reference
    // unused resources such as fonts, images, patterns.
    copy.RemoveUnusedResources();
    copy.Save(i + ".pdf");
}

PDF スプリッターを実装する の他の方法については、専用の記事をお読みください。

PDF圧縮

PDF を圧縮する場合、主に 2 つの方法があります。1 つ目は、ファイルの内容を変更せず、形式のみを変更する操作のみを適用する方法です。2 つ目の方法では、圧縮率を高めるために、詳細やドキュメントの品質が失われる可能性のある変更も行います。

ロスレスPDF圧縮

デフォルトでは、ライブラリは PDF オブジェクトをより少ないバイト数で保存します。このため、未使用のオブジェクトを除外し、オブジェクトをフォーマットせずに書き込み、可能な場合はより短い形式を使用します。

圧縮をさらに改善するために、Docotic.Pdf は出力 PDF にオブジェクト ストリームも生成します。これは、最もコンパクトな表現でオブジェクトを書き込む別の形式です。オブジェクト ストリームは Flate アルゴリズムで圧縮されます。

保存オプション を使用して、ライブラリがオブジェクトを保存する方法に影響を与えることができます。

一部のドキュメントには、重複したフォント、画像、カラー プロファイル、およびその他のオブジェクトが含まれています。これは通常、増分更新されたドキュメントや、複数のドキュメントを結合して作成されたファイルに当てはまります。PdfDocument.ReplaceDuplicateObjects メソッドを使用してこれらのオブジェクトの重複を排除すると、出力サイズを大幅に削減できます。

ドキュメントのページは、未使用のリソースを参照する場合があります。たとえば、以前はページに表示されていたが、現在は表示されていない画像などです。このようなリソースを削除するには、PdfDocument.RemoveUnusedResources メソッドを使用します。

PDF に対するこれらのすべての操作により、品質を損なうことなくファイル サイズが縮小されます。

非可逆変換

画像を含むファイルの場合、PDF サイズを縮小する最も効果的な方法の 1 つは、画像の 圧縮方式を変更する ことです。たとえば、画像に JPEG などの非可逆圧縮を使用すると、サイズが縮小されます。副作用として、圧縮アーティファクトや詳細の損失が画像に現れることがあります。

PDF 内の画像が必要以上に大きい場合は、サイズを変更 することができます。これにより、さらに圧縮率を高めることができます。別のオプションとして、画像を白黒 (2 色) に変換することもできます。

フォーム フィールドと注釈をフラット化 してスペースを節約できます。ドキュメント内で編集可能な注釈やフォーム フィールドが不要になった場合に有効です。

フォントはドキュメント内で多くのスペースを占めることがあります。PdfDocument.RemoveUnusedFontGlyphs メソッドは、フォントから未使用のグリフを削除して出力サイズを最適化できます。フォントのサブセット化は、このプロセスの別名です。ドキュメントからフォント バイトを完全に削除することもできます (フォントの埋め込み解除)。これは、ドキュメントに Arial などの一般的なフォントのバイトが含まれている場合に意味があるかもしれません。

その他の変換では、ドキュメントから情報が直接削除されます。メタデータ、構造情報、プライベート アプリケーション データを削除できます。このデータは表示されませんが、ドキュメントのユーザーにとって重要でない場合にのみ削除されます。

詳細とコード例については、PDF ファイル サイズを縮小する方法 の記事をお読みください。

PDF のページを並べ替える

PDF 内のページの順序を変更する理由は十分にあります。たとえば、関連する情報をグループ化したり、ドキュメントが論理的に流れるようにしてドキュメントの読みやすさを向上させたりする必要がある場合があります。

PDF のページを並べ替える

Docotic.Pdf は、ページを結合および分割 する機能の他に、PDF 内のページを並べ替えるためのさまざまなメソッドを提供します。C# コード スニペットと Docotic.Pdf API を使用して、PDF ページを整理する方法を説明します。

このセクションの例の完全なテスト プロジェクトは、サンプル コードの ページとナビゲーション グループにあります。スニペットでは ten-pages.pdf を使用しています。これは、各ページに Page N というタイトルが付いた簡単なテスト ドキュメントです。

PDFページを移動する

次のスニペットは、連続したページ範囲を移動する方法を示しています。このコードは、ページの前半をドキュメントの最後に移動します。

using var pdf = new PdfDocument("ten-pages.pdf");

pdf.MovePages(0, 5, pdf.PageCount);

pdf.Save("continuous-move.pdf");

任意のページセットを移動することができます。次のコードは、奇数ページをドキュメントの最後に移動します。

using var pdf = new PdfDocument("ten-pages.pdf");

int[] indexes = [0, 2, 4, 6, 8];
pdf.MovePages(indexes, pdf.PageCount);

pdf.Save("arbitrary-move.pdf");

1 ページだけ移動するには、PdfDocument.MovePage メソッドを使用します。

PDFページの入れ替え

2 つのページを交換するには、次のスニペットのようなコードを使用します。

using var pdf = new PdfDocument("ten-pages.pdf");

pdf.SwapPages(9, 0);
pdf.SwapPages(8, 1);

pdf.Save("swapped.pdf");

PdfDocument.SwapPages メソッドは、互いの位置を占める 2 つのページのインデックスを受け入れます。ページ数が 2 に等しくない場合は、ページの移動 メソッドのいずれかを使用します。

ページの追加と挿入

どの PdfDocument にも少なくとも 1 ページが含まれます。新しいドキュメントを作成すると、ライブラリによって暗黙的に 1 ページが追加されます。

Docotic.Pdf API を使用して PDF に空白ページを挿入する方法は次のとおりです。0 から PageCount までのインデックスの位置にページを挿入できます。

using var pdf = new PdfDocument();

var newPage = pdf.InsertPage(0);
newPage.Canvas.DrawString("This is the new first page");

pdf.Save("two-pages.pdf");

PDF に空白ページを追加するには、PdfDocument.AddPage メソッドを使用します。このメソッドは、ドキュメントの末尾に新しいページを追加します。pdf.InsertPage(pdf.PageCount) 呼び出しと同じ動作をします。

別のドキュメントからページを追加または挿入するには、PDF をプリペンドする セクションで説明されているような呼び出しを組み合わせて使用します。呼び出しの組み合わせを使用して、PDF に表紙を追加できます。

重複したPDFページ

ライブラリ API を使用すると、複製操作を 2 つの連続した操作として実行できます。最初の操作はページのコピー操作です。PDF の分割 セクションのコード例を参照してください。

2 つ目は、ページを貼り付ける操作です。この操作では、PdfDocument.Append メソッドを使用します。次に、追加されたページを で必要な位置に移動します。

Extract pages

次のスニペットは、PDF からページを抽出する方法を示しています。ソース ドキュメントから最初の 3 ページを抽出します。

using var pdf = new PdfDocument("ten-pages.pdf");

using (var extracted = pdf.ExtractPages(0, 3))
{
    extracted.RemoveUnusedResources();
    extracted.Save("three-pages.pdf");
}

pdf.Save("seven-pages.pdf");

ExtractPages メソッドは、ドキュメントからページを削除します。このため、ソース ドキュメントには 7 ページのみが残ります。ライブラリでは、1 ページのみを含むドキュメントからページを抽出することはできません。

抽出されたページを含むドキュメントから未使用のリソースを削除することをお勧めします。

PDFからページを削除

PDF ドキュメント内のページを削除する方法を示すスニペットを確認してください。実際には、RemovePage メソッドの異なるオーバーロードを使用して 2 つのページを削除します。最初のオーバーロードは、ページ インデックスをパラメーターとして受け入れます。2 番目のオーバーロードは、ページ オブジェクトを受け入れます。

using var pdf = new PdfDocument("ten-pages.pdf");
pdf.RemovePage(0);
pdf.RemovePage(pdf.Pages[0]);
pdf.Save("without-first-two-pages.pdf");

一度に複数のページを削除するには、PdfDocument.RemovePages メソッドを使用します。このメソッドのオーバーロードは、ページ インデックスまたはページ オブジェクトの配列で機能します。

デジタル署名

Docotic.Pdf は PDF のデジタル署名に関する多くの操作を実装しており、PDF ドキュメントの信頼性と法的有効性を維持するのに役立ちます。ライブラリで実行できることの例をいくつか示します。

証明書を使用して PDF に署名。PDF にデジタル署名を追加すると、署名者の身元を確認し、署名後に誰も文書を変更していないことを確認できます。

署名を認証。PDF に追加の制限を加えるには、認証署名で署名します。署名後に PDF を完全にロックしたり、いくつかの種類の変更を許可したりできます。

PDF の署名を検証。デジタル署名の有効性をチェックして、ドキュメントの署名部分が変更されていないことを確認します。

複数の署名を許可。契約書、合意書、フォームでは、多くの場合、1 つのドキュメントに複数の当事者が署名する必要があります。PDF に複数の署名を追加するには、ドキュメントを 増分的に保存 する必要があります。

署名タイムスタンプを埋め込む。署名オプションでタイムスタンプ機関の URL と、オプションでその資格情報を指定できます。ライブラリは、受信したタイムスタンプを署名に埋め込みます。

証明書を埋め込む。ライブラリは、署名証明書をデジタル署名に自動的に埋め込みます。

デジタル署名ページ には、サンプル コードと各操作の詳細情報が記載されています。

PDFを保護する

PDF のセキュリティを確保するために使用できる機能は 3 つあります。Docotic.Pdf はこれらの機能を双方向で使用できます。ライブラリは PDF を保護し、保護された PDF のロックを解除できます。

PDFセキュリティ

パスワード保護

この機能を使用すると、パスワードを設定して PDF へのアクセスを制限できます。パスワードの種類に応じて、PDF ドキュメントを開いたり変更したりするために正しいパスワードが必要になります。

PDF には 2 種類のパスワードがあります:

  • 開くパスワード (ユーザー パスワード)。この種類のパスワードは、PDF を開いて表示するために必要です。正しいパスワードがないと、準拠した PDF ビューアーでドキュメントを開くことができません。
  • 権限パスワード (所有者パスワード)。このパスワードは、PDF から権限を削除するために必要です。所有者パスワードを使用して PDF を開くと、権限によって PDF の印刷、コピー、編集などの特定のアクションが制限されている場合でも、すべてのアクションが許可されます。

同じ PDF ドキュメントに 両方のパスワードを設定する ことができます。PDF ドキュメントからパスワードを削除する方法については、PDF ファイルの暗号化解除 についてお読みください。

暗号化

PDF 暗号化と PDF パスワードは連携して動作し、PDF 内の機密情報が正当なユーザーのみに利用可能であることを保証します。正しい復号化キーまたはパスワードを持つユーザーのみがコンテンツを表示できます。

Docotic.Pdf は、RC4 40 ビット、RC4 128 ビット、AES 128 ビット、および AES 256 ビット暗号化 アルゴリズムを使用して PDF ファイルを暗号化できます。

権限と制限

印刷の制限、テキストのコピー、文書の編集など、PDF に さまざまな権限を設定 できます。権限は、ユーザー パスワードを使用して PDF を開いた場合にのみ影響します。所有者パスワードを使用して PDF を開いたユーザーには、制限は適用されません。

PDF から権限を削除するには、まず PDF セキュリティ パスワードを削除する必要があります。C# と Docotic.Pdf API を使用して これを行う方法 についてお読みください。

PDF セキュリティに加えて PDF の整合性 を確保する方法については、デジタル署名に関するセクションをお読みください。

PDF のメタデータ

PDF メタデータは、PDF ファイル内に埋め込まれた、ドキュメントに関する詳細情報を提供する情報です。メタデータの主なソースは、PDF ドキュメント プロパティと XMP メタデータの 2 つです。

ドキュメント プロパティは、通常、ドキュメント情報辞書、ファイル情報、メタデータ フィールド、ドキュメント属性、ファイル属性とも呼ばれます。

XMP (Extensible Metadata Platform) メタデータは、基本的に PDF に埋め込まれた XML ファイルです。XMP は、メタデータ プロパティの任意のセットを保存できる柔軟なデータ モデルを使用します。このメタデータは、名前空間を使用して関連するプロパティをグループ化します。一般的な名前空間には、XMP Core/XMP Basic や Dublin Core などがあります。

Docotic.Pdf は、XMP メタデータとドキュメント プロパティの両方を完全にサポートします。PDF 2.0 標準では、ドキュメント情報辞書のプロパティのほとんどが非推奨とされていることに注意してください。唯一の例外は、作成日と変更日です。

このセクションの例の完全なテスト プロジェクトは、サンプル コードの メタデータ グループ にあります。

ドキュメントのプロパティ

Docotic.Pdf を使用してドキュメントのプロパティを編集する方法をご覧ください。

using var pdf = new PdfDocument("file.pdf");
pdf.Info.Author = "An example code";
pdf.Info.Subject = "Showing how to access and change document metadata";
pdf.Info.Title = "Custom title goes here";
pdf.Info.Keywords = "pdf Docotic.Pdf";

pdf.Save("updated-file.pdf");

各プロパティの値を変更できますが、デフォルトではライブラリが PDF を保存する前に一部のプロパティを自動的に更新することに注意してください。これは 保存オプション で変更できます。

ドキュメント プロパティで指定されたすべてのメタデータを削除するには、PdfInfo.Clear メソッドを使用します。このメソッドでは、必要に応じてカスタム プロパティのみを削除できます。

XMPメタデータ

このスニペットは、PDF ドキュメント内の XMP メタデータのプロパティを変更する方法を示しています。

using var pdf = new PdfDocument("file.pdf");

pdf.Metadata.DublinCore.Creators = new XmpArray(XmpArrayType.Ordered);
pdf.Metadata.DublinCore.Creators.Values.Add(new XmpString("me"));
pdf.Metadata.DublinCore.Creators.Values.Add(new XmpString("Docotic.Pdf"));
pdf.Metadata.DublinCore.Format = new XmpString("application/pdf");

pdf.Metadata.Pdf.Producer = new XmpString("me too!");

pdf.Save("updated-file.pdf");

このコードは、Dublin Core および Adob​​e PDF スキーマのプロパティを変更します。デフォルトの保存オプション により、Producer プロパティが上書きされることに注意してください。

XmpMetatada.Save メソッドの 1 つを使用して、生の XMP メタデータを抽出できます。このメソッドは、すべてのプロパティを含む XML を生成します。

ドキュメントからすべての XMP メタデータを削除するには、XmpMetadata.Unembed メソッドを使用します。

メタデータを同期する

XMP メタデータとドキュメント情報プロパティの両方で、対応するプロパティの値が同じであることを確認することをお勧めします。これは、同じファイルで両方のメタデータ ソースを編集する場合に特に当てはまります。

XMP メタデータとドキュメント情報の値を同期するには、PdfDocument.SyncMetadata メソッドを使用します。両方のソースでプロパティが変更されると、メソッドは一方のソースをもう一方のソースの値で上書きします。詳細については、メソッドのドキュメント をお読みください。

PDF ブックマーク

PDF ドキュメントには、読者が特定のセクションやページに素早く移動できるようにする特別なショートカットやリンクを含めることができます。PDF アウトラインはブックマークの別名です。

PDFアウトライン

ビューア アプリは通常、本の目次のようなブックマークをインタラクティブに表示します。読者がブックマークをクリックすると、ビューア アプリはドキュメントの指定された部分にジャンプします。同様の動作は、リンク注釈 を使用して実現できます。

以下は、PDF にブックマークを追加する方法を示した C# コード スニペットです。

using var pdf = new PdfDocument("ten-pages.pdf");

var root = pdf.OutlineRoot;
root.AddChild("Fifth page", 4);
root.AddChild("Seventh page", pdf.Pages[6]);

pdf.PageMode = PdfPageMode.UseOutlines;
pdf.Save("simple-bookmarks.pdf");

PDF アウトラインにはメイン ブックマークとサブ ブックマークを設定できるため、大きなドキュメントの構造化が容易になります。PDF でサブ ブックマークを作成する方法は次のとおりです。

using var pdf = new PdfDocument("ten-pages.pdf");

var root = pdf.OutlineRoot;
var evenPages = root.AddChild("Even pages");

evenPages.AddChild("Second page", 1);
evenPages.AddChild("Fourth page", 3);

pdf.PageMode = PdfPageMode.UseOutlines;
pdf.Save("even-pages-bookmarks.pdf");

ブックマーク項目にフォントと色を適用できます。スタイル付きアウトライン を作成するための完全な例を確認してください。

PDF からブックマークを削除するには、RemoveChild メソッドまたは RemoveChildAt メソッドを使用します。ルート ノードで RemoveAllChildren メソッドを呼び出すと、すべてのブックマークを削除できます。

添付ファイル

PDF 添付ファイルは、PDF ドキュメント内に埋め込まれた外部ファイルです。これらのファイルは、埋め込みファイルや添付ファイルとも呼ばれます。画像、オーディオ/ビデオ ファイル、別の PDF、Word ドキュメント、Excel スプレッドシートなど、あらゆるファイルを添付できます。

複数の PDF を結合して結合された PDF ファイルを作成する場合は、PDF ドキュメントの結合 に関する記事を確認してください。

以下は、Docotic.Pdf API を使用して PDF に添付ファイルを追加する方法を示した C# コードです。

using var pdf = new PdfDocument();

var excelFile = pdf.CreateFileAttachment("this-year-figures.xlsx");
pdf.SharedAttachments.Add(excelFile);

pdf.Save("shared-attachment.pdf");

上記のコードは、ファイルを共有添付ファイルとして追加しました。読者は、ビューアーの添付ファイル パネルで添付ファイルを見つけることができます。

PDF ページに添付ファイルを追加することもできます。このような添付ファイルは、他の注釈 と同様にページ コンテンツ内に表示されます。

using var pdf = new PdfDocument();

var page = pdf.Pages[0];
page.Canvas.DrawString(20, 100, "Here is this year's figures document:");

var bounds = PdfRectangle.FromLTRB(155, 100, 165, 110);
var excelFile = pdf.CreateFileAttachment("this-year-figures.xlsx");
pdf.Pages[0].AddFileAnnotation(bounds, excelFile);

pdf.Save("page-attachment.pdf");

このセクションの例の完全なテスト プロジェクトを見つけるには、サンプル コードの 添付ファイル グループ を確認してください。

PDF から添付ファイルを削除するには、共有添付ファイルとページ注釈の両方を列挙し、不要な項目を削除する必要があります。列挙コードの例については、以下を参照してください。共有注釈をすべて削除するには、pdf.SharedAttachments.Clear() 呼び出しを使用できます。

PDF から埋め込まれたファイルを抽出するには、コレクションを列挙する必要もあります。次にコード例を示します。

using var pdf = new PdfDocument("file-with-attachments.pdf");

int i = 0;
foreach (var attachment in pdf.SharedAttachments)
{
    if (attachment?.Contents == null)
        continue;

    var fileName = attachment.Specification ?? $"attachment{i++}";
    attachment.Contents.Save(fileName);
}

foreach (var widget in pdf.GetWidgets())
{
    var attachment = (widget as PdfFileAttachmentAnnotation)?.File;
    if (attachment?.Contents == null)
        continue;

    var fileName = attachment.Specification ?? $"attachment{i++}";
    attachment.Contents.Save(fileName);
}

ページラベル

PDF ページ ラベルは、PDF ドキュメント内のページに割り当てられたカスタム名または番号です。標準のページ番号とは異なり、ページ ラベルには文字、数字、さらにはローマ数字を混在させることができます。ページ ラベルの他の名前は、ページ識別子やページ名です。

Docotic.Pdf を使用して PDF にページ ラベルを追加する方法は次のとおりです。

using var pdf = new PdfDocument("ten-pages.pdf");

pdf.PageLabels.AddRange(0, 3, PdfPageNumberingStyle.LowercaseRoman);
pdf.PageLabels.AddRange(4, PdfPageNumberingStyle.DecimalArabic, string.Empty, 5);
pdf.PageLabels.AddRange(7, PdfPageNumberingStyle.DecimalArabic, "Appendix page ", 1);

pdf.Save("page-labels.pdf");

最初の 4 ページには、iiiiiiiv というラベルが付きます。次の 3 つのラベルは、567 です。残りのページのラベルは、Appendix page 1Appendix page 2Appendix page 3 になります。

OCR PDF

一部の PDF ドキュメントにはスキャンされたページが含まれており、そこからテキストを抽出するには光学式文字認識 (OCR) が必要です。OCR のもう 1 つの使用例は、カスタム グリフから Unicode へのマッピングを使用する PDF からテキストを抽出することです。

OCRスキャンしたPDFからテキストを抽出する

ドキュメントを OCR スキャン する方法を紹介するブログ記事があります。この投稿には、検索不可能な PDF の例が含まれており、Tesseract OCR、C# コード、および Docotic.Pdf を使用して、画像のみの PDF 内のテキストを認識する方法が示されています。また、Docotic.Pdf を利用して、スキャンした PDF ファイルに OCR テキスト レイヤーを追加することもできます。

ページを編集

このセクションでは、既存の PDF ページの変更について説明します。

  • PDF ページを回転する方法
  • ページ サイズを変更する方法
  • ページ キャンバスでベクター グラフィックを使用する
  • HTML コンテンツを追加する

ヘッダーとフッター、表、画像、テキストの段落などの構成要素から PDF ドキュメントを作成する方法 を知るには、ライブラリのレイアウト API について読んでください。

以下の情報については、他のセクションをご覧ください:

ページを回転する

PDF 内の 1 ページのみを回転する方法については、C# コード スニペットを参照してください。

using var pdf = new PdfDocument("existing.pdf");

pdf.Pages[0].Rotation = PdfRotation.Rotate180;

pdf.Save("rotated.pdf");

このコードは最初のページを 180 度回転します。PDF ページを 0 度、90 度、270 度回転することもできます。

ページサイズを変更する

Docotic.Pdf では、PDF のページ サイズを変更する方法が複数用意されています。最も単純なケースでは、PdfPage オブジェクトの Width プロパティと Height プロパティを使用して、希望するサイズを指定できます。既存のドキュメントの場合、ドキュメント ページの内容のサイズは変更されません。また、内容は削除されません。指定されたサイズの四角形の外側にあるすべてのページ内容が非表示になるだけです。

同様のアプローチは、ページをトリミングすることです。次のような C# コードを使用して、ページの CropBox を変更できます。

using var pdf = new PdfDocument("existing.pdf");

var page = pdf.Pages[0];
var cropBoxBefore = page.CropBox;
page.CropBox = new PdfBox(0, cropBoxBefore.Height - 256, 256, cropBoxBefore.Height);

pdf.Save("cropped.pdf");

ページの一部を画像として保存 したい場合は、トリミング ボックスを変更するのが最適です。

異なるサイズのページですべてのコンテンツを表示したままにすることが目的の場合は、スケーリング アプローチを使用します。次のコード スニペットでは、ページから XObject を作成します。XObject はベクター イメージのようなものです。必要に応じて、同じオブジェクトを複数のページにスケーリングおよび回転して描画できます。

XObject の準備ができたら、前のページのコンテンツをクリアし、ページのサイズを変更して、サイズ変更されたページにオブジェクトを描画します。

using var pdf = new PdfDocument("existing.pdf");

var page = pdf.Pages[0];
var pageXObject = pdf.CreateXObject(page);

page.Canvas.Clear();
page.Width /= 2;
page.Height /= 2;

page.Canvas.DrawXObject(pageXObject, 0, 0, page.Width, page.Height, 0);

pdf.Save("resized.pdf");

ベクターグラフィック

Docotic.Pdf ライブラリは、直線、曲線、図形などのベクター グラフィックを PDF ドキュメントに追加できます。グラフィック オブジェクトからグラフィック パスを作成できます。その後、さまざまなカラー スペースの色を使用してパスを塗りつぶしたり、ストロークしたりできます。

サンプル コードの グラフィックス グループ でグラフィックス関連機能のサンプル コードを見つけます。

PDF からグラフィックを抽出することも可能です。まず GetObjects メソッドを呼び出して、PdfPageObjectType.Path タイプのオブジェクトから情報を抽出します。XObject にはネストされたパスも含まれる可能性があることに注意してください。

using var pdf = new PdfDocument("existing.pdf");

var options = new PdfObjectExtractionOptions();
var objects = pdf.Pages[0].GetObjects(options);
foreach (var obj in objects)
{
    if (obj.Type == PdfPageObjectType.Path)
    {
        var path = (PdfPath)obj;
        Console.WriteLine($"Found path {path}");
    }
    else if (obj.Type == PdfPageObjectType.XObject)
    {
        var paintedXObject = (PdfPaintedXObject)obj;
        var nestedObjects = paintedXObject.XObject.GetObjects(options);
        // ...
    }
}

PDFページにHTMLを追加する

PDF ドキュメントに HTML コンテンツを重ねると、グラフや株価ティッカーなどの動的な要素を PDF に追加するのに役立ちます。

詳細を確認し、サンプル コードをダウンロードするには、PDF に HTML を挿入する の方法をご覧ください。

PDFテキストを編集

このセクションでは、PDF 内のテキストを編集する方法、PDF 内のテキストの色を変更する方法、新しいテキストを追加する方法について説明します。

PDFエディタでテキストを変更する

PDF からテキストを抽出する方法 に関する記事があります。このトピックの詳細については、こちらを参照してください。

Docotic.Pdf を使用すると、テキストのフラット化 も可能です。

検索と置換

PDF 内のテキストを変更するには、テキストを含む領域を見つけて、その領域内のテキストを削除する必要があります。最後の手順は、ドキュメントの同じ領域に新しいテキストを追加することです。

PDF の検索は、ドキュメントの内部では単語が任意の順序で含まれている可能性があるため、難しい場合があります。テキストが回転されることもあります。幸いなことに、PDF で単語やフレーズを検索する方法 を示すサンプル コードがあります。

削除するテキストの座標がわかったら、そのテキストを含むページ コンテンツを編集します。ライブラリには、ページ オブジェクトを列挙してコピーする手段が用意されています。そのため、オブジェクトをコピーするときに一部のテキストを省略することができます。これにより、テキストが削除されます。PDF ページ コンテンツの編集 の例のコードには、プロセスの詳細がすべて示されています。見つかった座標を使用するには、ShouldRemoveText メソッドを更新する必要があります。

新しいテキストをドキュメントに追加する方法を確認するには、次のセクションをお読みください。

プレースホルダー テキストを含むドキュメントを作成し、後でプレースホルダーを他のテキストに置き換える場合は、代わりにテキスト ボックスを使用できます。

アイデアとしては、境界線のない読み取り専用のテキスト ボックスをドキュメントに追加し、その中にプレースホルダー テキストを配置します。後でドキュメントを開き、名前でテキスト ボックスを見つけて、単純な呼び出し box.Text = "new text"; でプレースホルダーを置き換えます。これ以上変更したくない場合は、置き換え後にテキスト ボックスをフラット化します。

新しいテキストを追加

ドキュメントにテキストを追加するには、PdfCanvas オブジェクトの DrawString メソッドと DrawText メソッドを使用します。これらのメソッドは、現在のキャンバス フォントを使用します。フォントには、テキスト内のすべての文字のグリフが含まれている必要があります。PdfFont.ContainsGlyphsForText メソッドを使用して、フォントがこの要件を満たしているかどうかを確認します。

var canvas = pdf.Pages[0].Canvas;
canvas.Font = pdf.AddFont("NSimSun")
    ?? throw new ArgumentException("Font not found");

canvas.DrawString(10, 50, "Olá. 你好. Hello. This is some new text");

Type1、TrueType、OpenType フォントで描画された Unicode テキストを追加できます。ライブラリでは、システムにインストールされているフォント、14 個の組み込み Type1 フォントを使用したり、ファイルから必要なフォントを読み込むことができます。

テキストの色を変更する

PDF 内のテキストの色を変更するには、テキストの削除 と同じ方法を使用します。少なくともサンプル コードの ReplaceColor メソッドを変更する必要があります。

画像

Docotic.Pdf は、PDF 画像の編集に必要なものをすべて提供します。以下は、最も一般的な操作の C# コード スニペットです。

サンプル コードの画像グループ には、このセクションの例の完全なテスト プロジェクトが含まれています。

PDFに画像を追加

ライブラリは、GIF/TIFF/PNG/BMP/JPEG 形式の画像をインポートできます。また、System.Drawing.Image オブジェクトから画像を追加することもできます。

var canvas = pdf.Pages[0].Canvas;
var image = pdf.AddImage("image.jpg")
    ?? throw new ArgumentException("Cannot add image");

canvas.DrawImage(image, 10, 50);

DrawImage メソッドのオーバーロードを使用して、回転角度と出力サイズを指定できます。複数のページに同じ画像を描画するには、画像を 1 回追加し、DrawImage メソッドの複数の呼び出しで同じ PdfImage オブジェクトを使用します。

画像をPDFに結合する

複数の画像を 1 つの PDF に結合する方法を示す C# コードを以下に示します。

using var pdf = new PdfDocument();

var imagePaths = new string[] { "image.jpg", "another-image.png" };
foreach (var path in imagePaths)
{
    var image = pdf.AddImage(path)
        ?? throw new ArgumentException("Cannot add image");

    var page = pdf.AddPage();
    page.Width = image.Width;
    page.Height = image.Height;

    page.Canvas.DrawImage(image, 0, 0);
}

pdf.RemovePage(0);
pdf.Save("combined-images.pdf");

このコードは PDF に複数の画像を追加し、各ページのサイズを対応する画像のサイズに合わせて変更します。結果を保存する前に、コードは暗黙的に追加された最初の空のページを削除します。

PDF画像を抽出する

Docotic.Pdf は、画像の品質を損なうことなく PDF ファイルから画像を抽出できるように設計されました。ライブラリは画像のサイズや圧縮を変更しません。PDF と同じ品質の画像が得られます。

using var pdf = new PdfDocument("file-with-images.pdf");
int i = 0;
foreach (PdfImage image in pdf.GetImages())
{
    var path = image.Save($"image{i++}");
    Console.WriteLine($"Saved to {path}");
}

画像の削除と置き換え

PDF ページからすべての画像または特定の画像を削除するには、PdfPage.RemovePaintedImages メソッドを使用します。位置、サイズ、変換、またはその他のパラメータで画像をフィルタリングできます。

using var pdf = new PdfDocument("file-with-images.pdf");
pdf.Pages[0].RemovePaintedImages(
    image =>
    {
        return image.Size.Width > 100;
    }
);

pdf.RemoveUnusedResources();
pdf.Save("no-wide-images.pdf");

上記の C# コードは、Docotic.Pdf を使用して画像を削除する方法を示しています。画像を変更または削除した後は、未使用のリソースを削除することをお勧めします。

PDF ドキュメント内のすべての画像を置き換えるには、PdfImage.ReplaceWith メソッドを使用します。

using var pdf = new PdfDocument("file-with-images.pdf");
var firstImage = pdf.GetImages(false).FirstOrDefault()
    ?? throw new ArgumentException("No images found");

firstImage.ReplaceWith("another-image.png");

pdf.RemoveUnusedResources();
pdf.Save("replaced-image.pdf");

圧縮方式を変更する

Docotic.Pdf は、PDF 画像の圧縮を変更する方法を提供します。JPEG、CCITT グループ 3 および 4 (FAX)、JPEG 2000、および zip/deflate 圧縮アルゴリズムを使用して画像を再パックできます。

初期圧縮と新しい圧縮によっては、変更によって画像の詳細や品質が失われる可能性があります。ただし、非可逆変換は通常、ドキュメント サイズの縮小 に役立ちます。

firstImage.RecompressWithJpeg2000(25);

画像を再パックする方法は他にもあります。RecompressWith で始まる名前の PdfImage メソッドを確認してください。Uncompress メソッドを使用して、画像から圧縮を解除できます。

画像のサイズ変更

PDF ドキュメント内の一部の画像が必要以上に大きい場合は、ライブラリでサイズを変更したり、縮小したりできます。

firstImage.Scale(0.5, PdfImageCompression.Jpeg2000, 25);

上記のコードは、最初の画像を両方向に 2 倍小さくします。ライブラリは、結果の画像に JPEG 2000 圧縮を使用します。

ResizeTo メソッドのいずれかを使用して、結果の幅と高さの正確な値を指定できます。

画像のサイズを変更すると、通常は圧縮を変更する場合よりも PDF ファイルのサイズが小さくなります (上記のセクションを参照) が、これは損失を伴うプロセスです。

透かしと背景

PDF の透かし

PDF に透かしを入れるには、次の手順に従います:

  • 透かしコンテンツ用のコンテナである XObject を作成します
  • オブジェクトにテキスト、画像、ベクター グラフィック を入力します
  • オブジェクトで PDF ページにスタンプを押します

以下は、PDF に Confidential 透かしを追加する C# コードです。

using var pdf = new PdfDocument("existing.pdf");

var watermark = pdf.CreateXObject();
watermark.DrawOnBackground = true;

var canvas = watermark.Canvas;
canvas.FontSize = 72;
canvas.Brush.Color = new PdfRgbColor(222, 35, 35);
canvas.Brush.Opacity = 45;
canvas.Pen.Color = canvas.Brush.Color;
canvas.Pen.Opacity = canvas.Brush.Opacity;
canvas.Pen.Width = 5;

var padding = 10;
var text = "CONFIDENTIAL";
canvas.DrawString(padding, padding, text);

var textSize = canvas.MeasureText(text);
var watermarkRect = new PdfRectangle(
    padding, padding, textSize.Width, textSize.Height);
canvas.DrawRoundedRectangle(watermarkRect, new PdfSize(padding, padding));

foreach (var page in pdf.Pages)
{
    page.Canvas.DrawXObject(
        watermark,
        (page.Width - watermarkRect.Width) / 2,
        (page.Height - watermarkRect.Height) / 2);
}

pdf.Save("watermarked.pdf");

このコードは、透かしキャンバスのブラシとペンのプロパティを設定します。ブラシはテキストを描画するために使用されます。テキストのサイズを調べるために、コードはテキストを測定します。次に、テキストの周囲に角の丸い四角形を描画します。ペンは四角形を描画するために使用されます。

透かしコンテンツの準備ができたら、コードはそれを各ページの中央に描画します。

PDF の背景は透かしと非常によく似ています。少なくとも、ほぼ同じ方法で作成できます。PDF に背景を追加するには、上記のコードと同じ操作を行いますが、CreateXObject 呼び出しの後に watermark.DrawOnBackground = true; を追加します。画像などの不透明なコンテンツは背景を隠す可能性があることに注意してください。

注釈

Docotic.Pdf は、PDF の注釈用の豊富な API を提供します。PDF ドキュメントから注釈を作成、編集、削除できます。注釈をフラット化 することも可能です。

テキストに注釈を付けるには、次の方法があります。

  • 付箋またはテキスト注釈。PdfPage クラスの AddTextAnnotation メソッドを参照してください。
  • ハイライト。AddHighlightAnnotation メソッドを参照してください。
  • 取り消し線。AddStrikeoutAnnotation メソッドを参照してください。
  • 下線。AddJaggedUnderlineAnnotation メソッドと AddUnderlineAnnotation メソッドを参照してください。

リンクを使用して、あるページから別のページまたは外部リソースにジャンプします。インク注釈を使用して、PDF ページにフリーハンドで描画できます。ドキュメントから削除するように指定された部分には、編集注釈があります。オーディオ、ビデオ、または 3D コンテンツを埋め込むこともできます。

テキストを強調表示

PDF ドキュメント内のテキストを強調表示する方法は次のとおりです。

using var pdf = new PdfDocument();

var page = pdf.Pages[0];
var canvas = page.Canvas;
canvas.FontSize = 30;

var text = "Highlighted text.";
var position = new PdfPoint(10, 50);
canvas.DrawString(position, text);
canvas.DrawString(" Not highlighted.");

var size = canvas.MeasureText(text);
var bounds = new PdfRectangle(position, size);

var color = new PdfRgbColor(145, 209, 227);
var annotationText = "Please pay attention to this part.";
page.AddHighlightAnnotation(annotationText, bounds, color);

pdf.Save("highlighted.pdf");

PDF 内の特定のページにリンクするには、次のようなコードを使用します。

using var pdf = new PdfDocument();
var secondPage = pdf.AddPage();
secondPage.Canvas.DrawString(10, 50, "Welcome to the second page.");

var firstPage = pdf.Pages[0];
var canvas = firstPage.Canvas;
var linkRect = new PdfRectangle(10, 50, 100, 60);
canvas.DrawRectangle(linkRect, PdfDrawMode.Stroke);

var options = new PdfTextDrawingOptions(linkRect)
{
    HorizontalAlignment = PdfTextAlign.Center,
    VerticalAlignment = PdfVerticalAlign.Center
};
canvas.DrawText("Go to 2nd page", options);

firstPage.AddLinkToPage(linkRect, 1);

pdf.Save("linked.pdf");

コードでは、アクション エリア注釈は内部ハイパーリンクとして機能します。このようなエリアは、外部リソースに移動したり、ナビゲーション以外のアクションを実行したりすることもできます。

注釈を削除する

PDF から注釈を削除するには:

  1. PdfPage.Widgets プロパティまたは PdfDocument.GetWidgets メソッドを使用してウィジェットのコレクションにアクセスします。
  2. タイプやプロパティを確認するか、不要になった注釈を決定します。
  3. PdfDocument.RemoveWidget メソッドまたは PdfWidgetCollection オブジェクトのメソッドを使用して注釈を削除します。

PDF から添付ファイルを削除するには、ファイル注釈と 共有添付ファイル の両方を削除する必要があります。

PDFを編集

PDF 編集ライブラリである Docotic.Pdf は、PDF ドキュメントから機密情報を永久に削除したり、すばやく黒く塗りつぶしたりする方法を提供します。

PDF 上の情報を黒く塗りつぶす

テキストを編集

ここでは、C# と Docotic.Pdf のみを使用して、Redact ツールを使用せずに PDF 内のテキストを黒くする方法を説明します。

int i = 0;
foreach (var page in pdf.Pages)
{
    foreach (var word in page.GetWords())
    {
        if (i % 3 == 0)
        {
            page.Canvas.AppendRectangle(word.Bounds);
            page.Canvas.FillPath(PdfFillMode.Winding);
        }

        i++;
    }
}

このコードは、ドキュメント内の 3 番目の単語ごとに黒い四角形を描画します。四角形の後ろのテキストはドキュメント内に残り、後で抽出できることに注意してください。テキストを完全に削除するには、テキストの置換 に関するセクションのアプローチを使用します。

画像を編集する

黒い四角形を使用して画像を覆うこともできます。ただし、より簡単な方法は、画像を 黒い 1 x 1 ピクセルの画像 に置き換えることです。これにより、編集された画像が視覚的に強調表示されるだけでなく、元の画像データも削除されます。

コード例については、画像の削除と置換 のセクションを確認してください。置換後に PdfDocument.ReplaceDuplicateObjects メソッドを呼び出すこともお勧めします。

PDFフォーム

Docotic.Pdf は、ボタン、チェックボックス、ドロップダウン リスト、リスト ボックス、ラジオ ボタン、テキスト フィールドなど、あらゆる種類のインタラクティブな要素を使用して Acroforms (PDF フォームの別名) を作成できます。

通常、フォーム フィールドを追加して設定するには、数行のコードのみが必要です。たとえば、PdfPage.AddTextBox メソッドを呼び出すだけで、PDF に編集可能なフィールドを追加できます。フォームと注釈グループ のサンプル コードには、フォームの作成と使用に関する詳細情報が記載されています。

PDFフォームに記入する方法

PdfDocument.GetControl メソッドを使用して、PDF コントロールを完全な名前または部分的な名前で検索します。別の方法として、GetControls メソッドを使用してドキュメント コントロールを列挙することもできます。どちらの場合も、コントロールを予想されるフィールド タイプにキャストする必要があります。

using var pdf = new PdfDocument(@"example-form.pdf");

if (pdf.GetControl("txt-name") is PdfTextBox nameTextBox)
    nameTextBox.Text = "Bit Miracle team";

if (pdf.GetControl("txt-email") is PdfTextBox emailTextBox)
    emailTextBox.Text = "support@bitmiracle.com";

if (pdf.GetControl("check-agree") is PdfCheckBox agreeCheckBox)
    agreeCheckBox.Checked = true;

pdf.Save("filled-form.pdf");

コードでは、この PDF フォームの例 を使用します。コードでは、2 つのテキスト フィールドに値を設定し、チェック ボックスをオンにします。

フォームへの入力が完了したら、すべてのフィールドをフラット化 できます。

フォームで JavaScript を使用する

イベントを制御するためのアクションを追加できます。PdfControl クラスは、定義済みのイベント セットへのアクセスを提供します。イベントの名前は On で始まります (例: OnMouseDown)。

PDF フォームに JavaScript を使用する例を次に示します。

using var pdf = new PdfDocument(@"example-form.pdf");
foreach (var field in pdf.GetControls())
    field.OnChange = pdf.CreateJavaScriptAction($"app.alert('{field.Name} changed!',3)");

pdf.Save("javascript-events.pdf");

フォームデータ形式

PDF に電子的に入力する方法がもう 1 つあります。ライブラリの FDF から PDF への変換機能を使用して、データベースまたは別のソースから PDF フォームに自動的に入力します。

using var pdf = new PdfDocument(@"example-form.pdf");
pdf.ImportFdf("form-data.fdf");
pdf.Save("auto-populated.pdf");

このコードは この FDF ファイル を使用して、すべてのフォーム フィールドに一度に入力します。

PDFをフラット化

このセクションでは、PDF をフラット化する方法について説明します。

PDF のフラット化

PDF をフラット化する場合、フォームや注釈などのインタラクティブな要素を静的コンテンツに変換して、それ以上編集できないようにします。フラット化された PDF は、見た目は同じまま、バイト数が大幅に少なくなります。

フォームと注釈をフラット化する

入力可能な PDF をフラット化するには、PdfDocument.FlattenControls メソッドを使用します。このメソッドは、すべてのフォーム フィールドとその他のコントロールを親ページに描画し、ドキュメントからソース コントロールを削除します。

PDF フォームをフラット化する場合は、注釈もフラット化するのが合理的です。コントロールと注釈の両方を同時にフラット化するには、PdfDocument.FlattenWidgets メソッドを使用します。

一部のコントロールや注釈のみを視覚的な表現に変換する場合は、PdfWidget.Flatten メソッドを使用します。まず、必要なコントロール または注釈を見つける必要があります。

テキストを平坦化する

Docotic.Pdf を使用すると、PDF テキストをアウトラインに変換できます。通常、この理由はフォントの独立性を実現するためです。フォントがインストールされているかどうかに関係なく、フラット化されたテキストはどのデバイスでも同じように見えます。

ただし、テキストをアウトラインに変換すると、テキストとして編集できなくなります。また、フラット化プロセス中に、ライブラリはテキストをベクター グラフィックに変換します。これにより、ファイル サイズが大きくなる可能性があります。

PDF テキストをフラット化するには、テキストをベクター パスとして抽出し、新しいページまたは同じページにコピーする必要があります。これには サンプル コード があります。

保存オプション

上記のコード スニペットでは、追加の引数なしで PdfDocument.Save メソッドを使用しました。このような場合、ライブラリはデフォルトの保存オプションを使用します。デフォルトは、通常の場合に完璧に機能するように厳選されています。

それでも、デフォルトのオプションを上書きする必要がある場合もあります。この場合は、PdfSaveOptions オブジェクトを作成し、オプションを設定して、保存メソッドの 1 つに渡します。次に、そのケースについて説明します。

PDF をパスワードまたは証明書で保護 するには、暗号化ハンドラーを作成し、それを EncryptionHandler プロパティに設定します。

同じ PDF に複数回署名 する場合は、WriteIncrementally プロパティを true に設定して増分更新モードをオンにします。以前に署名したファイルを新しい注釈またはフォーム データとともに保存する場合も、同じ操作を行います。

Linearize プロパティを true に設定すると、線形化された (または Fast Web View に最適化された) PDF ファイルが生成されます。この最適化を認識するビューアは、このようなファイルをより高速に表示できます。

一部の メタデータ フィールド への保存時の変更を防ぐには、UpdateProducer プロパティと UpdateModifiedDate プロパティを false に設定します。