アイコン 株式会社トラスト・ソフトウェア・システム
電話:03-5316-3375info@trustss.co.jp
電話:03-5316-3375info@trustss.co.jp

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

メタデータ管理

PDFのメタデータを追加、削除、更新できます。
標準メタデータフィールドの作成者、タイトル、件名などのを管理できます。
さらに、カスタムメタデータフィールドを管理し、XMLコンテンツでXMPメタデータを直接変更することもできます。

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

Pdftools SDK 価格見積もり

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

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

サンプル

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

 
Toolbox add-onの全機能は無償で試用できますが、試用版(無料)のライセンスキーが必要です。
試用ライセンスキー要求からご要望ください。

PDFのメタデータを一覧表示

サンプルプロジェクトではメタデータばかりではなく、PDFの属性値も一覧表示します。

メタデータを追加

サンプルプロジェクトではPDFドキュメントの作成者、タイトル、作成者などのメタデータを設定します。
他に、別のPDFドキュメントまたはXMPメタデータファイルのコンテンツからメタデータをコピーすることもできます。

メタデータをPDFに追加

PDFの作成者、タイトル、作成者などのメタデータを設定します。
他の手順として、別のPDFドキュメントのメタデータやXMPファイルのコンテンツを使用することもできます。


サンプル・プロジェクト(C)をダウンロード
サンプル・プロジェクト(C#)をダウンロード
サンプル・プロジェクト(Python)をダウンロード
サンプル・プロジェクトをダウンロード
サンプル・プロジェクトの実行手順を参照してください
// 入力PDFを開く
using (Stream inStream = new FileStream(inPath, FileMode.Open, FileAccess.Read))
using (Document inDoc = Document.Open(inStream, null))

// 出力PDFを生成
using (Stream outStream = new FileStream(outPath, FileMode.Create, FileAccess.ReadWrite))
using (Document outDoc = Document.Create(outStream, inDoc.Conformance, null))
{
    // ドキュメント全体のデータをコピー
    CopyDocumentData(inDoc, outDoc);

    // メタデータ処理
    if (args.Length == 3)
    {
        Metadata mdata;

        // 入力ファイルからメタデータ読み出して追加
        using FileStream metaStream = File.OpenRead(mdatafile);
        if (mdatafile.EndsWith(".pdf"))
        {
            // 別のPDFファイルのメタデータを使用
            using Document metaDoc = Document.Open(metaStream, "");
            mdata = Metadata.Copy(outDoc, metaDoc.Metadata);
        }
        else
        {
            // XMPメタデータファイルの内容を使用
            mdata = Metadata.Create(outDoc, metaStream);
        }
        outDoc.Metadata = mdata;
    }
    else
    {
        // メタデータプロパティを設定
        Metadata metadata = outDoc.Metadata;
        metadata.Author = "Your Author";
        metadata.Title = "Your Title";
        metadata.Subject = "Your Subject";
        metadata.Creator = "Your Creator";
    }

    // ページのコピーオプションを定義
    PageCopyOptions copyOptions = new PageCopyOptions();

    // すべてのページをコピーして出力ドキュメントに追加
    PageList copiedPages = PageList.Copy(outDoc, inDoc.Pages, copyOptions);
    outDoc.Pages.AddRange(copiedPages);
}
private static void CopyDocumentData(Document inDoc, Document outDoc)
{
    // ドキュメント全体のデータをコピー (メタデータを除く)

    // 出力設定
    if (inDoc.OutputIntent != null)
        outDoc.OutputIntent = IccBasedColorSpace.Copy(outDoc, inDoc.OutputIntent);

    // ビュワー設定
    outDoc.ViewerSettings = ViewerSettings.Copy(outDoc, inDoc.ViewerSettings);

    // 関連ファイル(PDF/A-3およびPDF 2.0のみ)
    FileReferenceList outAssociatedFiles = outDoc.AssociatedFiles;
    foreach (FileReference inFileRef in inDoc.AssociatedFiles)
        outAssociatedFiles.Add(FileReference.Copy(outDoc, inFileRef));

    // プレーンな埋め込みファイル
    FileReferenceList outEmbeddedFiles = outDoc.PlainEmbeddedFiles;
    foreach (FileReference inFileRef in inDoc.PlainEmbeddedFiles)
        outEmbeddedFiles.Add(FileReference.Copy(outDoc, inFileRef));
}
サンプル・プロジェクトの実行手順を参照してください
// 入力PDFを開く
pInStream = _tfopen(szInPath, _T("rb"));
GOTO_CLEANUP_IF_NULL(pInStream, _T("Failed to open input file \"%s\".\n"), szInPath);
PtxSysCreateFILEStreamDescriptor(&descriptor, pInStream, 0);
pInDoc = PtxPdf_Document_Open(&descriptor, _T(""));
GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pInDoc, _T("Input file \"%s\" cannot be opened. %s (ErrorCode: 0x%08x).\n"),
                                 szInPath, szErrorBuff, Ptx_GetLastError());

// 出力PDFを生成
pOutStream = _tfopen(szOutPath, _T("wb+"));
GOTO_CLEANUP_IF_NULL(pOutStream, _T("Failed to open output file \"%s\".\n"), szOutPath);
PtxSysCreateFILEStreamDescriptor(&outDescriptor, pOutStream, 0);
iConformance = PtxPdf_Document_GetConformance(pInDoc);
pOutDoc      = PtxPdf_Document_Create(&outDescriptor, &iConformance, NULL);
GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pOutDoc, _T("Output file \"%s\" cannot be created. %s (ErrorCode: 0x%08x).\n"),
                                 szOutPath, szErrorBuff, Ptx_GetLastError());

// ドキュメント全体のデータをコピー
GOTO_CLEANUP_IF_FALSE_PRINT_ERROR(copyDocumentData(pInDoc, pOutDoc),
                                  _T("Failed to copy document-wide data. %s (ErrorCode: 0x%08x).\n"), szErrorBuff,
                                  Ptx_GetLastError());

// コピーオプションを設定
pCopyOptions = PtxPdf_PageCopyOptions_New();

// 全てのページをコピー
pInPageList = PtxPdf_Document_GetPages(pInDoc);
GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pInPageList,
                                 _T("Failed to get pages of the input document. %s (ErrorCode: 0x%08x).\n"),
                                 szErrorBuff, Ptx_GetLastError());
pCopiedPages = PtxPdf_PageList_Copy(pOutDoc, pInPageList, pCopyOptions);
GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pCopiedPages, _T("Failed to copy pages. %s (ErrorCode: 0x%08x).\n"), szErrorBuff,
                                 Ptx_GetLastError());

// コピーされたページを出力ファイルに追加
pOutPageList = PtxPdf_Document_GetPages(pOutDoc);
GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pOutPageList,
                                 _T("Failed to get pages of the output document. %s (ErrorCode: 0x%08x).\n"),
                                 szErrorBuff, Ptx_GetLastError());
GOTO_CLEANUP_IF_FALSE_PRINT_ERROR(PtxPdf_PageList_AddRange(pOutPageList, pCopiedPages),
                                  _T("Failed to add copied pages to output. %s (ErrorCode: 0x%08x).\n"),
                                  szErrorBuff, Ptx_GetLastError());

if (argc == 4)
{
    // 入力ファイルからメタデータ読み出して追加
    pMdataStream = _tfopen(szMdatafile, _T("rb"));
    GOTO_CLEANUP_IF_NULL(pMdataStream, _T("Failed to open metadata file \"%s\".\n"), szMdatafile);
    PtxSysCreateFILEStreamDescriptor(&mdataDescriptor, pMdataStream, 0);

    // ファイル拡張子を取得
    TCHAR* szExt = _tcsrchr(szMdatafile, '.');
    _tcscpy(szExtension, szExt);

    if (_tcscmp(szExtension, _T(".pdf")) == 0)
    {
        // 別のPDFファイルのメタデータを使用
        TPtxPdf_Document* pMetaDoc = PtxPdf_Document_Open(&mdataDescriptor, _T(""));
        GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pMetaDoc, _T("Failed to open metadata file. %s (ErrorCode: 0x%08x).\n"),
                                         szErrorBuff, Ptx_GetLastError());
        TPtxPdf_Metadata* pMetadata = PtxPdf_Metadata_Copy(pOutDoc, PtxPdf_Document_GetMetadata(pMetaDoc));
        GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pMetadata, _T("Failed to copy metadata. %s (ErrorCode: 0x%08x)."),
                                         szErrorBuff, Ptx_GetLastError());
        GOTO_CLEANUP_IF_FALSE_PRINT_ERROR(PtxPdf_Document_SetMetadata(pOutDoc, pMetadata),
                                          _T("Failed to set metadata. %s (ErrorCode: 0x%08x).\n"), szErrorBuff,
                                          Ptx_GetLastError());
    }
    else
    {
        // XMPメタデータファイルの内容を使用
        GOTO_CLEANUP_IF_FALSE_PRINT_ERROR(
            PtxPdf_Document_SetMetadata(pOutDoc, PtxPdf_Metadata_Create(pOutDoc, &mdataDescriptor)),
            _T("Failed to set metadata. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError());
    }
}
else
{
    // メタデータのプロパティを設定
    TPtxPdf_Metadata* pMetadata = PtxPdf_Document_GetMetadata(pOutDoc);
    GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pMetadata, _T("Failed to get metadata. %s (ErrorCode: 0x%08x).\n"),
                                     szErrorBuff, Ptx_GetLastError());
    GOTO_CLEANUP_IF_FALSE_PRINT_ERROR(PtxPdf_Metadata_SetAuthor(pMetadata, _T("Your Author")),
                                      _T("%s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError());
    GOTO_CLEANUP_IF_FALSE_PRINT_ERROR(PtxPdf_Metadata_SetTitle(pMetadata, _T("Your Title")),
                                      _T("%s(ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError());
    GOTO_CLEANUP_IF_FALSE_PRINT_ERROR(PtxPdf_Metadata_SetSubject(pMetadata, _T("Your Subject")),
                                      _T("%s(ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError());
    GOTO_CLEANUP_IF_FALSE_PRINT_ERROR(PtxPdf_Metadata_SetCreator(pMetadata, _T("Your Creator")),
                                      _T("%s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError());
}
int copyDocumentData(TPtxPdf_Document* pInDoc, TPtxPdf_Document* pOutDoc)
{
    // ドキュメント全体のデータをコピー (メタデータを除く)

    TPtxPdf_FileReferenceList* pInFileRefList;
    TPtxPdf_FileReferenceList* pOutFileRefList;

    // 出力設定
    if (PtxPdf_Document_GetOutputIntent(pInDoc) != NULL)
        if (PtxPdf_Document_SetOutputIntent(pOutDoc, PtxPdfContent_IccBasedColorSpace_Copy(
                                                         pOutDoc, PtxPdf_Document_GetOutputIntent(pInDoc))) == FALSE)
            return FALSE;

    // ビュワー設定
    if (PtxPdf_Document_SetViewerSettings(
            pOutDoc, PtxPdfNav_ViewerSettings_Copy(pOutDoc, PtxPdf_Document_GetViewerSettings(pInDoc))) == FALSE)
        return FALSE;

    // 関連ファイル(PDF/A-3およびPDF 2.0のみ)
    pInFileRefList  = PtxPdf_Document_GetAssociatedFiles(pInDoc);
    pOutFileRefList = PtxPdf_Document_GetAssociatedFiles(pOutDoc);
    if (pInFileRefList == NULL || pOutFileRefList == NULL)
        return FALSE;
    for (int iFileRef = 0; iFileRef < PtxPdf_FileReferenceList_GetCount(pInFileRefList); iFileRef++)
        if (PtxPdf_FileReferenceList_Add(
                pOutFileRefList,
                PtxPdf_FileReference_Copy(pOutDoc, PtxPdf_FileReferenceList_Get(pInFileRefList, iFileRef))) == FALSE)
            return FALSE;

    // プレーンな埋め込みファイル
    pInFileRefList  = PtxPdf_Document_GetPlainEmbeddedFiles(pInDoc);
    pOutFileRefList = PtxPdf_Document_GetPlainEmbeddedFiles(pOutDoc);
    if (pInFileRefList == NULL || pOutFileRefList == NULL)
        return FALSE;
    for (int iFileRef = 0; iFileRef < PtxPdf_FileReferenceList_GetCount(pInFileRefList); iFileRef++)
        if (PtxPdf_FileReferenceList_Add(
                pOutFileRefList,
                PtxPdf_FileReference_Copy(pOutDoc, PtxPdf_FileReferenceList_Get(pInFileRefList, iFileRef))) == FALSE)
            return FALSE;

    return TRUE;
}
サンプル・プロジェクトの実行手順を参照してください
def copy_document_data(in_doc: Document, out_doc: Document):
    # ドキュメント全体のデータをコピー (メタデータを除く)

    # 出力設定
    if in_doc.output_intent is not None:
        in_doc.output_intent = IccBasedColorSpace.copy(out_doc, in_doc.output_intent)

    # ビュワー設定
    out_doc.viewer_settings = ViewerSettings.copy(out_doc, in_doc.viewer_settings)

    # 関連ファイル(PDF/A-3およびPDF 2.0のみ)
    outAssociatedFiles = out_doc.associated_files
    for in_file_ref in in_doc.associated_files:
        outAssociatedFiles.append(FileReference.copy(out_doc, in_file_ref))

    # プレーンな埋め込みファイル
    out_embedded_files = out_doc.plain_embedded_files
    for in_file_ref in in_doc.plain_embedded_files:
        out_embedded_files.append(FileReference.copy(out_doc, in_file_ref))
# 入力PDFを開く
with io.FileIO(input_file_path, 'rb') as content_pdf_stream:
    with Document.open(content_pdf_stream, None) as content_pdf_document:

        # 出力PDFを生成
        with io.FileIO(output_file_path, 'wb+') as output_stream:
            with Document.create(output_stream, content_pdf_document.conformance, None) as output_document:
                # ドキュメント全体のデータをコピー
                copy_document_data(content_pdf_document, output_document)

                # メタデータ処理
                if metadata_file_path is not None:
                    with io.FileIO(metadata_file_path, 'rb') as metadata_stream:
                        if metadata_file_path.endswith(".pdf"):
                            # 別のPDFファイルからメタデータ読み出して追加
                            with Document.open(metadata_stream, "") as meta_doc:
                                mdata = Metadata.copy(output_document, meta_doc.metadata)
                        else:
                            # XMPメタデータファイルの内容を使用
                            mdata = Metadata.create(output_document, metadata_stream)
                else:
                    mdata = output_document.metadata
                    mdata.author = "Your Author"
                    mdata.title = "Your Title"
                    mdata.subject = "Your Subject"
                    mdata.creator = "Your Creator"

                output_document.metadata = mdata

                # ページのコピーオプションを定義
                copy_options = PageCopyOptions()

                # すべてのページをコピーして出力ドキュメントに追加
                copied_pages = PageList.copy(output_document, content_pdf_document.pages, copy_options)
                output_document.pages.extend(copied_pages)

他の機能サンプルを参照してください。

お問い合わせ、ご質問、技術サポート

質問のページからお送りいただくようお願いします。
または、メールでsupport@trustss.co.jpあてにお送りください。


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

> PDF Structure (PDF構成)

> PDF Imager-LP (画像化)

> PDF Stamper (電子印鑑)

> Pdftools SDK

- サンプル・コード
- Pdftools SDKサンプルの利用手順
- Toolbox Add-on
- Toolbox Add-onサンプルの利用手順
> Pdftools SDK APIリファレンス
- その他のAPI及びコマンドラインツール
> PDF SDK オープンソースと有償ライブラリ