このページには自動翻訳されたテキストを含めることができます。
PDF を PDF/A に変換する
この記事では、Docotic.Pdf を使用して PDF 文書を PDF/A に変換する方法を説明します。この .NET ライブラリには、高性能な PDF から PDF/A への変換器が含まれており、完全にオフラインで動作します。Docotic.Pdf を使用して、PDF/A 文書をゼロから作成することもできます。

PDF を PDF/A に変換する理由は?
PDF/A は、アーカイブ用途向けに設計された特別な PDF 形式です。標準の PDF 文書を PDF/A に変換すると、次の利点があります。
-
長期保存
PDF/A 文書は長年にわたってアクセス可能で利用可能なまま維持されるため、法務、行政、アーカイブ用途に適しています。 -
規制への準拠
厳格なコンプライアンス要件や法的要件がある業界では、文書を PDF/A で保存することがよくあります。 -
PDF ビューアー間で一貫した表示
PDF/A 文書は、異なるシステムや異なる PDF ビューアーで一貫して表示されます。
PDF/A 標準の詳細については、PDF/A とは? 記事を参照してください。
C# で PDF を PDF/A に変換する
PDF から PDF/A に変換するには、次が必要です。
- Docotic.Pdf と Conformance アドオン。
- ライセンスキー。無償の期間限定ライセンスは ダウンロードページ から取得できます。
次の C# コードは PDF ファイルを PDF/A-4 に変換します。
using var pdf = new PdfDocument("input.pdf");
pdf.SaveAsPdfa("output.pdf", PdfaConformanceLevel.Pdfa4);
SaveAsPdfa メソッドは、BitMiracle.Docotic.Pdf.Conformance 名前空間にあるアドオンによって提供されます。PDF/A-1a、PDF/A-1b、PDF/A-2a、PDF/A-2b、PDF/A-2u、PDF/A-3a、PDF/A-3b、PDF/A-3u、PDF/A-4、PDF/A-4e、PDF/A-4f のすべての PDF/A 適合レベルをサポートします。出力はファイルまたはストリームのいずれかに書き込めます。
ソース文書を要求された PDF/A 適合レベルに変換できない場合、SaveAsPdfa は ConformanceException をスローします。詳細は エラー処理 セクションを参照してください。
高度な変換シナリオ
Docotic.Pdf は、PDF/A 文書をゼロから作成する、HTML を PDF/A に変換する、複数の文書を 1 つの PDF/A ファイルに結合するなど、幅広い PDF/A ワークフローをサポートします。
PDF/A 文書を作成する
Docotic.Pdf では、.NET で PDF 文書を作成する さまざまな方法を提供しています。同じ SaveAsPdfa メソッドを使用して、Core API または Layout API で PDF/A 文書を生成できます。
次の C# コードは、Core API を使用して PDF/A-3u 文書を作成します。
using var pdf = new PdfDocument();
pdf.Pages[0].Canvas.DrawString("Hello PDF/A");
pdf.SaveAsPdfa("output.pdf", PdfaConformanceLevel.Pdfa3U);
Layout API では、通常の PDF 文書を作成してから PDF/A に変換します。次のコード例では、PDF/A-1b 文書を生成する方法を示します。
using var ms = new MemoryStream();
PdfDocumentBuilder.Create().Generate(ms, doc => doc.Pages(pages =>
{
pages.Content().Text("Hello, world!");
}));
using var pdf = new PdfDocument(ms);
pdf.SaveAsPdfa("output.pdf", PdfaConformanceLevel.Pdfa1B);
HTML から PDF/A へ
HtmlToPdf アドオン は HTML を PDF に変換します。アーカイブ用に結果を準備するには、生成された PDF を PDF/A として保存します。
var uri = new Uri("https://google.com");
var options = new HtmlConversionOptions
{
PreserveStructureInformation = true,
};
using var converter = await HtmlConverter.CreateAsync();
using var pdf = await converter.CreatePdfAsync(uri, options);
pdf.SaveAsPdfa("output.pdf", PdfaConformanceLevel.Pdfa3A);
PreserveStructureInformation = true オプションは、アクセシブルな文書の生成に役立ちます。これは PDF/A-1a、PDF/A-2a、または PDF/A-3a の適合レベルで重要です。
PDF 文書を PDF/A に結合する
Docotic.Pdf は PDF 文書の結合 をサポートします。結合した文書を PDF/A として保存するには、PdfDocument.Save 呼び出しを SaveAsPdfa に置き換えます。
using var pdf = new PdfDocument("first.pdf");
pdf.Append("second.pdf");
pdf.SaveAsPdfa("merged.pdf", PdfaConformanceLevel.Pdfa1B);
他の PDF 編集 シナリオでも同じ原則を適用できます。たとえば、PDF ページの削除、テキストの編集、フォームフィールドのフラット化を行い、最後に PDF/A として保存します。
C# で ZUGFeRD / Factur-X ファイルを作成する
Factur-X / ZUGFeRD は、PDF/A-3 を基盤とする欧州の電子請求書標準です。Docotic.Pdf を使用して XML 請求書ファイルを埋め込み、有効な Factur-X / ZUGFeRD 文書を生成できます。
using var pdf = new PdfDocument();
PdfFileSpecification xml = pdf.CreateFileAttachment("your_path_to/xrechnung.xml");
xml.Relationship = "Alternative";
pdf.SharedAttachments.Add(xml);
var fx = new XmpSchema("fx", "urn:factur-x:pdfa:CrossIndustryDocument:invoice:1p0#");
var props = fx.Properties;
props.Add(new XmpProperty("DocumentType", new XmpString("INVOICE")));
props.Add(new XmpProperty("DocumentFileName", new XmpString("xrechnung.xml")));
props.Add(new XmpProperty("Version", new XmpString("3.0")));
props.Add(new XmpProperty("ConformanceLevel", new XmpString("XRECHNUNG")));
pdf.Metadata.Schemas.Add(fx);
pdf.SaveAsPdfa("zugferd.pdf", PdfaConformanceLevel.Pdfa3A);
Order-X 文書を作成する
Order-X は、発注書の電子処理を可能にする別の EU 標準です。次の C# スニペットでは、COMFORT プロファイルを使用して Order-X 文書を作成する方法を示します。
using var pdf = new PdfDocument();
using (var file = File.OpenRead("order-data-comfort.xml"))
{
PdfFileSpecification xml = pdf.CreateFileAttachment(file, "order-x.xml");
xml.Relationship = "Data";
pdf.SharedAttachments.Add(xml);
}
var fx = new XmpSchema("fx", "urn:factur-x:pdfa:CrossIndustryDocument:1p0#");
var props = fx.Properties;
props.Add(new XmpProperty("DocumentType", new XmpString("ORDER")));
props.Add(new XmpProperty("DocumentFileName", new XmpString("order-x.xml")));
props.Add(new XmpProperty("Version", new XmpString("1.0")));
props.Add(new XmpProperty("ConformanceLevel", new XmpString("COMFORT")));
pdf.Metadata.Schemas.Add(fx);
pdf.SaveAsPdfa("order-x.pdf", PdfaConformanceLevel.Pdfa3B);
保護された PDF ファイルを PDF/A に変換する
暗号化された PDF ファイルの変換も同様です。正しいパスワードで文書を開き、SaveAsPdfa を呼び出します。
using var pdf = new PdfDocument(fileName, new PdfStandardDecryptionHandler("password"));
pdf.SaveAsPdfa("result.pdf", PdfaConformanceLevel.Pdfa4E);
バッチ処理
複数の PDF ファイルの PDF/A 変換を自動化できます。ディレクトリ内のすべての PDF ファイルを列挙し、それぞれの文書を PDF/A に変換します。次のコード例では、ファイルを並列に変換する方法を示します。
public static async Task ConvertAsync(string directoryPath)
{
string[] files = Directory.GetFiles(directoryPath, "*.pdf", SearchOption.AllDirectories);
if (files.Length == 0)
return;
var semaphore = new SemaphoreSlim(Environment.ProcessorCount);
var tasks = new List<Task>(files.Length);
foreach (var f in files)
{
await semaphore.WaitAsync();
var task = Task.Run(() =>
{
string outputFileName = $"{Path.GetFileName(f)}-{Guid.NewGuid()}.pdf";
try
{
using var pdf = new PdfDocument(f);
pdf.SaveAsPdfa(outputFileName, PdfaConformanceLevel.Pdfa1B);
}
finally
{
semaphore.Release();
}
});
tasks.Add(task);
}
await Task.WhenAll(tasks);
}
任意の PDF ファイルに対する変換ワークフローを実装する場合、生成されたすべてのファイルを PDF/A 準拠として検証する価値があります。バッチ変換と検証にすぐ使えるアプリケーションは 変換品質を評価する セクションにあります。
エラー処理
変換は一部の状況で失敗することがあります。たとえば、次の場合です。
- 入力ファイルが PDF ではない
- 暗号化された PDF に対して無効なパスワードが指定されている
- PDF/A にフォントバイトを埋め込めない
このような場合、Docotic.Pdf は例外をスローします。次のサンプルコードは例外の処理方法を示します。
try
{
using var pdf = new PdfDocument("input.pdf");
pdf.SaveAsPdfa("output.pdf", PdfaConformanceLevel.Pdfa1B);
}
catch (PdfException ex)
{
Console.WriteLine($"Problem with an input document: {ex.Message}");
}
catch (ConformanceException ex)
{
Console.WriteLine($"Unable to convert to PDF/A: {ex.Message}");
}
PDF/A から PDF に変換する
PDF/A から PDF への変換は、文書の編集を容易にするために使われることがあります。処理は PDF から PDF/A への変換よりもかなり簡単です。XMP メタデータの一部を削除するだけです。サンプルコード:
using var pdf = new PdfDocument("pdfa-compliant.pdf");
var schemas = pdf.Metadata.Schemas;
for (int i = 0; i < schemas.Count; ++i)
{
if (schemas[i].Namespace == "http://www.aiim.org/pdfa/ns/id/")
{
schemas.RemoveAt(i);
--i;
}
}
pdf.Save("regular.pdf");
PDF から PDF/A への変換に Docotic.Pdf を選ぶ理由は?
Docotic.Pdf は高性能な純粋な C# .NET ライブラリで、外部依存はありません。Windows、Linux、macOS、Android、iOS、またはクラウド環境で PDF/A 文書を生成できます。さらに、Docotic.Pdf には次の利点があります。
スタンドアロンのオフライン変換
変換は完全にローカル環境で行われます。データが外部サーバーやサードパーティのプロバイダーに送信されることはありません。オフライン変換では、データが環境の外に出ないため、機密文書の保護に役立ちます。
品質
Docotic.Pdf は、品質を損なうことなく、変換中に元の情報を可能な限り保持するように設計されています。
ISO 準拠
Docotic.Pdf は、次の ISO 標準に準拠した PDF/A ファイルを生成します。
- ISO 19005-1:2005 (PDF/A-1)
- ISO 19005-2:2011 (PDF/A-2)
- ISO 19005-3:2012 (PDF/A-3)
- ISO 19005-4:2020 (PDF/A-4)
すべての Docotic.Pdf ビルドは、何千もの自動テストを通過しています。PDF から PDF/A へのテストでは、さまざまなソースからの大量の PDF ファイルを使用し、それらをさまざまな PDF/A 適合レベルに変換します。生成されたファイルは、その後 PDF/A 準拠が検証されます。
1 つのテスト群では、変換後のファイルに対して veraPDF が問題を報告しないことを確認します。別のテスト群では、各生成ファイルを比較 し、期待される PDF/A バージョンと照合します。この期待バージョンは、veraPDF と Adobe Acrobat Preflight の両方で準拠上の問題がないことが検証されています。
変換品質の評価
オープンソースの PdfToPdfa プロジェクト を提供しています。これは PDF ファイルを PDF/A に変換する .NET コンソール アプリケーションです。変換後、アプリは各生成文書を検証します。このプロジェクトでは、変換に Docotic.Pdf、検証に veraPDF を使用します。
このアプリケーションはコマンドライン モードで使用して、PDF/A ワークフローを自動化できます。また、UI モードで使用して、変換品質とパフォーマンスをすばやく評価することもできます。

このアプリケーションは、任意の PDF ファイルまたはディレクトリを処理します。利便性のため、プロジェクト リポジトリには veraPDF corpus と Isartor Test Suite のテスト ファイルも含まれています。
PDF/A への変換中に何が起こるか?
PDF/A 仕様では、準拠文書に対する要件 が大量に定義されています。コンバーターは、それらすべてを検証し、適用して有効な PDF/A ファイルを生成します。高いレベルでは、すべての PDF オブジェクトをチェックし、検出された PDF/A 準拠の問題を修正します。
すべての PDF を、内容を変更せずに PDF/A に変換できるわけではありません。選択した PDF/A 適合レベルでは一部の PDF 機能が禁止されているため、コンバーターはそれらを削除するか変換しなければなりません。その結果、変換は可逆でない処理になる場合があります。
たとえば、PDF/A-1 では、オプションコンテンツ(レイヤー)、埋め込みファイル(添付ファイル)、透明性は許可されません。元の PDF 文書がこれらの機能を使用している場合、コンバーターはレイヤーをフラット化し、添付ファイルと透明性を削除します。このような内容の保持が重要な場合は、それをサポートする PDF/A 適合レベルを選択してください。
- PDF/A-2、PDF/A-3、および PDF/A-4 のすべての適合レベルは、透明性とオプションコンテンツをサポートします。
- PDF/A-3、PDF/A-4、および PDF/A-4f は、任意の埋め込みファイルをサポートします。PDF/A-2 と PDF/A-4 は、埋め込み PDF/A ファイルのみをサポートします。
Docotic.Pdf が最も一般的な問題をどのように修正するかを見ていきましょう。
フォントとテキスト
コンバーターは、文書で使用されているすべてのフォントを埋め込もうとします。すでに埋め込まれていないフォントについては、まずシステムのフォントコレクションまたはカスタムフォントソースから適切なフォントデータを読み込もうとします。一致するフォントが見つからない場合は、代替フォントが使用されます。
カスタム フォント ローダーを提供することで、この処理をカスタマイズできます。IFontLoader インターフェイスはフォントデータの読み込みに使用されます。たとえば DirectoryFontLoader 実装は、1 つ以上の指定ディレクトリからフォントバイトを読み込みます。
IFontLoader で要求されたフォントを読み込めない場合に代替フォントを提供するため、IFallbackFontProvider インターフェイスの実装を指定することもできます。
次の例は、フォント読み込みをカスタマイズする方法を示します。
public static void ConfigurePdfToPdfa(
string fileName,
PdfaConformanceLevel level,
Stream output,
IFontLoader? fontLoader,
IFallbackFontProvider? fallbackFontProvider)
{
var config = PdfConfigurationOptions.Create();
if (fontLoader != null)
config.FontLoader = fontLoader;
if (fallbackFontProvider != null)
config.FallbackFontProvider = fallbackFontProvider;
using var pdf = new PdfDocument(fileName, config);
pdf.SaveAsPdfa(output, level);
}
Docotic.Pdf は、一貫性のないグリフ幅、CMap、ToUnicode ストリームも修正します。未定義文字は変換処理中に削除されます。
メタデータ
コンバーターは、無効なメタデータ スキーマやプロパティを修正または削除し、pdfaid スキーマを追加し、XMP メタデータと文書情報辞書を同期します。
Conformance アドオンは、PdfDocument 用の ReadPdfaConformance 拡張メソッドも提供します。このメソッドを使用して、XMP メタデータに宣言された PDF/A 適合レベルを読み取ります。
using var pdf = new PdfDocument("input.pdf");
PdfaConformanceLevel? level = pdf.ReadPdfaConformance();
色
デバイス依存の色は PDF/A 文書では許可されないため、コンバーターはデバイス色に対して出力インテント ICC プロファイルを提供します。また、準拠していない出力インテントと色空間も修正します。
PDF/A-1 文書を生成するときは透明性が削除されます。これは、ブレンドモード、ソフトマスク、透明性グループに影響します。無効な画像プロパティも修正されます。
埋め込みファイル
埋め込みファイルの扱いは PDF/A 適合レベルによって異なります。PDF/A-1 では、すべての埋め込みファイルが削除されます。
PDF/A-2 および PDF/A-4 では、埋め込み PDF ファイルは PDF/A に変換されます。PDF 以外の添付ファイルは削除されます。埋め込み PDF/A ファイルについては、PDF/A-4 で MIME タイプとファイル関係も修正されます。
PDF/A-3 では添付ファイルは削除されませんが、ファイル関係と MIME タイプは修正されます。
インタラクティブ機能
コンバーターは、欠落または無効な外観ストリームを生成します。また、無効な注釈プロパティを修正し、許可されていない種類の注釈をフラット化し、許可されていない種類のアクションを削除します。
XFA フォームは、PDF/A-2、PDF/A-3、および PDF/A-4 では削除されます。XFA フォームを許可するのは PDF/A-1 のみですが、それでも長期アーカイブには推奨されません。
PDF/A-1 を対象にする場合、オプションコンテンツはフラット化されます。その他の適合レベルでは、コンバーターは、不完全な順序配列、名前の欠落、重複する名前を含むオプションコンテンツ構成辞書を修正します。
デジタル署名
デジタル署名 は、設計上、署名された内容の変更を許可しません。PDF の署名済み部分に PDF/A 準拠の問題が含まれている場合、コンバーターはそれらを修正し、署名を無効化します。
その他の領域
アクセシビリティのため、コンバーターは基本的な文書構造情報が不足している場合にそれを追加します。また、無効な構造タグや非標準の構造タグも修正します。これは PDF/A-1a、PDF/A-2a、および PDF/A-3a 文書に適用されます。
PDF/A ファイルは暗号化してはならないため、コンバーターは出力ファイルの暗号化を許可しません。
LZW 圧縮データは PDF/A では許可されません。コンバーターは LZW ストリームを Flate 圧縮で再圧縮します。また、準拠していない配列、辞書、数値、名前、文字列オブジェクトも修正します。
無効なファイルヘッダーやクロスリファレンス セクションも自動的に修正されます。
結論
Conformance アドオンを備えた Docotic.Pdf は、高品質な PDF から PDF/A への変換器を提供します。既存の PDF 文書を任意の PDF/A 適合レベルに変換することも、PDF/A 文書をゼロから作成することもできます。このライブラリは完全にオンプレミスで動作するため、データがサーバーの外に出ることはありません。
サンプル リポジトリの PDF/A セクション では、PDF/A 文書の作成と処理に関する実行可能な C# および VB.NET の例を確認できます。
また、PDF から PDF/A への変換用のオープンソース PdfToPdfa アプリケーション もあります。これを使用して PDF/A ワークフローを自動化することも、単に PDF ファイルを PDF/A に変換することもできます。
よくある質問
適切な PDF から PDF/A への変換器を選ぶには?
優れた PDF から PDF/A への変換器は、次を満たすべきです。
- PDF/A 準拠のファイルを生成する。
- ソース文書の情報と視覚的な外観を保持する。
- ファイルをサードパーティのサーバーに送信せずにローカルで実行する。
- 高速に動作する。
- (自動化が必要な場合)UI なしでの実行をサポートする。
Docotic.Pdf ライブラリはすべての条件を満たしており、PDF から PDF/A への変換に適しています。
PDF/A 文書が準拠していることを検証するには?
検証ソフトウェアを使用します。優れた PDF/A 検証ツールは、次を満たすべきです。
- PDF/A の ISO 標準に深く準拠している。
- ファイルをサードパーティのサーバーに送信せずにローカルで実行する。
- 高速に動作する。
- (自動化が必要な場合)UI なしでの実行をサポートする。
veraPDF は、これらすべての要件をサポートする業界標準の検証ツールです。
PDF から PDF/A への変換ワークフローを自動化するには?
Docotic.Pdf Conformance アドオンを使用して PDF ファイルを変換します。結果は veraPDF 検証ツールで検証します。変換と検証の進行状況を追跡します。
オープンソースの PdfToPdfa アプリケーション は、このワークフローを実装しています。独自実装の出発点として使用してください。
どの PDF/A バージョンを使うべきですか?
PDF/A バージョンの選び方 セクションを参照してください。
ZUGFeRD 用に XML ファイルを PDF に埋め込めますか?
はい、もちろんです。ZUGFeRD / Factur-X ファイルの生成 セクションの例を参照してください。
PDF/A 文書を保護するには?
技術的には不可能です。PDF/A ファイルは暗号化できません。