チュートリアル
簡単にライブラリーを使用するためのチュートリアルコレクション

PDF のフラット化(Flatten) とは、ドキュメント内のインタラクティブオブジェクトを固定ページコンテンツに変換する処理です。入力済みのフォームフィールドは入力コントロールを失い、その値はテキストとしてページに残ります。レビューアーのコメントはページ外観の一部となり、オプションコンテンツレイヤーは現在表示されているコンテンツから各ページを再構築することで削除されます。フラット化後のドキュメントは、個々の PDF ビューアーのインタラクティブ機能に依存しなくなります。ただし、ページコンテンツ自体は PDF エディタで編集可能です。
本ガイドでは、Spire.PDF for .NET を使用して C# で PDF をフラット化 する方法を解説します。フォーム全体の一括フラット化、指定フィールドのみのフラット化、全ページの注釈フラット化、SVG を経由したレイヤーのフラット化を取り上げ、最後に検証手順を示します。フラット化されたファイルは元のファイルとほぼ同じ外観を持つため、差異は構造的であり視覚的ではありません。
クイックナビゲーション
Spire.PDF for .NET は NuGet パッケージとして提供されています。.NET CLI でインストールします。
dotnet add package Spire.PDF
本記事の例は Spire.PDF for .NET 12.9.18 で動作確認しています。
Spire.PDF for .NET のダウンロードから手動でプロジェクトに追加することも可能です。
フラット化に関わる名前空間は以下の 3 つです。
| 名前空間 | 含まれるクラス |
|---|---|
Spire.Pdf |
PdfDocument、PdfPageBase、FileFormat |
Spire.Pdf.Widget、Spire.Pdf.Fields |
PdfFormWidget および PdfField -- フォーム関連 |
Spire.Pdf.Interactive.Annotations |
PdfAnnotation、PdfAnnotationCollection -- 注釈関連、Flatten() を含む |
フラット化はインタラクティブオブジェクトの外観をページコンテンツに押し込み、オブジェクト自体を削除します。目的は可視外観を保ちつつインタラクティブ性を除去することです。だからこそ本ガイドでは、スクリーンショットを比較するのではなく、保存されたファイルに残っているオブジェクト数をカウントして結果を検証します。
オブジェクトの種類ごとに呼び出し方が異なります。
| オブジェクト | フラット化方法 |
|---|---|
| フォームフィールド(テキストボックス、チェックボックス、リストボックス、コンボボックス) | PdfForm.IsFlatten でフォーム全体、PdfField.Flatten で個別フィールド |
| 注釈(コメント、ハイライト、スタンプ、フリーテキスト) | 各注釈に PdfAnnotation.Flatten() を呼び出し |
| レイヤー(オプションコンテンツグループ) | PDF → SVG → PDF 変換で各ページを可視コンテンツから再構築 |
Form.IsFlatten を true に設定するだけで、ドキュメント内の全フィールドが一度の処理で変換されます。
using Spire.Pdf;
PdfDocument pdf = new PdfDocument();
pdf.LoadFromFile("FillableForm.pdf");
// すべてのフィールドとその現在の値がページコンテンツになります。
pdf.Form.IsFlatten = true;
pdf.SaveToFile("FlattenedForm.pdf");
pdf.Close();
ここで使用した登録フォーム(5 つのフィールド、うち 3 つ入力済み)では、フィールド数が 5 から 0 に減少します。入力値は選択可能なテキストとしてページに残ります。

より一般的な要件は、入力完了済みのフィールドのみをロックすることです。完成したセクションを読み取り専用にしつつ、残りのフォームは入力可能なまま残します。フィールドには PdfFormWidget の FieldsWidget コレクションを経由してアクセスし、各フィールドの Flatten はブール型プロパティです。
using Spire.Pdf;
using Spire.Pdf.Fields;
using Spire.Pdf.Widget;
PdfDocument pdf = new PdfDocument();
pdf.LoadFromFile("FillableForm.pdf");
PdfFormWidget formWidget = pdf.Form as PdfFormWidget;
foreach (PdfField field in formWidget.FieldsWidget)
{
// 確定済みフィールドをフラット化し、残りは入力可能なままにする。
if (field.Name == "full_name" || field.Name == "email" || field.Name == "department")
{
field.Flatten = true;
}
}
pdf.SaveToFile("PartiallyFlattenedForm.pdf");
pdf.Close();
サンプルフォームでは 3 つのフィールドがフラット化され、start_date と manager は編集可能なまま残ります。フィールド数は 5 から 2 に減少します。フィルタ条件はフォームが定義するフィールド名に依存します。FieldsWidget からフィールド名を読み取り、正確に照合してください。

フラット化とフィールド削除の違い。 フラット化はフィールドの可視外観(入力された値を含む)を保持し、インタラクティブ性のみを削除します。フォームフィールドの削除はオブジェクトと外観を一緒に消去します。削除が真の目的であれば、PDF からフォームフィールドを削除を参照してください。
注釈はレビューアーがページ上に残すオブジェクトです。テキストコメント、ハイライト、スタンプ、フリーテキストボックスがあります。Spire.PDF for .NET では、インタラクティブ注釈モデルを通じてフラット化します。各ページに PdfAnnotationCollection を作成し、各注釈に Flatten() を呼び出します。
using Spire.Pdf;
using Spire.Pdf.Interactive.Annotations;
PdfDocument pdf = new PdfDocument();
pdf.LoadFromFile("ReviewedDocument.pdf");
foreach (PdfPageBase page in pdf.Pages)
{
if (page.Annotations.Count == 0) continue;
PdfAnnotationCollection annotations = PdfAnnotationCollection.Create(page);
// Flatten() がコレクションから注釈を削除するため、逆順で走査する。
for (int i = annotations.Count - 1; i >= 0; i--)
{
annotations[i].Flatten();
}
}
pdf.SaveToFile("FlattenedAnnotations.pdf");
pdf.Close();
本ガイドで使用した契約書レビューページには 3 つの注釈(フリーテキストメモ、ゴムスタンプ、条項上の黄色いハイライト)があります。ループ終了後、注釈数は 3 から 0 になり、3 つのマークはすべてページ上に描画されたまま残ります。メモはボックスと色を保持し、スタンプは境界を保持し、ハイライトはテキストの背後に残ります。消えるのはインタラクティブオブジェクトのみです。ハイライトが保持されるのは、その四点座標がメモリ上のページではなく保存済みページから読み取られるためです。

ループ内の 2 つの詳細に注意してください。コレクションを逆順で走査します。Flatten() は各注釈をフラット化すると同時にコレクションから削除するため、逆順ループにより各項目を正確に 1 回ずつ処理します。Flatten() は Spire.Pdf.Interactive.Annotations.PdfAnnotation に宣言されており、これが注釈コレクションの作成元となるモデルです。
オプションコンテンツレイヤーは、現在表示されているコンテンツから各ページを再構築することで削除します。各ページを SVG に変換し、SVG から PDF を再構築します。このラウンドトリップは各ページを再描画し、レイヤー構造を削除しつつテキストはテキスト、グラフィックはベクターとして保持します。そのため、画像にレンダリングしたページとは異なり、結果は引き続き選択、検索、スケーリングが可能です。
レイヤーを含むドキュメントを 1 ページずつ変換します。
using System;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using Spire.Pdf;
// 実行ごとに新しい一時フォルダで作業する。
string workDir = Path.Combine(Path.GetTempPath(),
"flatten_svg_" + Guid.NewGuid().ToString("N").Substring(0, 8));
Directory.CreateDirectory(workDir);
try
{
// ステップ 1 - 各ページを個別の SVG ファイルとして保存。複数ページのドキュメントは
// page_1.svg、page_2.svg、... を生成。単一ページのドキュメントは page.svg を生成。
PdfDocument source = new PdfDocument();
source.LoadFromFile("LayeredDocument.pdf");
int pageCount = source.Pages.Count;
source.SaveToFile(Path.Combine(workDir, "page.svg"), FileFormat.SVG);
source.Close();
// ページ番号順にファイルをソート。単一ページのドキュメントは page.svg を生成。
string[] svgFiles = Directory.GetFiles(workDir, "*.svg")
.OrderBy(f =>
{
Match m = Regex.Match(Path.GetFileNameWithoutExtension(f), @"\d+$");
return m.Success ? int.Parse(m.Value) : 0;
})
.ToArray();
// ページごとに 1 つの SVG -- 下のマージステップでこの数を使用。
if (svgFiles.Length != pageCount)
{
throw new IOException(
$"SVG 変換が {pageCount} ページに対して {svgFiles.Length} 個のファイルを生成しました。");
}
// ステップ 2 - 各 SVG を読み込み直し、1 ページの PDF として保存。
string[] pageFiles = new string[svgFiles.Length];
for (int i = 0; i < svgFiles.Length; i++)
{
PdfDocument page = new PdfDocument();
page.LoadFromSvg(svgFiles[i]);
pageFiles[i] = Path.Combine(workDir, "page_" + (i + 1) + ".pdf");
page.SaveToFile(pageFiles[i], FileFormat.PDF);
page.Close();
}
// ステップ 3 - 1 ページの PDF をページ順に結合して 1 つのドキュメントにする。
PdfDocument.MergeFiles(pageFiles, "FlattenedLayers.pdf");
}
finally
{
Directory.Delete(workDir, true);
}
ファイル名はページ数に依存します。2 ページのレイヤー付きドキュメントを page.svg に保存すると page_1.svg と page_2.svg が生成され、1 ページのドキュメントは番号なしの page.svg を生成します。サンプルドキュメントでは、ラウンドトリップが両ページを元のページサイズで順序通りに保持し、各レイヤーに描画されたテキストを保持し、レイヤー数は 4 から 0 に減少します。同じワークフローを 1 ページのドキュメントに適用すると 1 ページが返されます。

テキストとベクターグラフィックはラウンドトリップで損なわれないため、再構築されたページは元のページと同様に選択、検索、スケーリングが可能で、各レイヤーに描画されたコンテンツはページに残ります。
ファイルをプリンターや印刷業者、制御できないビューアーに送付する場合、印刷前に PDF をフラット化します。フォームフィールド、注釈、レイヤーが通常のページコンテンツになれば、印刷内容はビューアーのインタラクティブ機能ではなくファイル自体によって決定されます。
別途コードは不要です。ドキュメントにフィールドがあればフォーム系の呼び出しを、コメントがあれば注釈ループを、レイヤーの可視性が印刷内容に影響する可能性があれば SVG ワークフローを使用し、送付前に以下の検証ステップで出力を確認します。
フラット化されたファイルは元のファイルと同じ外観を持つため、レンダリングを確認するのではなく、保存されたファイル内のオブジェクト数をカウントして結果を確認します。
using Spire.Pdf;
using Spire.Pdf.Fields;
using Spire.Pdf.Widget;
PdfDocument result = new PdfDocument();
result.LoadFromFile("FlattenedForm.pdf");
int fields = 0;
PdfFormWidget form = result.Form as PdfFormWidget;
if (form != null)
{
foreach (PdfField field in form.FieldsWidget) fields++;
}
int annotations = 0;
foreach (PdfPageBase page in result.Pages)
{
annotations += page.Annotations.Count;
}
Console.WriteLine($"pages={result.Pages.Count} fields={fields} "
+ $"annotations={annotations} layers={result.Layers.Count}");
result.Close();
PdfFormWidget.FieldsWidget でフィールド数をカウントします。サンプルファイルでの出力は以下の通りです。
| ファイル | ページ数 | フィールド | 注釈 | レイヤー |
|---|---|---|---|---|
FillableForm.pdf(入力) |
1 | 5 | 0 | 0 |
FlattenedForm.pdf |
1 | 0 | 0 | 0 |
PartiallyFlattenedForm.pdf |
1 | 2 | 0 | 0 |
ReviewedDocument.pdf(入力) |
1 | 0 | 3 | 0 |
FlattenedAnnotations.pdf |
1 | 0 | 0 | 0 |
LayeredDocument.pdf(入力) |
2 | 0 | 0 | 4 |
FlattenedLayers.pdf |
2 | 0 | 0 | 0 |
続いて視覚結果を確認します。ビューアーでファイルを開き、クリックやトグルができないことを確認し、ページ数とページサイズを元のファイルと比較し、テキストを選択または抽出して実際のテキストのままであることを確認します。
上記のスニペットはそれぞれ 1 つの課題を解決します。ここではフォームフィールドと注釈を一度の処理でフラット化する単一のメソッドとして統合します。
using Spire.Pdf;
using Spire.Pdf.Interactive.Annotations;
/// <summary>
/// PDF のフォームフィールドと注釈を一度の処理でフラット化する。
/// </summary>
public static void FlattenDocument(string inputFile, string outputFile)
{
PdfDocument pdf = new PdfDocument();
pdf.LoadFromFile(inputFile);
// 1. フォームフィールド: 1 つのフラグでドキュメント内の全フィールドをカバー。
if (pdf.Form != null)
{
pdf.Form.IsFlatten = true;
}
// 2. 注釈: Flatten() が各注釈を削除するため逆順で走査。
// 注釈のないページはスキップ。
foreach (PdfPageBase page in pdf.Pages)
{
if (page.Annotations.Count == 0) continue;
PdfAnnotationCollection annotations = PdfAnnotationCollection.Create(page);
for (int i = annotations.Count - 1; i >= 0; i--)
{
annotations[i].Flatten();
}
}
pdf.SaveToFile(outputFile);
pdf.Close();
}
ガード条件によりループは注釈を持つページのみを処理するため、フォームフィールドのみのドキュメントにも同じメソッドが使えます。このメソッドで 5 フィールドのフォームは 0 フィールドに、契約書レビューページは注釈 3 から 0 になります。レイヤー付きドキュメントは前節の SVG ワークフローで処理します。
フラット化はフィールドの可視外観(入力された値を含む)を保持し、インタラクティブ性のみを削除します。フォームフィールドの削除はフィールドオブジェクトと外観を一緒に消去します。
はい。pdf.Form を PdfFormWidget にキャストし、FieldsWidget を走査して、指定フィールドに Flatten = true を設定します。残りのフィールドは入力可能なまま残ります。
はい。フラット化されたテキストフィールドは値をページのテキストレイヤーに保持し、SVG ラウンドトリップも再描画したテキストを保持するため、値は引き続き選択、コピー、検索が可能です。
フラット化はフィールドと注釈をページに書き込むため、後で編集する可能性がある場合は元の PDF ファイルを保管してください。
常に必要というわけではありませんが、ビューアーへの依存をなくせます。フラット化により、可視コンテンツがインタラクティブフィールド、注釈、レイヤーの可視性設定に依存しなくなるため、異なる PDF ビューアー間でより一貫した出力が得られます。
C# での PDF フラット化は、オブジェクトの種類ごとに 1 回の呼び出しで実行できます。
pdf.Form.IsFlatten = true でドキュメント内の全フィールドをフラット化。PdfField.Flatten で指定フィールドをフラット化。PdfAnnotationCollection.Create(page) と各注釈への Flatten() を逆順で呼び出し、ページ上の全コメント、ハイライト、スタンプをフラット化。PdfDocument.MergeFiles でマージすることでフラット化。いずれの方法でもページ外観は保持されるため、スクリーンショットの比較ではなく、保存されたファイルに残っているオブジェクト数をカウントして検証してください。
実際のビジネス環境で Spire.PDF for .NET をテストする必要がある場合は、一時ライセンスの申請が可能です。

多くの Web アプリケーションにおいて、PDF ファイルは単なるダウンロード用の添付ファイルではありません。請求書、財務レポート、契約書、証明書、あるいは異なるデバイス間でもレイアウトを維持する必要のあるデータ出力など、PDF は業務フローの最終成果物として重要な役割を果たします。
ASP.NET 開発者にとって、サーバーサイドで PDF を直接生成することは非常に一般的な要件です。 従来の ASP.NET MVC アプリケーションを保守している場合でも、最新の ASP.NET Core サービスを構築している場合でも、コードによって PDF を生成することで、ドキュメントの構造・レイアウト・印刷結果を一貫して制御できます。
しかし、実際の開発現場では、ASP.NET における PDF 生成は必ずしも「すぐに使える」ものではなく、次のような課題に直面することが少なくありません。
本記事では、これらの課題を踏まえつつ、Spire.PDF for .NET を使用して、ASP.NET および ASP.NET Core 環境で C# による PDF 生成を行う実践的な方法を体系的に解説します。MVC や Web API といった一般的なプロジェクト構成にも対応しており、実務にそのまま適用できる内容となっています。
この記事を読み終える頃には、ASP.NET における PDF 生成の仕組みを明確に理解し、実際の業務システムへスムーズに組み込めるようになるでしょう。
ASP.NET または ASP.NET Core プロジェクトで PDF 生成を開始する前に、まず開発環境が正しく構成されていることを確認する必要があります。適切な環境設定を行うことで、実行時エラーや互換性の問題を未然に防ぐことができます。
ASP.NET Framework プロジェクトのターゲット フレームワークは .NET Framework 4.6.1 以上である必要があります。
ASP.NET Core プロジェクト要件に応じて .NET 6 または .NET 7 SDK をインストールしてください。
インストール済みの SDK バージョンは、次のコマンドで確認できます。
dotnet --version
PDF を生成するには、プロジェクトと互換性のある PDF ライブラリが必要です。Spire.PDF for .NET は、ASP.NET Framework と ASP.NET Core の両方をサポートする実績あるライブラリです。
Install-Package Spire.PDF
または、直接Spire.PDF for .NET をダウンロードして手動で追加することもできます。
ASP.NET Framework
ASP.NET Core
また、PDF をファイルとして保存する場合は、実行環境に書き込み権限があること、および日本語表示に必要なフォントが利用可能であることも確認しておきましょう。
本章では、ASP.NET Framework アプリケーションにおいて C# を使用して PDF ファイルを生成する方法を紹介します。従来型の ASP.NET Web Forms および ASP.NET MVC プロジェクトのいずれにも適用可能です。
ASP.NET で PDF を生成する基本的な流れは次のとおりです。
以下は、PDF を作成してサーバー側に保存するシンプルな例です。
using Spire.Pdf;
using Spire.Pdf.Graphics;
using System.Drawing;
PdfDocument document = new PdfDocument();
PdfPageBase page = document.Pages.Add();
// 日本語表示に対応したフォント(Yu Gothic UI)を指定
PdfTrueTypeFont font = new PdfTrueTypeFont(
new Font("Yu Gothic UI", 12f, FontStyle.Regular),
true
);
page.Canvas.DrawString(
"本 PDF は、業務システムにより自動生成されたレポートです。",
font,
PdfBrushes.Black,
new PointF(40, 40)
);
// サーバー上に保存
document.SaveToFile(Server.MapPath("~/Output/Sample.pdf"));
document.Close();
この例では、ASP.NET 環境における PDF 生成の基本的な仕組みを示しています。PDF のページ構成、テキスト内容、配置位置はすべてコードで制御されているため、業務要件に応じてレイアウトを柔軟に調整できます。
必要に応じて、テキストだけでなく、表や画像を追加することで、請求書・帳票・報告書など、実用的な PDF ドキュメントを構築できます。
※ PDF に画像を挿入する方法については、次のチュートリアルを参照してください: C# を使用して PDF に画像を追加する方法
ASP.NET MVC プロジェクトでは、PDF は通常 Controller の Action メソッド内で生成され、 そのままブラウザへ返却されます。これにより、PDF を一時ファイルとして保存せず、オンライン表示やダウンロードを実現できます。
以下は、MVC コントローラーから PDF を返却する一般的な実装例です。
using Spire.Pdf;
using Spire.Pdf.Graphics;
using System.Drawing;
using System.IO;
using System.Web.Mvc;
namespace WebApplication.Controllers
{
public class DefaultController : Controller
{
public ActionResult GeneratePdf()
{
using (PdfDocument document = new PdfDocument())
{
PdfPageBase page = document.Pages.Add();
PdfTrueTypeFont font = new PdfTrueTypeFont(
new Font("Yu Gothic UI", 12f, FontStyle.Regular),
true
);
page.Canvas.DrawString(
"ASP.NET MVC で生成された業務用 PDF ドキュメントです。",
font,
PdfBrushes.Black,
new PointF(40, 40)
);
// メモリストリームに保存してブラウザへ返却
using (MemoryStream stream = new MemoryStream())
{
document.SaveToStream(stream);
return File(
stream.ToArray(),
"application/pdf",
"MvcSample.pdf"
);
}
}
}
}
}
生成された PDF の表示例は次のとおりです。

ヒント:ブラウザ上で PDF を直接プレビューしたい場合は、Spire.PDFViewer for ASP.NET を使用すると、Web ページ内で PDF を表示できます。
ASP.NET Core で PDF を生成する際、基本的な API の使い方は ASP.NET Framework とほぼ同じですが、ファイルの返却方法・パスの扱い・実行環境の前提条件には明確な違いがあります。
たとえば、ASP.NET Core では System.Web に依存せず、物理パスへの直接出力も推奨されていません。そのため、PDF は ストリーム(Stream)ベースで生成・返却する実装が一般的です。
本章では、ASP.NET Core MVC および ASP.NET Core Web API プロジェクトにおいて、C# を使って PDF を生成し、クライアントへ返却する方法を具体例とともに解説します。この方式は、クロスプラットフォーム環境やクラウド/コンテナ環境との親和性も高いのが特徴です。
ASP.NET Core MVC では、PDF は Controller の Action メソッド内で生成され、ファイルレスポンスとしてそのまま返却されるのが一般的です。
以下の例では、ASP.NET Core Web App(MVC)プロジェクトを作成し、Controllers フォルダーに PdfController を追加して PDF を生成します。
using Microsoft.AspNetCore.Mvc;
using Spire.Pdf;
using Spire.Pdf.Graphics;
using System.Drawing;
using System.IO;
namespace CoreWebApplication.Controllers
{
public class PdfController : Controller
{
public IActionResult CreatePdf()
{
using (PdfDocument document = new PdfDocument())
{
PdfPageBase page = document.Pages.Add();
PdfTrueTypeFont font = new PdfTrueTypeFont(
new Font("Yu Gothic UI", 14f, FontStyle.Bold),
true
);
page.Canvas.DrawString(
"ASP.NET Core で生成された業務レポート(PDF)です。",
font,
PdfBrushes.DarkRed,
new PointF(40, 40)
);
using (MemoryStream stream = new MemoryStream())
{
document.SaveToStream(stream);
return File(
stream.ToArray(),
"application/pdf",
"AspNetCoreSample.pdf"
);
}
}
}
}
}
生成される PDF の表示例は次のとおりです。

このようなストリームベースの PDF 生成方式は、社内管理画面や業務システムでの帳票出力など、「ユーザー操作に応じて即時ダウンロードする PDF」に非常に適しています。
PDF 内に表形式のデータを出力したい場合は、ASP.NET Core で C# を使用して PDF テーブルを生成する方法もあわせて参照してください。
フロントエンドとバックエンドを分離したアーキテクチャでは、PDF 生成処理を ASP.NET Core Web API として提供するケースが一般的です。
この場合、API は PDF を **バイナリデータ(byte 配列)**として返却し、Web フロントエンド、モバイルアプリ、または他のサービスから利用されます。
以下は、Web API で PDF を生成する基本的な実装例です。
using Microsoft.AspNetCore.Mvc;
using Spire.Pdf;
using Spire.Pdf.Graphics;
using System.Drawing;
using System.IO;
[ApiController]
[Route("api/pdf")]
public class PdfApiController : ControllerBase
{
[HttpGet("generate")]
public IActionResult GeneratePdf()
{
PdfDocument document = new PdfDocument();
PdfPageBase page = document.Pages.Add();
PdfTrueTypeFont font = new PdfTrueTypeFont(
new Font("Yu Gothic UI", 14f, FontStyle.Bold),
true
);
page.Canvas.DrawString(
"ASP.NET Core Web API により生成された PDF ドキュメントです。",
font,
PdfBrushes.BlueViolet,
new PointF(40, 40)
);
using (MemoryStream stream = new MemoryStream())
{
document.SaveToStream(stream);
document.Close();
return File(
stream.ToArray(),
"application/pdf",
"ApiGenerated.pdf"
);
}
}
}
生成された PDF のプレビュー例は次のとおりです。

このように、PDF 生成を Web API として提供することで、フロントエンドの実装とドキュメント生成ロジックを明確に分離でき、システム全体の保守性と拡張性を高めることができます。
これまでの例では、PDF を作成するための基本的な流れを紹介してきました。しかし、実際の業務システムでは、PDF は固定文書ではなく、実行時のデータに基づいて動的に生成されるケースがほとんどです。
また、データ量の増加に伴い、レイアウトの維持や改ページ制御も重要な要件となります。本章では、代表的な応用シナリオを通して、ASP.NET アプリケーションで安定した構造を持つ PDF を生成する方法を解説します。
業務用 PDF では、データベースや Web API から取得した情報をもとに、受注一覧、売上レポート、明細表などを生成することが一般的です。
このようなケースでは、ループ処理でデータを描画しながら、縦位置(Y 座標)と改ページのタイミングを明示的に制御する必要があります。
以下の例では、簡易的な「受注レポート」を PDF として出力します。
PdfDocument document = new PdfDocument();
PdfPageBase page = document.Pages.Add();
PdfTrueTypeFont headerFont = new PdfTrueTypeFont(
new Font("Yu Gothic UI", 12f, FontStyle.Bold),
true
);
PdfTrueTypeFont bodyFont = new PdfTrueTypeFont(
new Font("Yu Gothic UI", 10f, FontStyle.Regular),
true
);
float startY = 40;
float y = startY;
float pageHeight = page.Canvas.ClientSize.Height - 40;
// タイトル
page.Canvas.DrawString(
"受注一覧レポート",
headerFont,
PdfBrushes.Black,
40,
y
);
y += 30;
// 動的データ(サンプル)
string[] orders =
{
"受注番号:A-1001 金額:¥250,000",
"受注番号:A-1002 金額:¥180,000",
"受注番号:A-1003 金額:¥320,000"
};
foreach (string order in orders)
{
// 改ページ判定
if (y > pageHeight)
{
page = document.Pages.Add();
y = startY;
}
page.Canvas.DrawString(
order,
bodyFont,
PdfBrushes.Black,
40,
y
);
y += 20;
}
document.SaveToFile("OrderReport.pdf");
document.Close();
出力結果のイメージ:

このように、コードで描画位置を管理することで、データ件数が変動してもレイアウトが崩れない PDF を生成できます。特に、帳票・一覧表・レポート系の出力では、この方法が非常に有効です。
コードベースで PDF を生成する場合、HTML のように自動でレイアウトが調整されることはありません。 そのため、ヘッダー・フッター・余白・行間などを明示的に定義する必要があります。
以下は、ページヘッダーとフッターを追加するシンプルな例です。
PdfPageBase page = document.Pages.Add();
PdfTrueTypeFont font = new PdfTrueTypeFont(
new Font("Yu Gothic UI", 10f),
true
);
// ヘッダー
page.Canvas.DrawString(
"社内資料(機密)",
font,
PdfBrushes.Gray,
new PointF(40, 15)
);
// フッター(ページ番号)
page.Canvas.DrawString(
"Page 1",
font,
PdfBrushes.Gray,
new PointF(
page.Canvas.ClientSize.Width - 60,
page.Canvas.ClientSize.Height - 30
)
);
出力結果のイメージ:

多ページの PDF ドキュメントを生成する場合、縦方向の位置計算を一元的に管理し、コンテンツを書き込む前に残りのスペースを判定することで、データが単一ページの容量を超えた際にも安全に新しいページへ切り替えることができます。
また、ヘッダー、行間、改ページのルールを集中的に管理することで、ページをまたいだレイアウトの一貫性を保ち、画面表示にも印刷にも適したドキュメントを生成できます。
ASP.NET アプリケーションでは、 直接 PDF を生成する方法以外にも、用途に応じた変換処理が利用されます。
以下の関連チュートリアルも参考にしてください。
ASP.NET または ASP.NET Core アプリケーションで PDF 生成を実装する際、どの PDF ライブラリを選択するかは、開発効率・保守性・実行時の安定性に直結します。
単に「機能が多いかどうか」だけで判断するのではなく、実際の運用シーンを想定した観点から評価することが重要です。
優れた PDF ライブラリは、次のような特徴を備えています。
PDF 出力ロジックは、帳票追加やレイアウト変更などにより長期的に拡張されることが多いため、API の理解しやすさは非常に重要です。
多くの開発現場では、次のような環境が混在しています。
そのため、同一の API で両環境に対応できる PDF ライブラリを選択することで、 移行コストや学習コストを大幅に削減できます。
本番環境での PDF 生成は、次のような条件下で実行されることが一般的です。
そのため、大量ページの PDF を安定して生成できるか、メモリ使用量が適切に制御されているかといった点も重要な評価基準となります。
ASP.NET における PDF 生成ライブラリは、大きく次の 2 種類に分けられます。
HTML 変換型は、既存の Web ページをそのまま PDF 化できる一方で、ブラウザ依存やレイアウトの再現性に課題が生じることがあります。一方、コード生成型PDFライブラリは、ページ構造、ページ分割、印刷効果を精密に制御でき、レポート、請求書、報告書、契約書などの業務文書生成シーンに特に適しています。
ASP.NET で PDF 生成を行う場合、「簡単に作れるか」よりも 「安定して運用できるか」 を重視して PDF ライブラリを選定することが、長期的には大きなメリットになります。
数ある .NET 向け PDF ライブラリの中でも、Spire.PDF for .NET は、ASP.NET および ASP.NET Core 環境において業務用途の PDF 生成に特化した機能と設計を備えています。
以下では、実際の開発・運用の視点から、その主な特長を整理します。
Spire.PDF は、PDF ドキュメントを構成する各要素を 明確なクラス構造として提供しています。
これにより、レイアウト意図をコード上で明確に表現できるため、帳票やレポートのような複雑な構成でも保守性を維持しやすくなります。
業務システムでは、日本語・英語・中国語など複数言語を含む PDF 出力が求められるケースが少なくありません。
Spire.PDF では、TrueType フォントを直接指定できるため、
などの 日本語フォントを正しく埋め込んだ PDF を生成できます。
これにより、
といった点で、大きなメリットがあります。
Spire.PDF for .NET は、
といった複数の実行環境に対応しており、同一のコードベースで PDF 生成処理を共通化できます。
これにより、
にも柔軟に対応可能です。
Spire.PDF は、単なるテキスト出力にとどまらず、 実務で必要とされる機能を幅広くサポートしています。
これにより、 請求書・見積書・業務レポートなどの PDF を コードベースで安定して生成できます。
可能です。ASP.NET Core での PDF 生成は MVC に依存する必要はありません。MVC コントローラー以外でも、以下のような場面で PDF を生成して返すことができます:
返却する内容が有効な PDF バイト列であり、Content-Type を正しく設定していれば、正常に動作します。
PDF 作成の基本的なロジックは共通していますが、いくつかの差異があります:
PDF API の観点から見ると、大部分のコードロジックは共通して再利用可能です。
可能です。多くの実運用システムでは、C# コードのみで PDF を生成しています。この方法には以下の利点があります:
一貫性と信頼性を重視する ASP.NET PDF ソリューションでは、この実装方式が非常に一般的です。
ASP.NET および ASP.NET Core アプリケーションにおいて、PDF ファイルを生成することは非常に一般的な要件であり、特に帳票、請求書、データエクスポートなどのシーンで有用です。C# コードを直接用いて PDF を生成することで、文書の構造、レイアウト、出力挙動を完全に制御できます。
本記事では、ASP.NET Framework と ASP.NET Core における PDF 生成方法を体系的に解説し、MVC や Web API の各シナリオ、動的データ出力、基本的なレイアウト制御をカバーしました。また、実際のプロジェクト要件に応じて適切な PDF ライブラリを選択するポイントについても触れています。
実際のプロジェクト環境でこれらのサンプルを制限なく試したい場合は、試用ライセンスを申請 することで、評価段階で全機能を利用できます。

C# 開発では、PDF をバイト配列として扱うケースがよくあります。たとえば、PDF 文書をデータベースに保存したり、API を通して送受信したり、ファイルシステムを使わずに完全にメモリ内で処理する必要がある場合です。このような場面では、C# で PDF とバイト配列を相互に変換する方法が重要になります。
本記事では、Spire.PDF for .NET を使用して、バイト配列から PDF を生成する方法、PDF をバイト配列に変換する方法、さらにはメモリ上で直接 PDF を編集する方法まで、手順を追って解説します。
読みたいところからジャンプ
byte[] をデータの受け渡し形式として利用することで、一時ファイルを避けられ、クラウドやコンテナ環境にも適したコードが書けます。
準備: サンプルコードを実行する前に、Spire.PDF for .NET の NuGet パッケージを追加してください。
Install-Package Spire.PDF
インストール後は、byte[] や Stream から読み込み、ページを編集し、出力をメモリやディスクに書き出せます。追加のコンバーターは不要です。
API やメッセージキューから受け取った byte[] が PDF を表す場合、文書として展開し処理を行ったり、ディスクに保存したりする必要があります。Spire.PDF for .NET を使えば、一時ファイルを作成せずにメモリから直接ロードできます。
シナリオと手順: DB や API からの byte[] を受け取り、メモリ上で PdfDocument を構築し、必要なら基本情報を確認してから保存します。
using Spire.Pdf;
using System.IO;
class Program
{
static void Main()
{
// 例: DB や API から取得した byte[]
byte[] pdfBytes = File.ReadAllBytes("Sample.pdf");
// 1) バイト配列からメモリ上に PDF をロード
PdfDocument doc = new PdfDocument();
doc.LoadFromBytes(pdfBytes);
// 2) (任意)保存前にページ数などの基本情報を確認
// int pageCount = doc.Pages.Count;
// 3) ファイルに保存
doc.SaveToFile("Output.pdf");
doc.Close();
}
}
下図はバイト配列から PDF への変換フローです。

ポイント:
逆方向として、PDF を byte[] に変換することで、データベース書き込み、キャッシュ、HTTP レスポンスでの送信が可能になります。Spire.PDF for .NET では、MemoryStream に直接書き込み、ToArray() でバイト配列に変換できます。
シナリオと手順: 既存の PDF を読み込み、MemoryStream に保存し、byte[] を抽出します。API のレスポンスや DB 保存に便利なパターンです。
using Spire.Pdf;
using System.IO;
class Program
{
static void Main()
{
// 1) PDF をロード(ローカル、ネットワーク、リソースなど)
PdfDocument doc = new PdfDocument();
doc.LoadFromFile("Input.pdf");
// 2) MemoryStream に保存してバイト配列を取得
byte[] pdfBytes;
using (var ms = new MemoryStream())
{
doc.SaveToStream(ms);
pdfBytes = ms.ToArray();
}
doc.Close();
// pdfBytes を DB 保存や API レスポンスとして利用可能
// 例: return File(pdfBytes, "application/pdf");
}
}
下図は PDF からバイト配列への変換フローです。

コードの要点:
真価は、PDF を完全にメモリ上で編集できる点にあります。byte[] からロードし、テキストや画像を追加、透かしやフォーム入力を行い、編集結果を新しい byte[] として保存できます。ファイルレスの処理フローやマイクロサービスに最適です。
シナリオと手順: バイト配列から PDF をロードし、1 ページ目に小さなテキストを追加して、編集済みの文書を新しいバイト配列として出力します。
using Spire.Pdf;
using Spire.Pdf.Graphics;
using System.Drawing;
using System.IO;
class Program
{
static void Main()
{
// 入力ソース(DB、API、ファイルなど)を byte[] で受け取る
byte[] inputBytes = File.ReadAllBytes("Input.pdf");
// 1) メモリ上にロード
var doc = new PdfDocument();
doc.LoadFromBytes(inputBytes);
// 2) 編集: 1 ページ目に小さなテキストを追加
PdfPageBase page = doc.Pages[0];
page.Canvas.DrawString(
"Edited in memory",
new PdfTrueTypeFont(new Font("Yu Gothic UI", 14f), true),
PdfBrushes.DarkBlue,
new PointF(100, page.Size.Height - 100)
);
// 3) 編集済み PDF を新しい byte[] に保存
byte[] editedBytes;
using (var ms = new MemoryStream())
{
doc.SaveToStream(ms);
editedBytes = ms.ToArray();
}
doc.Close();
// editedBytes を DB 保存や API レスポンスとして利用可能
}
}
下図は編集済み PDF の例です。

補足:
ゼロから PDF を構築する手順については、C# で PDF 文書を作成する方法 を参照ください。
バイト配列ワークフローに適した特徴をまとめると以下の通りです。
| 課題 | Spire.PDF for .NET で得られるメリット |
|---|---|
| I/O の柔軟性 | ファイルパス・Stream・byte[] すべて同じ PdfDocument API で対応。 |
| メモリ内編集 | テキスト / 画像描画、注釈・フォーム管理、透かし追加など、一時ファイル不要。 |
| サービス親和性 | ASP.NET エンドポイントやバックグラウンド処理と簡潔に統合可能。 |
| 実運用対応 | 複数ページ PDF にも対応。ストリームでメモリ使用量を制御可能。 |
| シンプルなコード | ボイラープレート最小化。煩雑なバイト操作や脆弱な Interop を回避。 |
本記事では、C# でバイト配列から PDF を生成する方法、PDF をバイト配列に変換する方法、そして メモリ上で直接 PDF を編集する方法 を紹介しました。ストリームとバイト配列を活用することで、API 設計がシンプルになり、レスポンスが高速化し、データベースやクラウド環境にも適した処理フローを実現できます。Spire.PDF for .NET を利用すれば、ファイルレスかつ拡張性の高いワークフローを簡潔に構築できます。
機能を制限なく試したい場合は、30 日間の無料一時ライセンスを申請 してください。軽量なタスクには、Free Spire.PDF for .NET も利用できます。
ディスクに保存せず、C# でバイト配列から PDF を作成できますか? はい。LoadFromBytes でロードし、MemoryStream に保存するか、API から直接返却すれば、ディスク不要で処理できます。
C# で PDF をバイト配列に変換してデータベースに保存する方法は? PdfDocument で SaveToStream を実行し、MemoryStream の ToArray() を呼び出します。その byte[] を BLOB として保存できます。
もちろん可能です。バイト配列からロードし、テキスト・画像・透かし・注釈・フォーム入力を行い、新しい byte[] に保存できます。
ストリームは早めに Dispose し、必要に応じてバッファを再利用します。操作やスレッドごとに新しい PdfDocument を生成してください。大きなファイルにはストリーム I/O を活用することで、メモリ使用量を安定させられます。
PDF ファイルのインタラクティブ性を高めることは、文書管理やユーザーエンゲージメントの重要な要素です。C# を使用して .NET フレームワーク内で PDF にアクションを追加することで、ファイルリンク、ウェブリンク、音声などの動的要素を組み込むことができます。これにより、ページ間の移動、外部アプリケーションの起動、背景音楽の再生などのさまざまな機能が実行可能になり、PDF の実用性や魅力が向上します。本記事では、Spire.PDF for .NET ライブラリを使用して C# で PDF ドキュメントにアクションを作成する方法を紹介します。
まず、Spire.PDF for .NET パッケージに含まれている DLL ファイルを .NET プロジェクトの参照として追加する必要があります。DLL ファイルは、このリンクからダウンロードするか、NuGet を介してインストールできます。
PM> Install-Package Spire.PDF
C# を用いて PDF にアクションを追加するには、ナビゲーション ボタン、ファイル リンク、または音声トリガーなど、ユーザー体験を向上させるインタラクティブ要素を統合します。Spire.PDF for .NET ライブラリを使用すると、主要なクラスやメソッドを活用してさまざまなアクションを作成できます。以下は、Spire.PDF for .NET を使って PDF にアクションを追加する一般的な手順です:
PdfGoToAction クラスを使用すると、ドキュメント内の指定した目的地へのナビゲーションを定義できます。このアクションを実現するには、PdfDestination オブジェクトを作成し、それを PdfGoToAction インスタンスに渡します。以下は、PDF にナビゲーションアクションを追加するコード例です:
using Spire.Pdf;
using Spire.Pdf.Actions;
using Spire.Pdf.Annotations;
using Spire.Pdf.General;
using Spire.Pdf.Graphics;
using System.Drawing;
namespace AddNavigationButtonPDF
{
class Program
{
static void Main(string[] args)
{
// PdfDocumentのインスタンスを作成
PdfDocument pdf = new PdfDocument();
// PDFファイルを読み込む
pdf.LoadFromFile("Sample.pdf");
// PdfDestinationインスタンスを作成し、遷移先を設定
PdfDestination destination = new PdfDestination(pdf.Pages[1]);
destination.Location = new PointF(0, 0);
destination.Mode = PdfDestinationMode.Location;
destination.Zoom = 0.8f;
// 遷移先に基づいてPdfGoToActionを作成
PdfGoToAction action = new PdfGoToAction(destination);
// 四角形を作成し、最初のページに描画
RectangleF rect = new RectangleF(70, pdf.PageSettings.Size.Height - 120, 140, 20);
pdf.Pages[0].Canvas.DrawRectangle(PdfBrushes.LightGray, rect);
// 四角形にテキストを描画
PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("Yu Gothic UI", 14f, FontStyle.Bold), true);
PdfStringFormat stringFormat = new PdfStringFormat(PdfTextAlignment.Center);
pdf.Pages[0].Canvas.DrawString("2ページに移動", font, PdfBrushes.Green, rect, stringFormat);
// 四角形とアクションに基づいてPdfActionAnnotationインスタンスを作成
PdfActionAnnotation actionAnnotation = new PdfActionAnnotation(rect, action);
// 最初のページにアクション注釈を追加
pdf.Pages[0].Annotations.Add(actionAnnotation);
// ドキュメントを保存
pdf.SaveToFile("output/ナビゲーション・アクション.pdf");
pdf.Close();
}
}
}

PdfLaunchAction クラスを使用すると、PDF 内に埋め込まれたボタンをクリックして特定のファイルを開くアクションを定義できます。このアクションを実装する際、ファイルのパス(絶対または相対)を設定し、新しいウィンドウで開くかどうかを指定できます。以下は、PDF ドキュメントにファイル開くアクションを追加するコード例です:
using Spire.Pdf;
using Spire.Pdf.Actions;
using Spire.Pdf.Annotations;
using Spire.Pdf.Graphics;
using System.Drawing;
namespace AddFileLaunchActionPDF
{
class Program
{
static void Main(string[] args)
{
// PdfDocumentのインスタンスを作成
PdfDocument pdf = new PdfDocument();
// PDFファイルを読み込む
pdf.LoadFromFile("Sample.pdf");
// 最初のページを取得
PdfPageBase page = pdf.Pages[0];
// ページ上に四角形を描画
RectangleF rect = new RectangleF(50, 50, 180, 20);
page.Canvas.DrawRectangle(PdfBrushes.LightGray, rect);
// 四角形内にテキストを描画
PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("Yu Gothic UI", 14f, FontStyle.Bold), true);
PdfStringFormat stringFormat = new PdfStringFormat(PdfTextAlignment.Center);
pdf.Pages[0].Canvas.DrawString("クリックしてSample2を開く", font, PdfBrushes.Green, rect, stringFormat);
// PdfLaunchActionインスタンスを作成
PdfLaunchAction action = new PdfLaunchAction("C:/Sample2.pdf", PdfFilePathType.Absolute);
// 新しいウィンドウで開くように起動モードを設定
action.IsNewWindow = true;
// 四角形と起動アクションに基づいてPdfActionAnnotationインスタンスを作成
PdfActionAnnotation actionAnnotation = new PdfActionAnnotation(rect, action);
// 最初のページにアクション注釈を追加
page.Annotations.Add(actionAnnotation);
// ドキュメントを保存
pdf.SaveToFile("output/ファイル開くアクション.pdf");
pdf.Close();
}
}
}

PdfSoundAction クラスを使用すると、PDF ドキュメント内にオーディオをアクションとして埋め込むことができ、ファイルを開いたときやボタンをクリックしたときなど、特定のトリガーに応じて音声を再生できます。以下は、PDF ドキュメントにサウンド アクションを作成するコード例です:
using Spire.Pdf;
using Spire.Pdf.Actions;
using Spire.Pdf.Annotations;
using Spire.Pdf.Graphics;
using Spire.Pdf.General;
using System.Drawing;
namespace AddSoundActionPDF
{
class Program
{
static void Main(string[] args)
{
// PdfDocumentのインスタンスを作成
PdfDocument pdf = new PdfDocument();
// PDFファイルを読み込む
pdf.LoadFromFile("Sample.pdf");
// 最初のページを取得
PdfPageBase page = pdf.Pages[0];
// ページにキュー画像を描画
PdfImage image = PdfImage.FromFile("Sound.png");
page.Canvas.DrawImage(image, new PointF(30, 30));
// PdfSoundActionインスタンスを作成し、そのプロパティを設定
PdfSoundAction action = new PdfSoundAction("Wave.wav");
// サウンドのパラメータを設定
action.Sound.Bits = 16;
action.Sound.Channels = PdfSoundChannels.Stereo;
action.Sound.Encoding = PdfSoundEncoding.Signed;
action.Sound.Rate = 44100;
// 再生オプションを設定
action.Volume = 0;
action.Repeat = true;
action.Mix = true;
action.Synchronous = true;
// キュー画像の位置に基づいてサウンドアクションのPdfActionAnnotationインスタンスを作成
RectangleF rect = new RectangleF(30, 30, image.Width, image.Height);
PdfActionAnnotation actionAnnotation = new PdfActionAnnotation(rect, action);
// 最初のページにアクション注釈を追加
page.Annotations.Add(actionAnnotation);
// ドキュメントが開かれた後にサウンドアクションを再生するよう設定
pdf.AfterOpenAction = action;
// ドキュメントを保存
pdf.SaveToFile("output/サウンドアクション.pdf");
pdf.Close();
}
}
}

PdfUriAction クラスを使用すると、PDF ドキュメントにウェブリンクアクションを作成できます。これにより、ボタンをクリックした際などにウェブリンクを開くことが可能になります。以下は、ウェブリンクアクションを作成するコード例です:
using Spire.Pdf;
using Spire.Pdf.Actions;
using Spire.Pdf.Annotations;
using Spire.Pdf.Graphics;
using System.Drawing;
namespace AddSoundActionPDF
{
class Program
{
static void Main(string[] args)
{
// PdfDocumentのインスタンスを作成
PdfDocument pdf = new PdfDocument();
// PDFファイルを読み込む
pdf.LoadFromFile("Sample.pdf");
// 最初のページを取得
PdfPageBase page = pdf.Pages[0];
// ページ上に四角形を描画
RectangleF rect = new RectangleF(30, 30, 120, 20);
page.Canvas.DrawRectangle(PdfBrushes.LightGray, rect);
// 四角形内にテキストを描画
PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("Yu Gothic UI", 14f, FontStyle.Bold), true);
PdfStringFormat stringFormat = new PdfStringFormat(PdfTextAlignment.Center);
page.Canvas.DrawString("クリックしてGoogle検索へ", font, PdfBrushes.LightSkyBlue, rect);
// PdfUriActionインスタンスを作成し、そのプロパティを設定
PdfUriAction action = new PdfUriAction();
action.Uri = "https://www.google.com/";
// Webリンクアクションと四角形を使用してPdfActionAnnotationインスタンスを作成
PdfActionAnnotation actionAnnotation = new PdfActionAnnotation(rect, action);
// 最初のページにアクション注釈を追加
page.Annotations.Add(actionAnnotation);
// ドキュメントを保存
pdf.SaveToFile("output/ウェブリンク・アクション.pdf");
pdf.Close();
}
}
}

PdfJavaScriptAction は PDF 内で JavaScript アクションを表し、フォームのバリデーション、データ計算、カスタムユーザーインターフェースなどの複雑なインタラクションを実現することができます。以下は、C# を使用して PDF ドキュメントに簡単な JavaScript アクションを追加するコード例です:
using Spire.Pdf;
using Spire.Pdf.Actions;
namespace AddJavaScriptActionPDF
{
class Program
{
static void Main(string[] args)
{
// PdfDocumentインスタンスを作成
PdfDocument pdf = new PdfDocument();
// PDFファイルを読み込む
pdf.LoadFromFile("Sample.pdf");
// JavaScriptコードを定義
var jsCode =
"app.alert({" +
" cMsg: 'グレートバリアリーフについての記事を読む準備ができましたか?\\n\\nこの記事では、オーストラリアのグレートバリアリーフの概要、その生態系、観光情報、および環境保護の取り組みについて詳しく説明します。ぜひお楽しみください!', " +
" nIcon: 3, " +
" cTitle: '文档介绍'" +
"});";
// JavaScriptコードを使用し、PdfJavaScriptActionインスタンスを作成
PdfJavaScriptAction action = new PdfJavaScriptAction(jsCode);
// 作成したJavaScriptアクションをドキュメントのオープン時に実行されるように設定
pdf.AfterOpenAction = action;
// ドキュメントを保存
pdf.SaveToFile("output/PDFJavaScriptアクション.pdf");
pdf.Close();
}
}
}

結果ドキュメントから評価メッセージを削除したい場合、または機能制限を取り除く場合は、についてこのメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。にお問い合わせ、30 日間有効な一時ライセンスを取得してください。
PDF 注釈ツールを使用すると、テキストをハイライトしたり、付箋を追加したり、形状を描画したり、コメントを直接 PDF ドキュメントに挿入したりできます。これは、フィードバックを提供したり、メモを取ったり、デザインにマークアップをしたり、ドキュメントでの共同作業を行ったりする際に便利です。PDF 注釈機能をマスターすることで、ワークフローを効率化し、PDF ファイルの作業時に生産性を向上させることができます。
この記事では、C# で Spire.PDF for .NET を使用して PDF ドキュメントにさまざまな種類の注釈をプログラム的に追加する方法を説明します。
まず、Spire.PDF for .NET パッケージに含まれている DLL ファイルを .NET プロジェクトの参照として追加する必要があります。DLL ファイルは、このリンクからダウンロードするか、NuGet を介してインストールできます。
PM> Install-Package Spire.PDF
PDF のマークアップ注釈を使用すると、ユーザーは特定のテキストを強調表示するために背景色を選択して適用できます。Spire.PDF はこのタイプの注釈を操作するために PdfTextMarkupAnnotation クラスを提供しています。C# で Spire.PDF を使用して PDF にマークアップ注釈を追加する手順は次のとおりです。
using Spire.Pdf.Annotations;
using Spire.Pdf;
using Spire.Pdf.Texts;
using System.Drawing;
namespace AddMarkupAnnotation
{
class Program
{
static void Main(string[] args)
{
// PdfDocumentオブジェクトを作成
PdfDocument doc = new PdfDocument();
// PDFファイルを読み込む
doc.LoadFromFile("Sample.pdf");
// 特定のページを取得
PdfPageBase page = doc.Pages[0];
// ページに基づいてPdfTextFinderオブジェクトを作成
PdfTextFinder finder = new PdfTextFinder(page);
// 検索オプションを設定
finder.Options.Parameter = TextFindParameter.WholeWord;
finder.Options.Parameter = TextFindParameter.IgnoreCase;
// 指定されたテキストのインスタンスを検索
List fragments = finder.Find("やがて、金や銀などの貴金属が、その希少性と耐久性から、一般的な通貨として登場した。");
// 最初のインスタンスを取得
PdfTextFragment textFragment = fragments[0];
// 注釈テキストを指定
String text = "この文は、紙幣と硬貨が経済に与える影響を強調しています。";
// 見つかったテキストの境界を反復処理
for (int i = 0; i < textFragment.Bounds.Length; i++)
{
// 特定の境界を取得
RectangleF rect = textFragment.Bounds[i];
// テキストマークアップ注釈を作成
PdfTextMarkupAnnotation annotation = new PdfTextMarkupAnnotation("Jessey", text, rect);
// マークアップ色を設定
annotation.TextMarkupColor = Color.Green;
// 注釈のコレクションに注釈を追加
page.Annotations.Add(annotation);
}
// 結果をファイルに保存
doc.SaveToFile("output/PDFにマークアップ注釈を追加.pdf");
// リソースを解放
doc.Dispose();
}
}
}

PDF ファイルに自由テキスト注釈を追加することで、ユーザーは印刷した文書にメモを取るように手書きやタイプしたテキストを直接追加できます。Spire.PDF は自由テキスト注釈を扱うために PdfFreeTextAnnotation を提供しています。PDF ドキュメントに自由テキスト注釈を作成する方法は次のとおりです。
using Spire.Pdf.Annotations;
using Spire.Pdf.Texts;
using Spire.Pdf;
using Spire.Pdf.Graphics;
using System.Drawing;
namespace AddFreeTextAnnotation
{
class Program
{
static void Main(string[] args)
{
// PdfDocumentオブジェクトを作成
PdfDocument doc = new PdfDocument();
// PDFファイルを読み込む
doc.LoadFromFile("Sample.pdf");
// 特定のページを取得
PdfPageBase page = doc.Pages[0];
// ページに基づいてPdfTextFinderオブジェクトを作成
PdfTextFinder finder = new PdfTextFinder(page);
// 検索オプションを設定
finder.Options.Parameter = TextFindParameter.WholeWord;
finder.Options.Parameter = TextFindParameter.IgnoreCase;
// 指定されたテキストのインスタンスを検索
List fragments = finder.Find("貴金属");
// 最初のインスタンスを取得
PdfTextFragment textFragment = fragments[0];
// テキスト境界を取得
RectangleF rect = textFragment.Bounds[0];
// 注釈を追加するxおよびy座標を取得
float x = rect.Right;
float y = rect.Bottom;
// フリーテキスト注釈を作成
RectangleF rectangle = new RectangleF(x - 100, y, 210, 20);
PdfFreeTextAnnotation textAnnotation = new PdfFreeTextAnnotation(rectangle);
// 注釈の内容を設定
textAnnotation.Text = "貴金属とは、金や銀といった価値の高い金属のこと。";
// 注釈のその他のプロパティを設定
PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("Yu Gothic UI", 10f, FontStyle.Bold), true);
PdfAnnotationBorder border = new PdfAnnotationBorder(1f);
textAnnotation.Font = font;
textAnnotation.Border = border;
textAnnotation.BorderColor = Color.Purple;
textAnnotation.Color = Color.Green;
textAnnotation.Opacity = 1.0f;
// 注釈のコレクションに注釈を追加
page.Annotations.Add(textAnnotation);
// 結果をファイルに保存
doc.SaveToFile("output/PDFに自由テキスト注釈を追加.pdf");
// リソースを解放
doc.Dispose();
}
}
}

PDF ファイルのポップアップ注釈を使用すると、クリックすると表示される小さなラベルやコメントを追加できます。これにより、追加情報や短いメッセージを表示できます。Spire.PDF はポップアップ注釈を扱うために PdfPopupAnnotation クラスを提供しています。ポップアップ注釈を PDF に追加する手順は次のとおりです。
using Spire.Pdf.Annotations;
using Spire.Pdf.Texts;
using Spire.Pdf;
using System.Drawing;
namespace AddPopupAnnotation
{
class Program
{
static void Main(string[] args)
{
// PdfDocumentオブジェクトを作成
PdfDocument doc = new PdfDocument();
// PDFファイルを読み込む
doc.LoadFromFile("Sample.pdf");
// 特定のページを取得
PdfPageBase page = doc.Pages[0];
// ページに基づいてPdfTextFinderオブジェクトを作成
PdfTextFinder finder = new PdfTextFinder(page);
// 検索オプションを設定
finder.Options.Parameter = TextFindParameter.WholeWord;
finder.Options.Parameter = TextFindParameter.IgnoreCase;
// 指定されたテキストのインスタンスを検索
List fragments = finder.Find("貴金属");
// 最初のインスタンスを取得
PdfTextFragment textFragment = fragments[0];
// テキスト境界を取得
RectangleF textBound = textFragment.Bounds[0];
// 注釈を追加するxおよびy座標を取得
float x = textBound.Right + 5;
float y = textBound.Top - 15;
// ポップアップ注釈を作成
RectangleF rectangle = new RectangleF(x, y, 30, 30);
PdfPopupAnnotation popupAnnotation = new PdfPopupAnnotation(rectangle);
// 注釈テキストを設定
popupAnnotation.Text = "貴金属とは、金や銀といった価値の高い金属のこと。";
// 注釈のアイコンと色を設定
popupAnnotation.Icon = PdfPopupIcon.Comment;
popupAnnotation.Color = Color.Red;
// 注釈のコレクションに注釈を追加
page.Annotations.Add(popupAnnotation);
// 結果をファイルに保存
doc.SaveToFile("output/PDFにポップアップ注釈を追加.pdf");
// リソースを解放
doc.Dispose();
}
}
}

PDF の形状注釈は、長方形、円、線、矢印などのグラフィカルな形状を PDF ドキュメントに追加して、情報を強調表示したり提供したりすることを指します。Spire.PDF は、カスタム形状注釈を PDF ドキュメントに作成するために PdfPolyLineAnnotation クラスを提供しています。詳細な手順は次のとおりです。
using Spire.Pdf.Annotations;
using Spire.Pdf.Texts;
using Spire.Pdf;
using System.Drawing;
namespace AddShapeAnnotation
{
class Program
{
static void Main(string[] args)
{
// PdfDocumentオブジェクトを作成
PdfDocument doc = new PdfDocument();
// PDFファイルを読み込む
doc.LoadFromFile("Sample.pdf");
// 特定のページを取得
PdfPageBase page = doc.Pages[0];
// ページに基づいてPdfTextFinderオブジェクトを作成
PdfTextFinder finder = new PdfTextFinder(page);
// 検索オプションを設定
finder.Options.Parameter = TextFindParameter.WholeWord;
finder.Options.Parameter = TextFindParameter.IgnoreCase;
// 指定されたテキストのインスタンスを検索
List fragments = finder.Find("貴金属");
// 最初のインスタンスを取得
PdfTextFragment textFragment = fragments[0];
// テキスト境界を取得
RectangleF textBound = textFragment.Bounds[0];
// 注釈を追加する座標を取得
float left = textBound.Left;
float top = textBound.Top;
float right = textBound.Right;
float bottom = textBound.Bottom;
// 形状注釈を作成
PdfPolyLineAnnotation polyLineAnnotation = new PdfPolyLineAnnotation(page, new PointF[] {
new PointF(left, top), new PointF(right, top), new PointF(right - 5, bottom), new PointF(left - 5, bottom), new PointF(left, top) });
// 注釈テキストを設定
polyLineAnnotation.Text = "貴金属とは、金や銀といった価値の高い金属のこと。";
// 注釈のコレクションに注釈を追加
page.Annotations.Add(polyLineAnnotation);
// 結果をファイルに保存
doc.SaveToFile("output/PDFに図形の注釈を追加.pdf");
// リソースを解放
doc.Dispose();
}
}
}

結果ドキュメントから評価メッセージを削除したい場合、または機能制限を取り除く場合は、についてこのメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。にお問い合わせ、30 日間有効な一時ライセンスを取得してください。
印刷せずにエンドユーザーが直接入力できる PDF フォームを作成する機能は、ビジネスの効率化に大きなメリットをもたらします。ユーザーはこれらの書類をダウンロードし、入力して保存し、再度送信することができます。印刷やスキャンの手間が不要です。このガイドでは、C# で Spire.PDF for .NET を使用して、PDF に入力可能なフォームを作成、入力、または削除する方法について説明します。
Spire.PDF for .NET は、Spire.Pdf.Fields 名前空間に一連の便利なクラスを提供しており、テキストボックス、チェックボックス、コンボボックス、リストボックス、ラジオボタンなど、さまざまな種類のフォームフィールドを作成・編集できます。以下の表に、このチュートリアルで使用する主要なクラスを示します。
| クラス | 説明 |
| PdfForm | PDF 文書のインタラクティブフォームを表します。 |
| PdfField | PDF 文書のインタラクティブフォームのフィールドを表します。 |
| PdfTextBoxField | PDF フォームのテキストボックスフィールドを表します。 |
| PdfCheckBoxField | PDF フォームのチェックボックスフィールドを表します。 |
| PdfComboBoxField | PDF フォームのコンボボックスフィールドを表します。 |
| PdfListBoxField | PDF フォームのリストボックスフィールドを表します。 |
| PdfListFieldItem | リストフィールドの項目を表します。 |
| PdfRadioButtonListField | PDF フォームのラジオボタンフィールドを表します。 |
| PdfRadioButtonListItem | ラジオボタンリストの項目を表します。 |
| PdfButtonField | PDF フォームのボタンフィールドを表します。 |
| PdfSignatureField | PDF フォームの署名フィールドを表します。 |
まず、Spire.PDF for .NET パッケージに含まれている DLL ファイルを .NET プロジェクトの参照として追加する必要があります。DLL ファイルは、このリンクからダウンロードするか、NuGet を介してインストールできます。
PM> Install-Package Spire.PDF
PDF フォームを作成するには、対応するフィールドクラスのインスタンスを初期化し、Bounds プロパティを使用してフィールドのサイズと位置を設定し、PdfFormFieldCollection.Add() メソッドを使用して PDF に追加します。Spire.PDF for .NET を使用して PDF 文書にさまざまなタイプのフォームフィールドを作成する手順は以下のとおりです。
using Spire.Pdf;
using Spire.Pdf.Actions;
using Spire.Pdf.Fields;
using Spire.Pdf.Graphics;
using System.Drawing;
namespace CreateFillableFormsInPdf
{
class Program
{
static void Main(string[] args)
{
//PdfDocumentオブジェクトを作成
PdfDocument doc = new PdfDocument();
//ページを追加
PdfPageBase page = doc.Pages.Add();
//x座標とy座標を初期化
float baseX = 100;
float baseY = 30;
//2つのブラシオブジェクトを作成
PdfSolidBrush brush1 = new PdfSolidBrush(new PdfRGBColor(Color.Blue));
PdfSolidBrush brush2 = new PdfSolidBrush(new PdfRGBColor(Color.Black));
//フォントを作成
PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("Yu Gothic UI", 12f, FontStyle.Regular), true);
//テキストボックスを追加
page.Canvas.DrawString("テキストボックス:", font, brush1, new PointF(10, baseY));
RectangleF tbxBounds = new RectangleF(baseX, baseY, 150, 15);
PdfTextBoxField textBox = new PdfTextBoxField(page, "textbox");
textBox.Bounds = tbxBounds;
textBox.Text = "Hello World";
textBox.Font = font;
doc.Form.Fields.Add(textBox);
baseY += 25;
//2つのチェックボックスを追加
page.Canvas.DrawString("チェックボックス:", font, brush1, new PointF(10, baseY));
RectangleF checkboxBound1 = new RectangleF(baseX, baseY, 15, 15);
PdfCheckBoxField checkBoxField1 = new PdfCheckBoxField(page, "checkbox1");
checkBoxField1.Bounds = checkboxBound1;
checkBoxField1.Checked = false;
page.Canvas.DrawString("オプション 1", font, brush2, new PointF(baseX + 20, baseY));
RectangleF checkboxBound2 = new RectangleF(baseX + 70, baseY, 15, 15);
PdfCheckBoxField checkBoxField2 = new PdfCheckBoxField(page, "checkbox2");
checkBoxField2.Bounds = checkboxBound2;
checkBoxField2.Checked = false;
page.Canvas.DrawString("オプション 2", font, brush2, new PointF(baseX + 90, baseY));
doc.Form.Fields.Add(checkBoxField1);
doc.Form.Fields.Add(checkBoxField2);
baseY += 25;
//リストボックスを追加
page.Canvas.DrawString("リストボックス:", font, brush1, new PointF(10, baseY));
RectangleF listboxBound = new RectangleF(baseX, baseY, 150, 50);
PdfListBoxField listBoxField = new PdfListBoxField(page, "listbox");
listBoxField.Items.Add(new PdfListFieldItem("項目 1", "item1"));
listBoxField.Items.Add(new PdfListFieldItem("項目 2", "item2"));
listBoxField.Items.Add(new PdfListFieldItem("項目 3", "item3"));
listBoxField.Bounds = listboxBound;
listBoxField.Font = font;
listBoxField.SelectedIndex = 0;
doc.Form.Fields.Add(listBoxField);
baseY += 60;
//2つのラジオボタンを追加
page.Canvas.DrawString("ラジオボタン:", font, brush1, new PointF(10, baseY));
PdfRadioButtonListField radioButtonListField = new PdfRadioButtonListField(page, "radio");
PdfRadioButtonListItem radioItem1 = new PdfRadioButtonListItem("option1");
RectangleF radioBound1 = new RectangleF(baseX, baseY, 15, 15);
radioItem1.Bounds = radioBound1;
page.Canvas.DrawString("オプション 1", font, brush2, new PointF(baseX + 20, baseY));
PdfRadioButtonListItem radioItem2 = new PdfRadioButtonListItem("option2");
RectangleF radioBound2 = new RectangleF(baseX + 70, baseY, 15, 15);
radioItem2.Bounds = radioBound2;
page.Canvas.DrawString("オプション 2", font, brush2, new PointF(baseX + 90, baseY));
radioButtonListField.Items.Add(radioItem1);
radioButtonListField.Items.Add(radioItem2);
radioButtonListField.SelectedIndex = 0;
doc.Form.Fields.Add(radioButtonListField);
baseY += 25;
//コンボボックスを追加
page.Canvas.DrawString("コンボボックス:", font, brush1, new PointF(10, baseY));
RectangleF cmbBounds = new RectangleF(baseX, baseY, 150, 15);
PdfComboBoxField comboBoxField = new PdfComboBoxField(page, "combobox");
comboBoxField.Bounds = cmbBounds;
comboBoxField.Items.Add(new PdfListFieldItem("項目 1", "item1"));
comboBoxField.Items.Add(new PdfListFieldItem("項目 2", "item2"));
comboBoxField.Items.Add(new PdfListFieldItem("項目 3", "item3"));
comboBoxField.Items.Add(new PdfListFieldItem("項目 4", "item4"));
comboBoxField.SelectedIndex = 0;
comboBoxField.Font = font;
doc.Form.Fields.Add(comboBoxField);
baseY += 25;
//署名フィールドを追加
page.Canvas.DrawString("署名欄:", font, brush1, new PointF(10, baseY));
PdfSignatureField sgnField = new PdfSignatureField(page, "sgnField");
RectangleF sgnBounds = new RectangleF(baseX, baseY, 150, 80);
sgnField.Bounds = sgnBounds;
doc.Form.Fields.Add(sgnField);
baseY += 90;
//ボタンを追加
page.Canvas.DrawString("ボタン:", font, brush1, new PointF(10, baseY));
RectangleF btnBounds = new RectangleF(baseX, baseY, 50, 15);
PdfButtonField buttonField = new PdfButtonField(page, "button");
buttonField.Bounds = btnBounds;
buttonField.Text = "送信";
buttonField.Font = font;
PdfSubmitAction submitAction = new PdfSubmitAction("https://www.e-iceblue.com/getformvalues.php");
submitAction.DataFormat = SubmitDataFormat.Html;
buttonField.Actions.MouseDown = submitAction;
doc.Form.Fields.Add(buttonField);
//ファイルに保存
doc.SaveToFile("output/PDFにフォームフィールドを作成.pdf", FileFormat.PDF);
doc.Close();
}
}
}

フォームに入力するには、まず PDF 文書からすべてのフォームフィールドを取得し、特定のフィールドの種類を判別した後、値を入力するか、定義済みのリストから選択します。Spire.PDF for .NET を使用して既存の PDF 文書にフォームフィールドを入力する手順は以下のとおりです。
using Spire.Pdf;
using Spire.Pdf.Fields;
using Spire.Pdf.Widget;
namespace FillFormFields
{
class Program
{
static void Main(string[] args)
{
//PdfDocumentオブジェクトを作成
PdfDocument doc = new PdfDocument();
//フォームを含むテンプレートを読み込む
doc.LoadFromFile("Sample1.pdf");
//ドキュメントからフォームを取得
PdfFormWidget form = (PdfFormWidget)doc.Form;
//フォームウィジェットコレクションを取得
PdfFormFieldWidgetCollection formWidgetCollection = form.FieldsWidget;
//ウィジェットをループ処理
for (int i = 0; i < formWidgetCollection.Count; i++)
{
//特定のフィールドを取得
PdfField field = formWidgetCollection[i];
//フィールドがテキストボックスかどうかを確認
if (field is PdfTextBoxFieldWidget)
{
if (field.Name == "name")
{
//テキストボックスのテキストを設定
PdfTextBoxFieldWidget textBoxField = (PdfTextBoxFieldWidget)field;
textBoxField.Text = "カイラ・スミス";
}
}
//フィールドがラジオボタンかどうかを確認
if (field is PdfRadioButtonListFieldWidget)
{
if (field.Name == "gender")
{
//ラジオボタンの選択インデックスを設定
PdfRadioButtonListFieldWidget radioButtonListField = (PdfRadioButtonListFieldWidget)field;
radioButtonListField.SelectedIndex = 1;
}
}
//フィールドがコンボボックスかどうかを確認
if (field is PdfComboBoxWidgetFieldWidget)
{
if (field.Name == "country")
{
//コンボボックスの選択インデックスを設定
PdfComboBoxWidgetFieldWidget comboBoxField = (PdfComboBoxWidgetFieldWidget)field;
int[] index = { 0 };
comboBoxField.SelectedIndex = index;
}
}
//フィールドがチェックボックスかどうかを確認
if (field is PdfCheckBoxWidgetFieldWidget)
{
//チェックボックスの「Checked」ステータスを設定
PdfCheckBoxWidgetFieldWidget checkBoxField = (PdfCheckBoxWidgetFieldWidget)field;
switch (checkBoxField.Name)
{
case "movie":
checkBoxField.Checked = true;
break;
case "music":
checkBoxField.Checked = true;
break;
}
}
//フィールドがリストボックスかどうかを確認
if (field is PdfListBoxWidgetFieldWidget)
{
if (field.Name == "degree")
{
//リストボックスの選択インデックスを設定
PdfListBoxWidgetFieldWidget listBox = (PdfListBoxWidgetFieldWidget)field;
int[] index = { 1 };
listBox.SelectedIndex = index;
}
}
}
//ファイルに保存
doc.SaveToFile("output/PDFフォームの記入.pdf", FileFormat.PDF);
doc.Close();
}
}
}

PDF 文書のフォームフィールドは、インデックスまたは名前でアクセスでき、PdfFieldCollection.Remove() メソッドを使用して削除できます。Spire.PDF for .NET を使用して、特定のフィールドまたは既存の PDF 文書からすべてのフィールドを削除する手順は以下のとおりです。
using Spire.Pdf;
using Spire.Pdf.Fields;
using Spire.Pdf.Widget;
namespace RemoveFormFields
{
class Program
{
static void Main(string[] args)
{
//PdfDocumentオブジェクトを作成
PdfDocument doc = new PdfDocument();
//PDFファイルを読み込む
doc.LoadFromFile("Sample.pdf");
//ドキュメントからフォームフィールドを取得
PdfFormWidget formWidget = doc.Form as PdfFormWidget;
//ウィジェットをループ処理
for (int i = formWidget.FieldsWidget.List.Count - 1; i >= 0; i--)
{
//特定のフィールドを取得
PdfField field = formWidget.FieldsWidget.List[i] as PdfField;
//フィールドを削除
formWidget.FieldsWidget.Remove(field);
}
//特定の名前でフィールドを取得
//PdfField field = formWidget.FieldsWidget["name"];
//フィールドを削除
//formWidget.FieldsWidget.Remove(field);
//ファイルに保存
doc.SaveToFile("output/PDFからすべてのフォームファイルを削除.pdf");
doc.Close();
}
}
}
結果ドキュメントから評価メッセージを削除したい場合、または機能制限を取り除く場合は、についてこのメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。にお問い合わせ、30 日間有効な一時ライセンスを取得してください。
PDF ドキュメントのヘッダーとフッターは、タイトル、著者、日付、ページ番号などの貴重な情報を提供し、ドキュメントの使いやすさとブランドアイデンティティを向上させます。この記事では、C# で Spire.PDF for .NET を使用して既存の PDF ドキュメントにヘッダーとフッターを追加する方法を説明します。
まず、Spire.PDF for .NET パッケージに含まれている DLL ファイルを .NET プロジェクトの参照として追加する必要があります。DLL ファイルは、このリンクからダウンロードするか、NuGet を介してインストールできます。
PM> Install-Package Spire.PDF
Spire.PDF for .NET を使用して既存の PDF を操作する場合、座標系の原点はページの左上にあり、X 軸は右に、Y 軸は下に伸びています。ヘッダーを追加するには、上部の空白領域にコンテンツを配置し、フッターを追加するには下部の空白領域にコンテンツを配置します。

空白領域がコンテンツを収容するのに十分でない場合は、PDF ページの余白を広げることを検討できます。
Spire.PDF for .NET では、PdfCanvas.DrawString()、PdfCanvas.DrawImage()、PdfCanvas.DrawLine() などのメソッドを使用して、PDF ページにテキスト、画像、図形を描画できます。ページ番号や日付などの動的情報をヘッダーに追加するには、PdfPageNumberField、PdfSectionNumberField、PdfCreationDateField などの自動フィールドを使用します。
以下は Spire.PDF for .NET を使用して、テキスト、画像、日付、線で構成されるヘッダーを PDF ドキュメントに追加する手順です。
using Spire.Pdf;
using Spire.Pdf.AutomaticFields;
using Spire.Pdf.Graphics;
using System.Drawing;
namespace AddHeaderToExistingPdf
{
class Program
{
static void Main(string[] args)
{
//PdfDocumentオブジェクトを作成
PdfDocument doc = new PdfDocument();
//PDFファイルを読み込む
doc.LoadFromFile("Sample.pdf");
//ヘッダー用の画像を読み込む
PdfImage headerImage = PdfImage.FromFile("Logo.png");
//画像の幅をピクセルで取得
float width = headerImage.Width;
//ピクセルをポイントに変換
PdfUnitConvertor unitCvtr = new PdfUnitConvertor();
float pointWidth = unitCvtr.ConvertUnits(width, PdfGraphicsUnit.Pixel, PdfGraphicsUnit.Point);
//ヘッダー用のテキストを指定
string headerText = "E-iceblue テック\nwww.e-iceblue.com";
//TrueTypeフォントを作成
PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("Yu Gothic UI", 12f, FontStyle.Bold), true);
//ブラシを作成
PdfBrush brush = PdfBrushes.Purple;
//ペンを作成
PdfPen pen = new PdfPen(brush, 1.0f);
//作成日時フィールドを作成
PdfCreationDateField creationDateField = new PdfCreationDateField(font, brush);
creationDateField.DateFormatString = "yyyy-MM-dd";
//静的文字列と日付フィールドを組み合わせる複合フィールドを作成
PdfCompositeField compositeField = new PdfCompositeField(font, brush, "作成時間:{0}", creationDateField);
compositeField.Location = new Point(55, 48);
//ドキュメント内のページをループ
for (int i = 0; i < doc.Pages.Count; i++)
{
//特定のページを取得
PdfPageBase page = doc.Pages[i];
//画像を上部の空白領域に描画
page.Canvas.DrawImage(headerImage, page.ActualSize.Width - pointWidth - 55, 20);
//テキストを上部の空白領域に描画
page.Canvas.DrawString(headerText, font, brush, 55, 20);
//上部の空白領域に線を描画
page.Canvas.DrawLine(pen, new PointF(55, 70), new PointF(page.ActualSize.Width - 55, 70));
//複合フィールドを上部の空白領域に描画
compositeField.Draw(page.Canvas);
}
//ファイルに保存
doc.SaveToFile("output/PDFにヘッダーを挿入.pdf");
doc.Dispose();
}
}
}

同様に、PdfCanvas.DrawString()、PdfCanvas.DrawImage()、PdfCanvas.DrawLine() を使用してフッターを追加できます。PdfPageNumberField や PdfPageCountField などの自動フィールドは動的データの統合を助けます。
以下は Spire.PDF for .NET を使用して、画像とページ番号で構成されるフッターを PDF ドキュメントに追加する手順です。
using Spire.Pdf;
using Spire.Pdf.AutomaticFields;
using Spire.Pdf.Graphics;
using System.Drawing;
namespace AddHeaderToExistingPdf
{
class Program
{
static void Main(string[] args)
{
//PdfDocumentオブジェクトを作成
PdfDocument doc = new PdfDocument();
//PDFファイルを読み込む
doc.LoadFromFile("Sample.pdf");
//画像を読み込む
PdfImage footerImage = PdfImage.FromFile("bg.png");
//TrueTypeフォントを作成
PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("Yu Gothic UI", 12f, FontStyle.Bold), true);
//ブラシを作成
PdfBrush brush = PdfBrushes.White;
//ページ番号フィールドを作成
PdfPageNumberField pageNumberField = new PdfPageNumberField();
//ページ数フィールドを作成
PdfPageCountField pageCountField = new PdfPageCountField();
//ページ数フィールドとページ番号フィールドを単一の文字列に結合する複合フィールドを作成
PdfCompositeField compositeField = new PdfCompositeField(font, brush, "{0} / {1}", pageNumberField, pageCountField);
//テキストサイズを取得
SizeF fontSize = font.MeasureString(compositeField.Text);
//ページサイズを取得
SizeF pageSize = doc.Pages[0].Size;
//複合フィールドの位置を設定
compositeField.Location = new Point((int)(pageSize.Width - fontSize.Width) / 2, (int)pageSize.Height - 45);
//ドキュメント内のページをループ
for (int i = 0; i < doc.Pages.Count; i++)
{
//特定のページを取得
PdfPageBase page = doc.Pages[i];
//画像を下部の空白領域に描画
page.Canvas.DrawImage(footerImage, 55, pageSize.Height - 65, pageSize.Width - 110, 50);
//複合フィールドを下部の空白領域に描画
compositeField.Draw(page.Canvas);
}
//ファイルに保存
doc.SaveToFile("output/PDFにフッターを挿入.pdf");
doc.Dispose();
}
}
}

結果ドキュメントから評価メッセージを削除したい場合、または機能制限を取り除く場合は、についてこのメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。にお問い合わせ、30 日間有効な一時ライセンスを取得してください。
PDF は、さまざまなプラットフォームでドキュメントを共有および保存するための標準的な形式となっており、プロフェッショナルな場面だけでなく個人的な環境でも広く使用されています。ただし、高品質な PDF ドキュメントを作成するには、複数の確認と修正が必要です。この文脈において、PDF ファイルを効率的に比較し、その違いを明確に特定する方法を知っていることは非常に重要です。これにより、ドキュメント編集者はドキュメントの異なるバージョン間の相違点を素早く特定できるため、ドキュメントの作成とレビューのプロセスでかなりの時間を節約することができます。本記事では、C# プログラムで Spire.PDF for .NET を使用して PDF ドキュメントを比較する方法を説明します。
まず、Spire.PDF for .NET パッケージに含まれている DLL ファイルを .NET プロジェクトの参照として追加する必要があります。DLL ファイルは、このリンクからダウンロードするか、NuGet を介してインストールできます。
PM> Install-Package Spire.PDFSpire.PDF for .NET を使用すると、開発者は PdfComparer クラスのインスタンスを作成し、2 つの PdfDocument オブジェクトをパラメータとして渡し、PdfComparer.Compare(String fileName) メソッドを使用して 2 つのドキュメントを比較することができます。比較結果は新しい PDF ドキュメントとして保存され、2 つの PDF 間の差異をさらに分析やレビューすることができます。
比較結果の PDF ドキュメントでは、左側に元の 2 つのドキュメントが表示され、削除された項目は赤色で、追加された項目は黄色で表示されます。
以下に、2つの PDF ドキュメントを比較するための詳細な手順を示します:
using Spire.Pdf;
using Spire.Pdf.Comparison;
namespace ExtractTablesToExcel
{
class Program
{
static void Main(string[] args)
{
// PdfDocumentクラスのオブジェクトを作成し、PDFドキュメントをロードします
PdfDocument pdf1 = new PdfDocument();
pdf1.LoadFromFile("サンプル1.pdf");
// 別のPdfDocumentクラスのオブジェクトを作成し、別のPDFドキュメントをロードします
PdfDocument pdf2 = new PdfDocument();
pdf2.LoadFromFile("サンプル2.pdf");
// PdfComparerクラスのオブジェクトを作成し、2つのドキュメントを比較します
PdfComparer comparer = new PdfComparer(pdf1, pdf2);
// 2つのドキュメントを比較し、比較結果を別のPDFドキュメントに保存します
comparer.Compare("output/比較の結果.pdf");
pdf1.Close();
pdf2.Close();
}
}
}
PdfComparer クラスのインスタンスを作成した後、開発者は PdfComparer.Options.SetPageRange() メソッドを使用して比較するページ範囲を設定することもできます。これにより、2 つの PDF ドキュメント内の指定されたページ範囲のみを比較することが可能です。具体的な手順は以下の通りです:
using Spire.Pdf;
using Spire.Pdf.Comparison;
namespace ExtractTablesToExcel
{
class Program
{
static void Main(string[] args)
{
// PdfDocumentクラスのオブジェクトを作成し、PDFドキュメントをロードします
PdfDocument pdf1 = new PdfDocument();
pdf1.LoadFromFile("サンプル1.pdf");
// 別のPdfDocumentクラスのオブジェクトを作成し、別のPDFドキュメントをロードします
PdfDocument pdf2 = new PdfDocument();
pdf2.LoadFromFile("サンプル2.pdf");
// PdfComparerクラスのオブジェクトを作成し、2つのドキュメントを比較します
PdfComparer comparer = new PdfComparer(pdf1, pdf2);
// 比較するページ範囲を設定します
comparer.Options.SetPageRanges(1, 1, 1, 1);
// 指定されたページ範囲を比較し、比較結果を別のPDFドキュメントに保存します
comparer.Compare("output/ページ範囲の比較結果.pdf");
pdf1.Close();
pdf2.Close();
}
}
}
結果ドキュメントから評価メッセージを削除したい場合、または機能制限を取り除く場合は、についてこのメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。にお問い合わせ、30 日間有効な一時ライセンスを取得してください。
コードによる PDF 生成にはさまざまな利点があります。リアルタイムデータ、データベースレコード、ユーザー入力などの動的コンテンツを容易に統合するのに役立ちます。この機能は、ユーザーにより優れたカスタマイズと自動化機能を提供し、面倒な手動操作も回避します。この記事では、Spire.PDF for .NET を使用して PDF ドキュメントを作成する方法を紹介します。
まず、Spire.PDF for .NET パッケージに含まれている DLL ファイルを.NETプロジェクトの参照として追加する必要があります。DLL ファイルは、このリンクからダウンロードするか、NuGet を介してインストールできます。
PM> Install-Package Spire.PDFSpire.PDF for .NET のページ(PdfPageBase クラスで表される)は、クライアント領域と周囲のマージンで構成されています。コンテンツ領域は、ユーザーがさまざまなコンテンツを記述するための領域であり、ページ余白は通常空白のエッジになります。
下図に示すように、ページ上の座標系の原点はクライアント領域の左上隅にあり、x 軸は水平に右に伸び、y 軸は垂直に下に伸びています。クライアント領域に追加するすべての要素は、指定された座標に基づいている必要があります。

さらに、次の表に重要なクラスと方法を示します。これは、以下のコードを理解しやすくするのに役立ちます。
| クラスと方法 | 説明 |
| PdfDocument クラス | PDF ドキュメント モデルを表します。 |
| PdfPageBase クラス | PDF ドキュメント内のページを表します。 |
| PdfSolidBrush クラス | オブジェクトを単色で塗りつぶすブラシを表します。 |
| PdfTrueTypeFont クラス | True Typeフォントを表します。 |
| PdfStringFormat クラス | アライメント、文字間隔、インデントなどのテキスト書式情報を表します。 |
| PdfTextWidget クラス | 複数のページにまたがる機能を持つテキスト領域を表します。 |
| PdfTextLayout クラス | テキストのレイアウト情報を表します。 |
| PdfDocument.Pages.Add() メソッド | PDF ドキュメントにページを追加します。 |
| PdfPageBase.Canvas.DrawString() メソッド | 指定したフォントとブラシオブジェクトを使用して、ページ上の指定した位置に文字列を描画します。 |
| PdfTextWidget.Draw() メソッド | テキストウィジェットをページの指定した位置に描画します。 |
| PdfDocument.Save() メソッド | ドキュメントを PDF ファイルに保存します。 |
Spire.PDF for .NET では、PDF ドキュメントにさまざまな要素を追加できます。この記事では、プレーンテキストの PDF ドキュメントを作成する方法について説明します。詳細な手順は次のとおりです。
using Spire.Pdf;
using Spire.Pdf.Graphics;
using System.Drawing;
namespace CreatePdfDocument
{
class Program
{
static void Main(string[] args)
{
//PdfDocumentオブジェクトを作成する
PdfDocument doc = new PdfDocument();
//ページを追加する
PdfPageBase page = doc.Pages.Add(PdfPageSize.A4, new PdfMargins(35f));
//タイトルのテキストを指定する
string titleText = "ライセンス契約";
//Solid Brusheを作成する
PdfSolidBrush titleBrush = new PdfSolidBrush(new PdfRGBColor(Color.Blue));
PdfSolidBrush paraBrush = new PdfSolidBrush(new PdfRGBColor(Color.Black));
//True Typeフォントを作成する
PdfTrueTypeFont titleFont = new PdfTrueTypeFont(new Font("Yu Mincho", 18f, FontStyle.Bold),true);
PdfTrueTypeFont paraFont = new PdfTrueTypeFont(new Font("Yu Mincho", 12f, FontStyle.Regular), true);
//PdfStringFormatクラスによるテキストの配置を設定する
PdfStringFormat format = new PdfStringFormat();
format.Alignment = PdfTextAlignment.Center;
//ページにタイトルを描画する
page.Canvas.DrawString(titleText, titleFont, titleBrush, page.Canvas.ClientSize.Width / 2, 20, format);
//.txtファイルから段落テキストを取得する
string paraText = File.ReadAllText("content.txt");
//段落内容を保存するPdfTextWidgetオブジェクトを作成する
PdfTextWidget widget = new PdfTextWidget(paraText, paraFont, paraBrush);
//段落の内容を配置する長方形を作成する
RectangleF rect = new RectangleF(0, 50, page.Canvas.ClientSize.Width, page.Canvas.ClientSize.Height);
//PdfLayoutTypeをPaginateに設定して内容を自動的にページング
PdfTextLayout layout = new PdfTextLayout();
layout.Layout = PdfLayoutType.Paginate;
//ページに段落テキストを描画する
widget.Draw(page, rect, layout);
//ファイルに保存する
doc.SaveToFile("CreatePdfDocument.pdf");
doc.Dispose();
}
}
}Imports Spire.Pdf
Imports Spire.Pdf.Graphics
Imports System.Drawing
Namespace CreatePdfDocument
Class Program
Shared Sub Main(ByVal args() As String)
'PdfDocumentオブジェクトを作成する
Dim doc As PdfDocument = New PdfDocument()
'ページを追加する
Dim page As PdfPageBase = doc.Pages.Add(PdfPageSize.A4,New PdfMargins(35f))
'タイトルのテキストを指定する
Dim titleText As String = "ライセンス契約"
'Solid Brusheを作成する
Dim titleBrush As PdfSolidBrush = New PdfSolidBrush(New PdfRGBColor(Color.Blue))
Dim paraBrush As PdfSolidBrush = New PdfSolidBrush(New PdfRGBColor(Color.Black))
'True Typeフォントを作成する
Dim titleFont As PdfTrueTypeFont = New PdfTrueTypeFont(New Font("Yu Mincho ",18f,FontStyle.Bold),True)
Dim paraFont As PdfTrueTypeFont = New PdfTrueTypeFont(New Font("Yu Mincho ",12f,FontStyle.Regular),True)
'PdfStringFormatクラスによるテキストの配置を設定する
Dim format As PdfStringFormat = New PdfStringFormat()
format.Alignment = PdfTextAlignment.Center
'ページにタイトルを描画する
page.Canvas.DrawString(titleText, titleFont, titleBrush, page.Canvas.ClientSize.Width / 2, 20, format)
'.txtファイルから段落テキストを取得する
Dim paraText As String = File.ReadAllText("content.txt")
'段落内容を保存するPdfTextWidgetオブジェクトを作成する
Dim widget As PdfTextWidget = New PdfTextWidget(paraText,paraFont,paraBrush)
'段落の内容を配置する長方形を作成する
Dim rect As RectangleF = New RectangleF(0,50,page.Canvas.ClientSize.Width,page.Canvas.ClientSize.Height)
'PdfLayoutTypeをPaginateに設定して内容を自動的にページング
Dim layout As PdfTextLayout = New PdfTextLayout()
lay.Layout = PdfLayoutType.Paginate
'ページに段落テキストを描画する
widget.Draw(page, rect, layout)
'ファイルに保存する
doc.SaveToFile("CreatePdfDocument.pdf")
doc.Dispose()
End Sub
End Class
End Namespace
結果ドキュメントから評価メッセージを削除したい場合、または機能制限を取り除く場合は、についてこのメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。にお問い合わせ、30 日間有効な一時ライセンスを取得してください。
PDF レイヤー機能は、PDF ファイルのコンテンツをレイヤーに配置することをサポートします。 ユーザーは、同じ PDF ファイル内で一部のコンテンツを表示するように設定し、一部のコンテンツを非表示にするように選択的に設定できます。PDF レイヤーは、レイヤー化されたアートワーク、地図、および CAD 図面で使用される一般的な要素です。この記事では、Spire.PDF for .NET を使用してPDF のレイヤーを追加、非表示、または削除する方法を紹介します。
まず、Spire.PDF for .NET パッケージに含まれている DLL ファイルを .NET プロジェクトの参照として追加する必要があります。DLL ファイルは、このリンクからダウンロードするか、NuGet を介してインストールできます。
PM> Install-Package Spire.PDFSpire.PDF for.NET が提供する PdfDocument.Layers.AddLayer() メソッドでは、PDF にレイヤーの追加をサポートします。PDF レイヤー上にテキスト、線、画像、または形状を描画できます。以下に詳細な操作手順を示します。
using Spire.Pdf;
using Spire.Pdf.Graphics;
using Spire.Pdf.Graphics.Layer;
using System.Drawing;
namespace AddLayersToPdf
{
class Program
{
static void Main(string[] args)
{
//PdfDocumentインスタンスを作成し、サンプルPDFをロードする
PdfDocument pdf = new PdfDocument();
pdf.LoadFromFile(@"Sample.pdf");
//AddLayerWatermark メソッドを使用して透かしのレイヤーを追加する
AddLayerWatermark(pdf);
//AddLayerHeaderメソッドを使用してヘッドーのレイヤーを追加する
AddLayerHeader(pdf);
//結果ドキュメントを保存する
pdf.SaveToFile("AddLayers.pdf");
pdf.Close();
}
private static void AddLayerWatermark(PdfDocument doc)
{
//「透かし」という名前のレイヤーを作成する
PdfLayer layer = doc.Layers.AddLayer("透かし");
//フォントを作成する
PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("Yu Mincho", 48), true);
//透かしのテキストを指定する
string watermarkText = "機密";
//テキストのサイズを取得する
SizeF fontSize = font.MeasureString(watermarkText);
//2つのオフセットを計算する
float offset1 = (float)(fontSize.Width * System.Math.Sqrt(2) / 4);
float offset2 = (float)(fontSize.Height * System.Math.Sqrt(2) / 4);
//ページ数を取得する
int pageCount = doc.Pages.Count;
//2つの変数を宣言する
PdfPageBase page;
PdfCanvas canvas;
//ページをループする
for (int i = 0; (i < pageCount); i++)
{
page = doc.Pages[i];
//レイヤーにキャンバスを作成する
canvas = layer.CreateGraphics(page.Canvas);
canvas.TranslateTransform(page.Canvas.Size.Width / 2 - offset1 - offset2, page.Canvas.Size.Height / 2 + offset1 - offset2);
canvas.SetTransparency(0.4f);
canvas.RotateTransform(-45);
//レイヤーのキャンバスに文字列を描画する
canvas.DrawString(watermarkText, font, PdfBrushes.DarkBlue, 0, 0);
}
}
private static void AddLayerHeader(PdfDocument doc)
{
//「ヘッダー」という名前のレイヤーを作成する
PdfLayer layer = doc.Layers.AddLayer("ヘッダー");
//ページのサイズを取得する
SizeF size = doc.Pages[0].Size;
//XとYの初期値を指定する
float x = 90;
float y = 40;
//ページ数を取得する
int pageCount = doc.Pages.Count;
//2つの変数を宣言する
PdfPageBase page;
PdfCanvas canvas;
//ページをループする
for (int i = 0; (i < pageCount); i++)
{
//レイヤーに画像を描画する
PdfImage pdfImage = PdfImage.FromFile(@"image.jpg");
float width = pdfImage.Width;
float height = pdfImage.Height;
page = doc.Pages[i];
canvas = layer.CreateGraphics(page.Canvas);
canvas.DrawImage(pdfImage, x, y, width, height);
//レイヤーに線を描画する
PdfPen pen = new PdfPen(PdfBrushes.DarkGray, 2);
canvas.DrawLine(pen, x, (y + (height + 5)), (size.Width - x), (y + (height + 2)));
}
}
}
} Imports Spire.Pdf
Imports Spire.Pdf.Graphics
Imports Spire.Pdf.Graphics.Layer
Imports System.Drawing
Namespace AddLayersToPdf
Class Program
Private Shared Sub Main(ByVal args As String())
'PdfDocumentインスタンスを作成し、PDFをロードする
Dim pdf As PdfDocument = New PdfDocument()
pdf.LoadFromFile("Sample.pdf")
'AddLayerWatermark メソッドを使用して透かしのレイヤーを追加する
Program.AddLayerWatermark(pdf)
'AddLayerHeaderメソッドを使用してヘッドのレイヤーを追加する
Program.AddLayerHeader(pdf)
'結果ドキュメントを保存する
pdf.SaveToFile("AddLayers.pdf")
pdf.Close()
End Sub
Private Shared Sub AddLayerWatermark(ByVal doc As PdfDocument)
'「透かし」という名前のレイヤーを作成する
Dim layer As PdfLayer = doc.Layers.AddLayer("透かし")
'フォントを作成する
Dim font As PdfTrueTypeFont = New PdfTrueTypeFont(New Font("Yu Mincho", 48), True)
'透かしのテキストを指定する
Dim watermarkText = "機密"
'テキストのサイズを取得する
Dim fontSize As SizeF = font.MeasureString(watermarkText)
'2つのオフセットを計算する
Dim offset1 As Single = fontSize.Width * Math.Sqrt(2) / 4
Dim offset2 As Single = fontSize.Height * Math.Sqrt(2) / 4
'ページ数を取得する
Dim pageCount As Integer = doc.Pages.Count
'2つの変数を宣言する
Dim page As PdfPageBase
Dim canvas As PdfCanvas
'ページをループする
Dim i = 0
While i < pageCount
page = doc.Pages(i)
'レイヤーにキャンバスを作成する
canvas = layer.CreateGraphics(page.Canvas)
canvas.TranslateTransform(page.Canvas.Size.Width / 2 - offset1 - offset2, page.Canvas.Size.Height / 2 + offset1 - offset2)
canvas.SetTransparency(0.4F)
canvas.RotateTransform(-45)
'レイヤーのキャンバスに文字列を描画する
canvas.DrawString(watermarkText, font, PdfBrushes.DarkBlue, 0, 0)
i += 1
End While
End Sub
Private Shared Sub AddLayerHeader(ByVal doc As PdfDocument)
'「ヘッダー」という名前のレイヤーを作成する
Dim layer As PdfLayer = doc.Layers.AddLayer("ヘッダー")
'ページのサイズを取得する
Dim size As SizeF = doc.Pages(0).Size
'XとYの初期値を指定する
Dim x As Single = 90
Dim y As Single = 40
'ページ数を取得する
Dim pageCount As Integer = doc.Pages.Count
'2つの変数を宣言する
Dim page As PdfPageBase
Dim canvas As PdfCanvas
'ページをループする
Dim i = 0
While i < pageCount
'レイヤーに画像を描画する
Dim pdfImage As PdfImage = PdfImage.FromFile("image.jpg")
Dim width As Single = pdfImage.Width
Dim height As Single = pdfImage.Height
page = doc.Pages(i)
canvas = layer.CreateGraphics(page.Canvas)
canvas.DrawImage(pdfImage, x, y, width, height)
'レイヤーに線を描画する
Dim pen As PdfPen = New PdfPen(PdfBrushes.DarkGray, 2)
canvas.DrawLine(pen, x, y + (height + 5), size.Width - x, y + (height + 2))
i += 1
End While
End Sub
End Class
End Namespace
既存のレイヤーの可視性を設定するには、PdfDocument.Layers プロパティを使用して、インデックスまたは名前で指定したレイヤーを取得します。次に、PdfLayer.Visibility プロパティを使用してレイヤーを表示または非表示にします。以下に詳細な操作手順を示します。
using Spire.Pdf;
using Spire.Pdf.Graphics.Layer;
namespace HideLayer
{
class Program
{
static void Main(string[] args)
{
//PdfDocumentインスタンスを作成する
PdfDocument pdf = new PdfDocument();
//サンプルPDFドキュメントをロードする
pdf.LoadFromFile("AddLayers.pdf");
//指定したレイヤーをインデックスで非表示にする
pdf.Layers[0].Visibility = PdfVisibility.Off;
//指定したレイヤーを名前で非表示にする
//pdf.Layers["Watermark"].Visibility = PdfVisibility.Off;
//結果ドキュメントを保存する
pdf.SaveToFile("HideLayer.pdf");
}
}
}Imports Spire.Pdf
Imports Spire.Pdf.Graphics.Layer
Namespace HideLayer
Class Program
Private Shared Sub Main(ByVal args() As String)
'PdfDocumentインスタンスを作成する
Dim pdf As PdfDocument = New PdfDocument
'サンプルPDFドキュメントをロードする
pdf.LoadFromFile("AddLayers.pdf")
'指定したレイヤーをインデックスで非表示にする
pdf.Layers(0).Visibility = PdfVisibility.Off
'指定したレイヤーを名前で非表示にする
'pdf.Layers["Watermark"].Visibility = PdfVisibility.Off;
'結果ドキュメントを保存する
pdf.SaveToFile("HideLayer.pdf")
End Sub
End Class
End Namespace
Spire.PDF for .NET では、PdfDocument.Layers.RemoveLayer(string) メソッドを使用して、既存のレイヤーを名前で削除することがサポートします。ただし、同名の PDF レイヤーが存在する場合があります。このメソッドは、同じ名前のすべての PDF レイヤーを削除します。詳細な手順は次のとおりです。
using Spire.Pdf;
namespace DeleteLayer
{
class Program
{
static void Main(string[] args)
{
//PdfDocumentインスタンスを作成する
PdfDocument pdf = new PdfDocument();
//PDFドキュメントをロードする
pdf.LoadFromFile("AddLayers.pdf");
//名前でレイヤーを削除する
pdf.Layers.RemoveLayer(("透かし"));
//結果ドキュメントを保存する
pdf.SaveToFile("DeleteLayer.pdf", FileFormat.PDF);
}
}
}Imports Spire.Pdf
Namespace DeleteLayer
Class Program
Private Shared Sub Main(ByVal args() As String)
'PdfDocumentインスタンスを作成する
Dim pdf As PdfDocument = New PdfDocument
'PDFドキュメントをロードする
pdf.LoadFromFile("AddLayers.pdf")
'名前でレイヤーを削除する
pdf.Layers.RemoveLayer("透かし")
'結果ドキュメントを保存する
pdf.SaveToFile("DeleteLayer.pdf", FileFormat.PDF)
End Sub
End Class
End Namespace
結果ドキュメントから評価メッセージを削除したい場合、または機能制限を取り除く場合は、についてこのメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。にお問い合わせ、30 日間有効な一時ライセンスを取得してください。