このページには自動翻訳されたテキストを含めることができます。
C# で PDF を編集
Docotic.Pdf を使用して PDF ドキュメントを変更します。これは、強力な機能と直感的な API を組み合わせた、C# および VB.NET 向けの PDF 編集ライブラリです。
Docotic.Pdf は PDF ドキュメントを編集するための多くの手段を提供します。PDF 編集向けの主な機能は次のとおりです。
- 複数の PDF を 1 つに結合するか、1 つの PDF を複数のファイルに分割します。
- PDF ファイルサイズを削減します。
- ページの並べ替え、削除、回転、抽出を行います。
- PDF メタデータの読み取り、変更、削除を行います。
- デジタル署名で PDF に署名します。
- ドキュメントを暗号化するか、PDF からパスワードを削除します。
- 注釈や添付ファイルの追加、編集、削除を行います。
- AcroForms に入力し、フォーム コントロールを追加または削除します。
- フォーム フィールドと注釈をフラット化して、PDF コンテンツの一部にします。
- PDF 内のテキストを追加、削除、置換します。
- 画像の挿入、置換、サイズ変更を行います。
- ウォーターマークと背景を追加します。
- スキャンしたドキュメントを編集可能で検索可能なテキストに変換します。
次のセクションでは、PDF 編集機能をより詳しく説明します。各セクションにはコード スニペットと関連リソースへのリンクも含まれます。
PDF の結合と分割
このセクションでは、目的が反対の 2 つの機能を扱います。

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);
// コピーしたページが、フォント、画像、パターンなどの
// 未使用リソースを参照している場合に、ファイル サイズの削減に役立ちます。
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 内の画像が必要以上に大きい場合は、サイズを変更 できます。こちらのほうがさらに高い圧縮効果を得られる場合があります。別の方法として、画像を白黒(ビットonal)に変換することもできます。
余分な領域を削減するために、フォーム フィールドと注釈をフラット化 できます。ドキュメントで編集可能な注釈やフォーム フィールドが不要になった場合に有効です。
フォントはドキュメント内で大きな容量を占めることがあります。PdfDocument.RemoveUnusedFontGlyphs メソッドを使用すると、未使用のグリフをフォントから削除して出力サイズを最適化できます。フォント サブセット化はこの処理の別名です。フォント バイトをドキュメントから完全に削除することもできます(フォントの埋め込み解除)。これは、Arial のような一般的なフォントのバイトがドキュメントに含まれている場合に有効です。
他の変換では、ドキュメントから情報を直接削除します。メタデータ、構造情報、アプリケーション固有データを削除できます。これらのデータは表示されませんが、ドキュメント利用者にとって重要でない場合にのみ削除してください。
詳細とコード例については、PDF ファイルサイズを削減する方法 の記事を参照してください。
PDF のページ順を変更する
PDF 内のページ順を変更する理由はいくつもあります。たとえば、関連情報をまとめる必要がある場合や、ドキュメントの流れを論理的にして読みやすくしたい場合があります。

ページの結合と分割 以外にも、Docotic.Pdf には PDF のページを並べ替えるための広範なメソッドがあります。ここでは C# のコード スニペットと Docotic.Pdf API を使って、PDF ページの整理方法を示します。
このセクションの例に対応する完全なテスト プロジェクトは、サンプル コードの Pages and Navigation グループにあります。スニペットでは 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 つの連続した操作として実行できます。1 つ目はページのコピーです。PDF の分割 セクションのコード例を参照してください。
2 つ目はページの貼り付け操作です。この操作には PdfDocument.Append メソッドを使用します。次に、追加したページを移動 して必要な位置に配置します。
ページの抽出
次のスニペットは、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 ページを削除しています。1 つ目のオーバーロードは、ページ インデックスをパラメーターとして受け取ります。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 に複数の署名を追加するには、ドキュメントを段階的に保存する必要があります。
署名タイムスタンプを埋め込む。署名オプションで Timestamping Authority の URL と、必要に応じて資格情報を指定できます。ライブラリは受信したタイムスタンプを署名に埋め込みます。
証明書を埋め込む。ライブラリは署名証明書をデジタル署名に自動的に埋め込みます。
デジタル署名のページ には、各操作のサンプル コードと詳細情報があります。
PDF の保護
PDF のセキュリティを確保するために使える機能は 3 つあります。Docotic.Pdf は両方向で動作し、PDF を保護することも、保護された PDF のロックを解除することもできます。

パスワード保護
この機能を使用すると、パスワードを設定して PDF へのアクセスを制限できます。パスワードの種類に応じて、PDF を開く、または変更するには正しいパスワードが必要になります。
PDF には 2 種類のパスワードがあります。
- オープン パスワード(ユーザー パスワード)。この種類のパスワードは、PDF を開いて表示するために必要です。正しいパスワードがないと、PDF 対応のビューアーはドキュメントを開きません。
- 権限パスワード(所有者パスワード)。このパスワードは、PDF から権限を削除するために必要です。所有者パスワードで PDF を開くと、印刷、コピー、PDF の編集などの一部の操作に権限制限があっても、すべての操作が可能になります。
同じ PDF ドキュメントに対して、両方のパスワードを設定 できます。PDF ドキュメントからパスワードを削除する方法については、PDF ファイルの復号化 を参照してください。
暗号化
PDF 暗号化と PDF パスワードは連携して、PDF 内の機密情報を正当なユーザーのみに提供します。正しい復号キーまたはパスワードを持つユーザーだけが内容を表示できます。
Docotic.Pdf は、RC4 40-bit、RC4 128-bit、AES 128-bit、および AES 256-bit 暗号化 アルゴリズムを使用して PDF ファイルを暗号化できます。
権限と制限
印刷、テキストのコピー、ドキュメントの編集などを制限する など、PDF に対してさまざまな権限を設定できます。権限は、ユーザー パスワードで PDF を開いたときの動作にのみ影響します。所有者パスワードで PDF を開いた場合は、制限は適用されません。
PDF から権限を削除するには、まず PDF のセキュリティ パスワードを削除する必要があります。C# と Docotic.Pdf API を使ってこれを行う方法は、こちら を参照してください。
PDF のセキュリティに加えて PDF の完全性 を確保する方法については、デジタル署名のセクションを参照してください。
PDF のメタデータ
PDF メタデータは、PDF ファイル内に埋め込まれた、ドキュメントに関する情報です。主なメタデータ ソースは 2 つあり、PDF ドキュメントのプロパティと XMP メタデータです。
Document properties は、一般に document information dictionary、file info、metadata fields、document attributes、file attributes とも呼ばれます。
XMP(Extensible Metadata Platform)メタデータは、基本的には PDF に埋め込まれた XML ファイルです。XMP は、任意のメタデータ プロパティの集合を保存できる柔軟なデータ モデルを使用します。このメタデータは、関連するプロパティをグループ化するために名前空間を使用します。一般的な名前空間には XMP Core/XMP Basic と Dublin Core があります。
Docotic.Pdf は XMP メタデータと document properties の両方を完全にサポートしています。PDF 2.0 標準では、document information dictionary のほとんどのプロパティが非推奨としてマークされている点に注意してください。例外は作成日と変更日だけです。
このセクションの例に対応する完全なテスト プロジェクトは、サンプル コードの Metadata group にあります。
文書情報
Docotic.Pdf を使用して document properties を編集する方法を確認してください。
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 を保存する前に一部のプロパティを自動更新する点に注意してください。これは 保存オプション で変更できます。
document properties に指定されたすべてのメタデータを削除するには、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 と Adobe PDF のスキーマ内のプロパティを変更します。Producer プロパティは 既定の保存オプション によって上書きされる点に注意してください。
XmpMetatada.Save メソッドのいずれかを使用して、生の XMP メタデータを抽出できます。このメソッドは、すべてのプロパティを含む XML を生成します。
ドキュメントから XMP メタデータをすべて削除するには、XmpMetadata.Unembed メソッドを使用します。
メタデータの同期
XMP メタデータと Document Info の対応するプロパティが同じ値を持つようにしておくことが望ましいです。特に、同じファイル内で両方のメタデータ ソースを編集する場合に重要です。
PdfDocument.SyncMetadata メソッドを使用して、XMP Metadata と Document Info の値を同期します。両方のソースでプロパティが変更されている場合、メソッドは一方のソースを他方のソースの値で上書きします。詳細はメソッドのドキュメント を参照してください。
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 ドキュメントの結合 に関する記事を参照してください。
次の C# コードは、Docotic.Pdf API を使って PDF に添付ファイルを追加する例です。
using var pdf = new PdfDocument();
var excelFile = pdf.CreateFileAttachment("this-year-figures.xlsx");
pdf.SharedAttachments.Add(excelFile);
pdf.Save("shared-attachment.pdf");
上のコードは、ファイルを共有添付として追加しました。読者は、ビューアーの Attachments パネルで添付ファイルを見つけられます。
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");
このセクションの例に対応する完全なテスト プロジェクトは、サンプル コードの Attachments group で確認できます。
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 ページのラベルは i、ii、iii、iv になります。次の 3 つのラベルは 5、6、7 です。残りのページのラベルは Appendix page 1、Appendix page 2、Appendix page 3 になります。
OCR PDF
PDF ドキュメントの中にはスキャンしたページを含み、そこからテキストを抽出する前に OCR(光学式文字認識)が必要なものがあります。OCR のもう 1 つの用途は、独自のグリフから Unicode へのマッピングを使用する PDF からテキストを抽出することです。

OCR でスキャンした ドキュメントを紹介するブログ記事があります。この投稿には検索不可の PDF の例が含まれており、Tesseract OCR、C# コード、Docotic.Pdf を使用して画像のみの PDF 内のテキストを認識する方法を示しています。Docotic.Pdf を使って、スキャンした PDF ファイルに OCR テキスト レイヤーを追加することもできます。
ページの編集
このセクションでは、既存の PDF ページに対する変更について説明します。たとえば、次のようなものです。
- PDF ページの回転方法
- ページ サイズの変更方法
- ページ キャンバスでのベクター グラフィックスの使用
- HTML コンテンツの追加
ヘッダー、フッター、表、画像、テキスト段落などの構成要素からPDF ドキュメントを作成する方法 を知りたい場合は、ライブラリの Layout 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");
ページの一部を画像として保存したい場合は、CropBox を変更する方法が適しています。
異なるサイズのページでもすべてのコンテンツを表示したままにしたい場合は、スケーリングの方法を使用します。次のコード スニペットでは、ページから 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 ドキュメントに追加できます。グラフィックス オブジェクトからグラフィックス パスを構築できます。その後、異なる色空間の色を使ってパスを塗りつぶしたり、線を描画したりできます。
グラフィックス関連機能の例は、サンプル コードの Graphics group で確認できます。
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 を追加
HTML コンテンツを PDF ドキュメントに重ねると、グラフや株価ティッカーのような動的要素を PDF に追加するのに便利です。
PDF に HTML を挿入する方法 を参照すると、詳細情報とサンプル コードをダウンロードできます。
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.CreateFont("NSimSun");
canvas.DrawString(10, 50, "Olá. 你好. Hello. This is some new text");
Type1、TrueType、OpenType フォントで描画した Unicode テキストを追加できます。ライブラリは、システムにインストールされているフォント、14 の組み込み Type1 フォント、またはファイルから読み込んだ必要なフォントを使用できます。
テキスト色の変更
PDF 内のテキストの色を変更するには、テキストの削除 と同じ方法を使用します。サンプル コードでは、少なくとも ReplaceColor メソッドを変更する必要があります。
画像
Docotic.Pdf は、PDF 画像の編集に必要なすべてを提供します。以下は、最も一般的な操作の C# コード スニペットです。
このセクションの例に対応する完全なテスト プロジェクトは、サンプル コードの Images group にあります。
PDF に画像を追加
ライブラリは、GIF/TIFF/PNG/BMP/JPEG 形式の画像を取り込めます。System.Drawing.Image オブジェクトから画像を追加することもできます。
var canvas = pdf.Pages[0].Canvas;
var image = pdf.CreateImage("image.jpg");
canvas.DrawImage(image, 10, 50);
DrawImage メソッドのオーバーロードを使用して、回転角度と出力サイズを指定できます。同じ画像を複数ページに描画するには、画像を 1 回だけ追加し、同じ PdfImage オブジェクトを DrawImage メソッドの複数回の呼び出しで使用します。
画像を 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.CreateImage(path);
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}");
}
画像の削除と置換
PdfPage.RemovePaintedImages メソッドを使用すると、PDF ページからすべての画像、または特定の画像を削除できます。画像は位置、サイズ、変換、その他のパラメーターでフィルターできます。
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 を使って画像を削除する方法を示しています。画像を変更または削除した後は、未使用リソースを削除することを推奨します。
PdfImage.ReplaceWith メソッドを使用すると、PDF ドキュメント内の画像のすべての出現箇所を置換できます。
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 Group 3 および 4(fax)、JPEG 2000、zip/deflate 圧縮アルゴリズムを使用して画像を再パックできます。
元の圧縮と新しい圧縮の組み合わせによっては、変更により細部の損失や画像品質の低下が発生する場合があります。ただし、破壊的変換は通常、ドキュメント サイズの削減 に役立ちます。
firstImage.RecompressWithJpeg2000(25);
画像を再パックする他のメソッドもあります。RecompressWith で始まる名前の PdfImage メソッドを確認してください。Uncompress メソッドを使用すると、画像から圧縮を削除できます。
画像のサイズ変更
PDF ドキュメント内の画像が必要以上に大きい場合、ライブラリがサイズ変更や縮小を行えます。
firstImage.Scale(0.5, PdfImageCompression.Jpeg2000, 25);
上のコードは、最初の画像を縦横ともに 2 分の 1 にします。結果の画像には JPEG 2000 圧縮が使用されます。
ResizeTo 系メソッドのいずれかを使用して、結果の幅と高さを正確に指定できます。
画像のサイズ変更は、通常、圧縮方式の変更よりも 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");
このコードは、ウォーターマーク キャンバスの brush と pen のプロパティを設定しています。brush はテキストの描画に使用されます。テキスト サイズを調べるために、コードはテキストを測定します。その後、テキストの周囲に角丸の長方形を描画します。pen は長方形の線を描画するために使用されます。
ウォーターマーク コンテンツの準備ができたら、コードは各ページの中央にそれを描画します。
PDF の背景はウォーターマークと非常によく似ています。少なくとも、ほぼ同じ方法で作成できます。PDF に背景を追加するには、上記のコードと同じようにし、CreateXObject 呼び出しの後に watermark.DrawOnBackground = true; を追加します。画像のような不透明なコンテンツは背景を隠す場合がある点に注意してください。
注釈
Docotic.Pdf は、PDF の注釈に対して豊富な API を提供します。PDF ドキュメントから注釈の作成、編集、削除ができます。注釈のフラット化 も可能です。
テキストに注釈を付ける方法には次のものがあります。
- 付箋またはテキスト注釈。
PdfPageクラスのAddTextAnnotationメソッドを参照してください。 - ハイライト。
AddHighlightAnnotationメソッドを参照してください。 - 取り消し線。
AddStrikeoutAnnotationメソッドを参照してください。 - 下線。
AddJaggedUnderlineAnnotationメソッドとAddUnderlineAnnotationメソッドを参照してください。
リンクを使って、1 ページから別のページ、または外部リソースへ移動できます。インク注釈を使えば、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 から注釈を削除するには、次の手順を実行します。
PdfPage.WidgetsプロパティまたはPdfDocument.GetWidgetsメソッドを使用して、ウィジェットのコレクションにアクセスします。- 型やプロパティを確認し、不要な注釈を判断します。
PdfDocument.RemoveWidgetメソッドまたはPdfWidgetCollectionオブジェクトのメソッドを使用して注釈を削除します。
PDF から添付ファイルを削除するには、ファイル注釈と 共有添付 の両方を削除する必要があります。
PDF の墨消し
PDF の墨消しライブラリとして、Docotic.Pdf は PDF ドキュメントから機密情報を永続的に削除したり、すばやく黒塗りしたりするメソッドを提供します。

テキストの墨消し
Redact ツールを使わずに、C# と Docotic.Pdf だけで 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 語ごとに黒い長方形を描画します。長方形の背後にあるテキストはドキュメント内に残り、後で抽出できる点に注意してください。テキストを永続的に削除するには、テキストの置換 セクションの方法を使用します。
画像の墨消し
黒い長方形で画像を覆うこともできます。ただし、より簡単な方法は、画像を 黒い 1x1 ピクセルの画像 に置き換えることです。これにより、黒塗りした画像を視覚的に強調するだけでなく、元の画像データも削除されます。
コード例については、画像の削除と置換 のセクションを確認してください。置換後に PdfDocument.ReplaceDuplicateObjects メソッドを呼び出すことも推奨します。
PDF フォーム
Docotic.Pdf は、ボタン、チェックボックス、ドロップダウン リスト、リスト ボックス、ラジオ ボタン、テキスト フィールドなど、さまざまな対話型要素を使用して Acroforms(PDF フォームの別名)を作成できます。
フォーム フィールドの追加と設定には、通常、数行のコードしか必要ありません。たとえば、PdfPage.AddTextBox メソッドを呼び出すだけで、PDF に編集可能なフィールドを追加できます。Forms and Annotations group のサンプル コードには、フォームの作成と使用に関する詳細があります。
PDF フォームへの入力方法
PdfDocument.TryGetControl メソッドを使用して、完全名または部分名で PDF コントロールを取得します。別の方法として、GetControls メソッドでドキュメント内のすべてのコントロールを列挙することもできます。どちらの場合も、結果を期待するフィールド型にキャストする必要があります。
using var pdf = new PdfDocument(@"example-form.pdf");
if (pdf.TryGetControl("txt-name", out var c) && c is PdfTextBox nameTextBox)
nameTextBox.Text = "Bit Miracle team";
if (pdf.TryGetControl("txt-email", out c) && c is PdfTextBox emailTextBox)
emailTextBox.Text = "support@bitmiracle.com";
if (pdf.TryGetControl("check-agree", out c) && c 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");
Forms Data Format
PDF を電子的に入力する方法はもう 1 つあります。ライブラリの FDF to 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 をフラット化するには、PdfDocument.FlattenControls メソッドを使用します。このメソッドは、すべてのフォーム フィールドと他のコントロールを親ページ上に描画し、元のコントロールをドキュメントから削除します。
PDF フォームをフラット化する場合、注釈もフラット化すると有効です。PdfDocument.FlattenWidgets メソッドを使用すると、コントロールと注釈を同時にフラット化できます。
一部のコントロールや注釈だけを視覚的な表現に変換したい場合は、PdfWidget.Flatten メソッドを使用します。まず必要なコントロールまたは注釈を見つける 必要があります。
テキストのフラット化
Docotic.Pdf を使って PDF テキストをアウトラインに変換できます。通常その目的は、フォント依存をなくすことです。フォントがインストールされているかどうかに関係なく、フラット化されたテキストはどのデバイスでも同じように表示されます。
ただし、テキストをアウトラインに変換すると、もはやテキストとして編集できません。また、フラット化処理の間に、ライブラリはテキストをベクター グラフィックスに変換します。そのため、ファイル サイズが増加することがあります。
PDF テキストをフラット化するには、テキストをベクター パスとして抽出し、新しいページまたは同じページにコピーする必要があります。これに関するサンプル コード があります。
保存オプション
上のコード スニペットでは、追加の引数なしで PdfDocument.Save メソッドを使用しました。このような場合、ライブラリは既定の保存オプションを使用します。通常のケースで完全に機能するように、既定値は慎重に選択されています。
それでも、既定オプションを上書きする必要がある場合があります。その場合は、PdfSaveOptions オブジェクトを作成し、オプションを設定して、いずれかの保存メソッドに渡します。以下で、そのようなケースを説明します。
パスワードまたは証明書で PDF を保護する には、暗号化ハンドラーを作成し、EncryptionHandler プロパティに設定します。
同じ PDF に複数回署名する 場合は、WriteIncrementally プロパティを true に設定して、段階的更新モードを有効にします。新しい注釈やフォーム データを追加して、以前に署名されたファイルを保存する場合も同様です。
線形化された(または Fast Web View に最適化された)PDF ファイルを生成するには、Linearize プロパティを true に設定します。この最適化を認識するビューアーでは、そのようなファイルをより速く表示できます。
メタデータ フィールド の一部に対する保存時の変更を防ぐには、UpdateProducer プロパティと UpdateModifiedDate プロパティを false に設定します。