Spire.Pdf.CPP (12.10.7) と旧バージョンの相違点

本アップデートは、差し替え可能なパッチではなく構造的なアップグレードです。ヘッダーのエントリポイントは単一ヘッダーからオンデマンドなインクルードへ、名前空間の構成はフラットから .NET に準拠した階層へ、文字列の ABI はワイド文字から UTF-8 へと変更されます。また、169 のクラス名と 3 つの利用形式(ネイティブコレクション、入れ子配列、辞書)が追加されています。既存のプロジェクトではソースの修正と完全な再コンパイルが必要であり、ライブラリファイルの置き換えのみでは機能しません。


Spire.Pdf for C++ 12.10.7 — 旧 C++ パッケージとの詳細な変更点


ソースライブラリ: Spire.Pdf.dll 12.10.7 (netstandard2.0, FileVersion 12.10.7.1420)
想定読者: 旧 C++ パッケージを利用している顧客コード — #include <Spire.Pdf.o.h>、フラットな Spire::Pdf 名前空間、wchar_t の文字列インターフェースを使用
ベースライン: 以下の「旧パッケージ」=ベンダーの以前の C++ パッケージ(src/CPP の構成);「新パッケージ」=ここで配布されるパッケージ


1. 主要指標

項目旧パッケージ12.10.7変更
対象プラットフォーム3 系統(Windows x64 / Linux x64 / macOS)10 の RID(Windows 2 / Linux glibc 2 / musl 2 / OHOS 2 / macOS 2)3 → 10;検証・配布されているのは win-x64 のみ
パッケージサイズ—(リポジトリに旧パッケージのアーカイブなし)75.9 MB(75,894,559 B、win-x64)—
.h ファイル数業務用 675 + 共通 42(Spire.Pdf.o.h を除く)業務用 746 + 共通 25 + pch.h(計 772)+71 / −17 / +1
class EXPORTS 定義数558616(ユニークなクラス名 571)+169 追加 / −156 削除
C インターフェースヘッダーなしSpire.Pdf.C.h、6398 の宣言新規(内部相互運用ヘッダーであり、公開 C API ではない)
AOT ライブラリのバージョン—12.10.7.1420—
エクスポートされたシンボル総数—6398—
同梱 boost ヘッダー3841+3
同梱サンプル .cpp(リポジトリ内)—(旧サンプルなし)1+1
ファイルレベルの差分(業務ヘッダーのベース名)ユニーク名 675ユニーク名 686+201 / −190

クラス名はパスを無視した ベース名 で比較しています。リネーム(例:PdfFieldActions → PdfFormFieldAdditionalActions)は各側に 1 回ずつ計上されます。
156 件の「削除」には、旧パッケージの 5 つの曖昧さ回避用プレフィックス名と、いくつかのリネーム置換が含まれます — これは 156 の機能が消滅したことを意味するものではありません;4.7 を参照。

互換性の判定

項目判定
ソース互換性なし — 第 3、4、6 節の通り移行が必要
バイナリ互換性なし — 再コンパイルと再リンクが必須;古いオブジェクトファイルを置き換えた .dll / .lib のみにリンクしても失敗する
挙動互換性大部分は同等。型ダウンキャストの失敗時セマンティクスが変更された(4.4);それ以外は機械的な違い

一言で: インターフェースの形状(ヘッダー / 名前空間 / 文字列 / 一部のクラス名)は変わりましたが、ビジネスロジック自体の変更はほとんど不要です。
再設計が必要なのはわずか 3 点のみ:Object のダウンキャスト方法(失敗時セマンティクス含む)、PdfDestination の構築方法、およびベンダーにより削除された KeyPressed(4.3 参照)。


2. プラットフォームとバイナリの変更

プラットフォーム系統旧パッケージ12.10.7
Windowsx64(Debug / Release ビルド;Spire.Pdf.Cpp.dll / .lib)win-x64、win-arm64(SpirePdfCpp.dll / .lib、デバッグディレクトリなし)
Linux glibcx64(SpirePdfCpp.so)linux-x64、linux-arm64(libSpirePdfCpp.so)
Linux musl—linux-musl-x64、linux-musl-arm64
OpenHarmony—ohos-x86_64、ohos-arm64-v8a
macOSあり(CMake の APPLE 分岐、.so)osx-x64、osx-arm64(.dylib)
描画 / テキスト依存Skia(libSkiaSharp)Skia + HarfBuzz(libHarfBuzzSharp、新規)
パッケージ内容ラッパーのみ: AOT の Spire.Pdf.Base.dll と libSkiaSharp.dll を同じディレクトリに手動でコピーする必要があったラッパー + AOT Base + Skia + HarfBuzz を同梱

主なバイナリの相違:

同梱 README からの新しいデプロイ制約:


3. ヘッダーと名前空間の再構成

3.1 ディレクトリ構造

旧バージョン:

include/
  Spire.Pdf.o.h          # 48 KB の手書き包括エントリ、内部に 713 の include
  pdf/h/*.h              # 業務用フラットヘッダー 675
  common/h/*.h           # 基底型ヘッダー 42
  boost/**               # boost ヘッダー 38

新バージョン:

include/
  Spire.Pdf.C.h          # 6398 の内部 C 相互運用宣言(公開 C API ではない)
  Spire/Pdf/**           # .NET 名前空間ごとに階層化された業務用ヘッダー 746
    Graphics/ Texts/ Tables/ Actions/ Annotations/ Forms/
    Layout/Tables/ Destinations/ Security/ Print/ Utilities/ ...
  Spire/Pdf/common/h/**  # 基底型ヘッダー 25
  Spire/Pdf/pch.h
  boost/**               # boost ヘッダー 41(macOS の設定を含む)

3.2 一般的なクラスの名前空間マッピング

型旧パッケージ新パッケージ
PdfDocument / PdfPageBase / PdfPageSize / FileFormatSpire::Pdf::…変更なし(ルート名前空間)
PdfCanvas / PdfBrush / PdfFontSpire::Pdf::PdfCanvas など(すべてルート)Spire::Pdf::Graphics::PdfCanvas / …::PdfBrush / …::PdfFont
PdfGridSpire::Pdf::PdfGridSpire::Pdf::Grid::PdfGrid
PdfTable(PdfLayoutWidget 派生)Spire::Pdf::PdfTableSpire::Pdf::Tables::PdfTable
PdfTextExtractorSpire::Pdf::PdfTextExtractorSpire::Pdf::Texts::PdfTextExtractor
PdfBookmarkSpire::Pdf::PdfBookmarkSpire::Pdf::Bookmarks::PdfBookmark
PdfAnnotation1 つのみAnnotations::PdfAnnotation および Interactive::Annotations::PdfAnnotation
PdfField1 つのみFields::PdfField および Interactive::Forms::PdfField
PdfSignature1 つのみSecurity::PdfSignature および Interactive::DigitalSignatures::PdfSignature
PdfTableElement該当するクラスなしSpire::Pdf::Layout::Tables::PdfTableElement(新規)

ベア名の利用: namespace Spire::Pdf の 内部で サブ名前空間を開きます(外側で書くとベア名が見えるだけで、修飾名 Spire::Pdf::Graphics::… はそのレベルに解決されません):

#include "Spire/Pdf/PdfDocument.h"
#include "Spire/Pdf/Graphics/PdfCanvas.h"

using namespace Spire::Pdf;
namespace Spire { namespace Pdf {
    using namespace ::Spire::Pdf::Graphics;   // PdfCanvas、PdfFont などのベア名を利用可能に
} }

3.3 同名の型:62 グループ、各ペアの片側のみを開く

62 グループの同名型(46 クラス + 16 列挙型)が 2 つの異なる名前空間に存在します(例: Annotations::PdfAnnotation と Interactive::Annotations::PdfAnnotation はどちらも実在の型)。各グループの片側のみを開くことができます;
両方を開くとベア名が即座に曖昧になり(C2872)、using X::PdfTable; を追加しても抑制されません。

// ❌ 両側を開くと:ベア名 PdfTable は即座に曖昧になる
using namespace ::Spire::Pdf::Tables;
using namespace ::Spire::Pdf::Utilities;

// ✅ 片側のみを開き、もう片側は完全修飾で書く
using namespace ::Spire::Pdf::Tables;
intrusive_ptr<PdfTable> a = /* Tables 版 */;
intrusive_ptr<Spire::Pdf::Utilities::PdfTable> b = /* Utilities 版 */;

// ✅✅ 推奨:両側を名前空間でエイリアスし、どちらも開かない
namespace Tables = ::Spire::Pdf::Tables;
namespace Util   = ::Spire::Pdf::Utilities;
intrusive_ptr<Tables::PdfTable> a;
intrusive_ptr<Util::PdfTable>   b;

コンパイラが C2872 'X': ambiguous symbol(曖昧なシンボル)を報告した場合、これが原因です — エラー箇所のクラス名からどちらの側に属するかを判別してください。
⚠ 62 グループという数は 12.10.7 時点で計測したものです;DLL を入れ替えると衝突対象そのものが変化するため、これを定数とは見なさないでください。


4. 互換性を破る API の変更

4.1 文字列:ワイド文字 → UTF-8

LPCWSTR_S という名前は維持されていますが、その定義が変更されました:

typedef const wchar_t* LPCWSTR_S;   // 旧パッケージ
typedef const char*    LPCWSTR_S;   // 新パッケージ

インターフェースのシグネチャはそれに応じて const std::string& に統一されています:

API旧パッケージ新パッケージ
PdfDocument::LoadFromFilevoid LoadFromFile(LPCWSTR_S fileName)void LoadFromFile(const std::string& fileName)
PdfDocument::SaveToFilevoid SaveToFile(LPCWSTR_S fileName, FileFormat f)void SaveToFile(const std::string& fileName, FileFormat f)
PdfField::GetFullNameLPCWSTR_S GetFullName()std::string GetFullName() const
旧形式変更方法
L"abc"L を削除 → "abc"
LPCWSTR_S維持しても可(現在は const char*);あるいは const char* / std::string に変更
std::wstring 変数std::string に変更し、かつ エンコーディング変換(GBK / UTF-16 → UTF-8)を自前で行う
x.c_str()削除する — 新しいインターフェースの引数はすでに const std::string& なので、そのまま渡す

⚠ .c_str() は過剰に付け足しやすいものです:単に std::string → const char* → std::string と往復するだけです。
これは コンパイルも動作も正しい のですが、不要であり、インターフェースが互換でないと思い込ませる恐れがあります。

参考規模: LPCWSTR_S は旧パッケージヘッダー内に 1599 回出現;新パッケージには const std::string& 引数が 809 個あり、wchar_t は 0 個です。MSVC では /utf-8 が必要です;新しいヘッダーには UTF-8 の中国語コメントが含まれています。

4.2 PdfDestination:構築可能な基底クラス → 抽象基底クラス(PdfDestinationMode も削除)

旧パッケージ: PdfDestination は具象クラスで、new してからプロパティを一つずつ設定していました。

intrusive_ptr<PdfDestination> dest = new PdfDestination(page);
dest->SetMode(PdfDestinationMode::Location);   // 旧列挙型: Location/FitToPage/FitH/FitR/FitBH
dest->SetLocation(new PointF(0, y));
dest->SetZoom(2.f);

新パッケージ: PdfDestination は 抽象基底クラス(protected コンストラクタ、公開メンバなし)で、PdfDestinationMode は 存在せず;機能は Destinations::PdfExplicitDestinationType(8 値)および具象サブクラスにより提供され、構築は ワンショット になります:

intrusive_ptr<PdfDestination> dest = new Destinations::PdfXYZExplicitDestination(page, 0, y, 2.f);
宛先の種類新パッケージのクラス
XYZDestinations::PdfXYZExplicitDestination(page, left, top[, zoom])
Fit / FitH / FitV / FitR / FitB / FitBH / FitBVDestinations::PdfFit*ExplicitDestination(…)

これに伴い、PdfEmbeddedGoToAction のコンストラクタ引数も「宛先オブジェクト」から「ページ番号 + ズーム」に変更されています(4.3 参照)。

4.3 クラスとメンバーのリネーム(ベンダーにより削除された KeyPressed を含む)

以下は計測された旧 → 新のマッピングです(フォームフィールド/注釈のアクションクラスは .NET 側で一連のリネームを経ており、GetActions() / GetAdditionalActions() が返す型は特に影響を受けやすいです):

旧パッケージ新パッケージ相違
Spire::Pdf::PdfFieldActionsSpire::Pdf::Actions::PdfFormFieldAdditionalActionsメンバー名が変更:GetFormat/GetValidate/GetCalculate → GetOnFormat/GetOnValidate/GetOnCalculate(セッターも同様);マウス enter/exit は基底クラス PdfAnnotationAdditionalActions に繰り上がり(OnEnter/OnExit);KeyPressed は 置換なし
Spire::Pdf::PdfAnnotationActionsSpire::Pdf::Actions::PdfAnnotationAdditionalActionsマウス/フォーカスアクションに On プレフィックスが付与:GetMouseDown → GetOnMouseDown、GetGotFocus → GetOnReceiveFocus など;OnOpenPage/OnClosePage/OnShowPage/OnHidePage が追加;Format/Validate/Calculate はこのクラスになくなった
Spire::Pdf::PdfDocumentActionsSpire::Pdf::Actions::PdfDocumentAdditionalActionsメンバーが GetBeforeClosing/GetBeforeSaving/GetBeforePrinting/GetAfterSaving/GetAfterPrinting に変更(旧 GetBeforeCloseAction などは動名詞形に);GetAfterOpenAction に同名メンバーはなし
Spire::Pdf::PdfEmbeddedGoToActionSpire::Pdf::Actions::PdfGoToEmbeddedActionコンストラクタが (fileName, pageNumber, zoom) に変更;GetIsNewWindow → GetNewWindow、GetFileName → GetEmbeddedFileName(読み取り専用)
Spire::Pdf::PdfTextFind(結果オブジェクト)Spire::Pdf::Texts::PdfTextFragment検索エントリが new Texts::PdfTextFinder(page)->Find(text) に変更;GetBounds/GetPositions/GetSizes が単一値から std::vector に変更
PdfDocument::GetSecurity()PdfDocument::GetSecurityPolicy()読み取りは GetSecurityPolicy() 経由、書き込みは Encrypt(policy) 経由。旧名は 引き続きエクスポートされるが警告を出力
Spire::Pdf::License(クラス)Spire::Pdf::License::LicenseProvider(クラス)License は現在 名前空間;SetLicenseKey/SetLicenseFileName/ClearLicense は維持、ファイルパスは SetLicense(path)、ストリームは SetLicense(intrusive_ptr<Stream>)
Spire::Pdf::PdfPaperSizesSpire::Pdf::Print::PdfPaperSizeクラス名変更、ただし A4 などの静的定数は 引き続きエクスポートされない(6.4 参照)
Security_PdfSignature / Utilities_PdfTable / Utilities_PdfImageInfo / Collections_PdfCollection / Security_IPdfSignatureFormatterSecurity::PdfSignature / Utilities::PdfTable / Utilities::PdfImageInfo / Collections::PdfCollection / …旧パッケージは曖昧さ回避に プレフィックス名 を使用;新パッケージは 名前空間 で区別し、ベア名は変わらない
// 旧パッケージ
intrusive_ptr<PdfFieldActions> actions = field->GetActions();
actions->SetFormat(jsAction);
actions->SetKeyPressed(jsAction);

// 新パッケージ
intrusive_ptr<Actions::PdfFormFieldAdditionalActions> actions = field->GetActions();
actions->SetOnFormat(jsAction);
// SetKeyPressed: 対応するメンバーなし

旧パッケージの 2 つのアクションクラスは、新 API では「基底クラス + 派生クラス」の関係になっています
(PdfFormFieldAdditionalActions : PdfAnnotationAdditionalActions);メンバーが重複するため、上の表のマッピングを参照してください。

上記は 例であり、完全な集合ではありません。.NET 側のその他のバージョン間リネームについては、単に コンパイラエラー に従ってください(名前が見つからなければリネームされています)、コンパイラが型/メンバーを直接指摘します。

KeyPressed には置換なし:

API旧パッケージ新パッケージ結論
KeyPressed(フォームフィールド/注釈の JS アクション)PdfFieldActions::Get/SetKeyPressed、PdfAnnotationActions::Get/SetKeyPressedなしベンダーにより .NET API から削除、置換なし;その部分のロジックは再設計が必要

ベンダーのデモスイートがカバーする範囲内では、その他のすべての旧メンバーにも対応する形式が存在します。
デモでカバーされていないマイナーな型には、.NET のその他のバージョン間差分が存在する可能性があります — コンパイラエラーを正とみなしてください;本ドキュメントは「KeyPressed 以外にギャップはない」とは主張しません。

4.4 Object:型チェックとダウンキャスト(挙動の変更を含む)

メンバー旧パッケージ新パッケージ
GetInstanceTypeName()公開、C++ のマングル名(typeid(T).name())を返す非公開(呼び出すと C2248)、中身はマネージドの完全名
ManagedName()存在しない非公開(ジェネレーター内部専用)
CheckType<T>(p)公開公開、セマンティクスは変わらず(true/false)
Dynamic_cast<T>(p)boost キャスト;失敗時に検証なしの再タグ付けへフォールバック ⇒ 決して null を返さないboost キャストのみ:失敗時に null を返す
Convert<T>(p)検証なしの再タグ付け;型が違っても非 null を返す検査付き:失敗時に SpireTypeError をスロー(Actual() / Target() を保持)
UncheckedCast<T>(p)存在しない新しい 明示的な逃げ道(引き続き検証なしの再タグ付け)
// 旧パッケージ:型名文字列で比較し、検証なしでキャスト
if (widget->GetInstanceTypeName() == /* ある名前 */) { /* … */ }
intrusive_ptr<PdfNewPage> page = Object::Convert<PdfNewPage>(doc->GetPages()->Add());  // 失敗しない

// 新パッケージ:検査付きの 3 形式
if (Object::CheckType<PdfNewPage>(obj)) { /* 是/否 のみが必要 */ }

if (auto page = Object::Dynamic_cast<PdfNewPage>(obj)) {   // その型でなければ nullptr
    page->DoSomething();
}

try {
    auto page = Object::Convert<PdfNewPage>(obj);          // その型でなければスロー
    page->DoSomething();
}
catch (const SpireTypeError& e) {
    // e.Actual() = 実際のマネージド完全名;e.Target() = 期待される完全名
}

⚠ 重要な挙動変更: 旧 Convert は「誤ってラベルを付けても成功とみなしていた」のに対し、新 Convert は 即座にスロー します。
旧 Dynamic_cast は失敗時に「新しいラベルの付いたオブジェクト」を黙って返していましたが、新 Dynamic_cast は nullptr を返します。
旧パッケージから移行し「決して null にならない」ことに依存しているコードは、null チェックを追加するか、Convert + 例外処理に切り替えてください。

4.5 戻り値の型の変更

API旧パッケージの戻り値新パッケージの戻り値
PdfField::GetFullName()LPCWSTR_S(ワイド文字)std::string(UTF-8)
Pdf3DAnnotation::Get_3DData()intrusive_ptr<Stream>std::vector<uint8_t>
Texts::PdfTextFragment の GetBounds/GetPositions/GetSizes旧 PdfTextFind 相当の GetBounds/GetPosition/GetSize、いずれも単一値std::vector<intrusive_ptr<…>>

4.6 イベント登録:C++ のエントリポイントが削除(旧版でもほぼ利用不可)

旧パッケージは 10 クラスにわたる 19 のイベント に対して add_* / remove_* アクセサをエクスポートしていました。例:

add_PageAdded / remove_PageAdded
add_BeginPageLayout / remove_BeginPageLayout
add_BeginPrint / add_EndPrint
add_QueryRowCount / add_QueryNextRow
add_SaveProgress / add_PaperSettings

新パッケージの C++ である Spire/Pdf/** には、これらのアクセサは 一切存在しません(計測:マッチする add_* は無関係の add_ref のみ)。ただし、旧パッケージでのイベント登録もすでに不完全でした:16 の *EventHandler クラスのうち 15 は Invoke がコメントアウトされており(//virtual void Invoke (…))、顧客はコールバックを実装できませんでした;実装可能な virtual void Invoke(...) を持っていたのは BeginRowLayoutEventHandler のみです。したがって:

また:

4.7 削除された公開クラス:156 の旧クラス名が消滅

クラスのベース名で比較すると、156 の旧クラス名が新パッケージに現れなくなっています。これを 156 の機能消滅と読んではいけません:

カテゴリ代表的なクラス備考
基底値型 / コレクションインターフェースByte、Char、Int16、Int64、Single、UInt16/32/64、DictionaryEntry、ICollection、IDictionary、IDictionaryEnumerator、IList、List、SpireStringラッパークラスは不要に:文字列は std::string、整数はネイティブ型、コレクションはネイティブプロトコルを使用;String / Decimal は別途エクスポート
内部実装 / シリアライゼーション / フォーマット変換ZipArchive*、ZippedContentStream、ZlibZipWriter、XmpMetadata/XmpSchema/XmpStructure(→ PdfXmpMetadata / PdfXmpNamespace)、Story*、FixedDocument/FixedPage/Glyphs、HtmlConverter/HtmlToPdf*、Qt_HtmlConverter、TranslatorFactory旧パッケージが漏出させた実装クラス;新パッケージはエクスポートしない
描画 / XPS / WPF モデル(旧パッケージが漏出させた .NET 型)Brush、Canvas、Geometry、Path、PathFigure、PathGeometry、MatrixTransform、GradientStop(s)、SolidColorBrush、ImageBrush、Visual、ResourcesPDF の公開 API の一部ではない;新パッケージはエクスポートしない
ベンダーによりリファクタリング/削除された PDF 型PdfGraphicsState、PdfImageMask、PdfHTMLTextElement、PdfHtmlLayoutFormat、PdfPaperSourceTray、PdfButtonWidgetWidgetItem、PdfTexBoxWidgetItem などすでにベンダーの .NET API 側でリネーム/削除済み;コンパイラエラーを正とみなしてください

旧パッケージの PdfPaperSizes の定数(Letter / A4 …)は すべてコメントアウト されており、いずれの生成でもエクスポートされたことはありません(6.4 参照)。


5. 新機能

5.1 新しいクラス(169 のクラス名、リネーム置換を含む)

機能領域代表的なクラス
文書比較PdfComparer、PdfCompareOptions
コンテンツ構築 / 描画PdfContentBuilder、PdfContentResult、PdfDrawer、PdfAppearances、PdfAppearanceCharacteristics、PdfDefaultAppearance、PdfFreeTextAppearanceBuilder、PdfWatermarkAppearanceBuilder、PdfWatermarkInfo、PdfHatchBrush、PdfIconFit
レイアウト要素(表 / グラフ / 段落)PdfTableElement、PdfTable{Cell,Column,Row,Section}Element、PdfLayoutElement、PdfAtomicElement、PdfBlockElement、PdfInlineElement、PdfInlineBlockElement、PdfTextRun、PdfTextWrapElement、PdfImageElement、PdfHeadingElement、PdfListElement/PdfListItemElement、PdfPanel*Element、PdfTocElement、PdfDividerElement、PdfPageTemplate(Set)、PdfParagraphElement、PdfTitleElement
グラフ要素PdfBarChartElement/PdfBarChartStyle、PdfLineChartElement/PdfLineChartStyle、PdfPieChartElement/PdfPieChartStyle、PdfScatterChartElement/PdfScatterChartStyle、PdfStackedBarChartElement/PdfStackedBarChartStyle、PdfHistogramElement/PdfHistogramStyle
バーコードPdfBarcodeElement、PdfBarcodeStyle、PdfInlineBarcode
注釈PdfCaretAnnotation、PdfCircleAnnotation、PdfFileAttachmentAnnotation、PdfHighlightAnnotation、PdfUnderlineAnnotation、PdfStrikeOutAnnotation、PdfSquigglyAnnotation、PdfSquareAnnotation、PdfPolyAnnotation、PdfPolylineAnnotation、PdfRedactionAnnotation、PdfTextAnnotation、PdfWidgetAnnotation(Collection)、PdfMarkupAnnotation
フォームPdfChoiceField、PdfChoiceItem(Collection)、PdfPushButtonField、PdfRadioButtonField、PdfTextField、XfaForm + Xfa{Barcode,Button,CheckBox,Choice,ComboBox,DateTime,Image,ListBox,Numeric,RadioButton,Signature,Text}Field
3D / リッチメディアPdf3DArtwork、Pdf3DLightingScheme、Pdf3DRenderMode、PdfRichMediaAnnotation、PdfRichMediaAnnotationWidget、PdfRichMediaContent、PdfMovie、PdfMovieAnnotation、PdfScreenAnnotation
セキュリティ / 署名 / メタデータPdfSecurityPolicy、PdfPasswordSecurityPolicy、PdfDocumentPrivilege、PdfXmpMetadata、PdfXmpNamespace
コンバーター / エクスポートオプションPdfToImageConverter、PdfToMarkdownConverter、PdfToSvgConverter、PdfToWordConverter、MarkdownOptions、SvgOptions、PptxOptions、OfdOptions、MetafileOptions、RenderingOptions、IgnoreOptions、ImageCompressionOptions、XlsxSpecialTableLayoutOptions
宛先PdfExplicitDestination + PdfXYZExplicitDestination、PdfFitExplicitDestination、PdfFitH/V/R/B/BH/BVExplicitDestination(計 8 つの具象サブクラス)
アクションPdfAnnotationAdditionalActions、PdfDocumentAdditionalActions、PdfFormFieldAdditionalActions、PdfGoToEmbeddedAction、PdfHideAction、PdfResetFormAction、PdfSubmitFormAction、PdfURIAction
フォント / 印刷PdfFontStore、PdfEmbeddedFontConverter、PdfFontFamilySpec、PdfPaperSize、DefaultPrintLogger、PdfHeaderFooter
ファイル / インポートエクスポートPdfEmbeddedFile、PdfFileSpecification、PdfFormExportResult、PdfFormImportResult、PdfFixedPrint
基底型String、Decimal、LicenseProvider
その他PdfAnchorEntry、PdfAnchorRegistry、PdfNavigationEntry、PdfNavigationRegistry、PdfCollectionItem、PdfImageInfo、PdfNumberFormatter、PdfStandardOptions、PdfThemeProfile、PdfRectangleDifferences、PdfDynamicData、TSAResponse、BitmapOptions

5.2 ネイティブコレクション/入れ子配列/辞書

旧パッケージでは GetCount() + GetItem(i) しか使用できず(中には GetCount すら持たないコレクションもあり、列挙不能でした);新パッケージは GetCount/GetItem を維持しつつ、List<T> 派生コレクションにネイティブコレクションプロトコルを追加しています:

// 旧パッケージ
intrusive_ptr<PdfPageCollection> pages = doc->GetPages();
for (int i = 0; i < pages->GetCount(); ++i) {
    intrusive_ptr<PdfPageBase> page = pages->GetItem(i);
}

// 新パッケージ(旧スタイルも動作する;以下はより慣用的なスタイル)
for (intrusive_ptr<PdfPageBase> page : *doc->GetPages()) { /* … */ }

int n = doc->GetPages()->size();
intrusive_ptr<PdfPageBase> first = (*doc->GetPages())[0];
doc->GetPages()->RemoveAt(0);   // コレクションが対応している場合

⚠ すべてのアクセスは 同じマネージドコレクション に戻ります(ライブオブジェクトのセマンティクスであり、スナップショットではありません)。
⚠ ハンドルポインタを比較して「同じ要素」を判定しないでください — ゲッターは毎回新しいハンドルを生成します;状態で比較してください。

ジャグ配列 T[][] は「非エクスポート」から std::vector<std::vector<T>> になります:

std::vector<std::vector<std::string>> data = {{"a","b","c"}, {"d","e","f"}};
intrusive_ptr<Layout::Tables::PdfTableElement> table = new Layout::Tables::PdfTableElement(3);
table->AddRows(data);                                   // 流暢(fluent)、同じ表を返す

std::vector<std::vector<int>> ink = {{1,2,3}, {}};      // 空の内部ベクトルも有効
intrusive_ptr<Annotations::PdfInkAnnotation> ann = new Annotations::PdfInkAnnotation(ink);
std::vector<std::vector<int>> back = ann->GetInkList();

辞書 Dictionary<K,V> は「列挙不能なハンドル/非エクスポート」からネイティブな std::map<K,V> になります:

std::map<std::string, std::string> props =
    doc->GetDocumentInformation()->GetAllCustomProperties();

// 値はベア Object ではなく、真のマネージド型でラップされる
std::map<Security::SignInfoType, intrusive_ptr<Object>> fonts;
fonts[Security::SignInfoType::DigitalSigner] = new Common::String("Times New Roman");
sig->SetSignInfoFont(fonts);

null と空は区別可能: C++ 側では同伴する GetX(bool& isNull) / SetX(std::nullptr_t) オーバーロードを使用(計測:46 クラスにわたり 54 / 54 のシグネチャ)。

5.3 非推奨([Obsolete])API:エクスポートは維持されるがコンパイラ警告を出力

ベンダーが .NET 側で [Obsolete] とマークしたメンバーは、新パッケージでも 通常通りエクスポートされ続けます(17 クラスにわたり 72 の宣言)、宣言の前に SPIRE_DEPRECATED("…vendor text…") が追加されるのみです:

クラス非推奨メンバー推奨される置換
PdfDocumentGetSecurity()GetSecurityPolicy() + Encrypt(policy)
PdfDocument文書を返す MergeFiles(…) オーバーロードstatic void MergeFiles(inputFiles, outputFile)(リソースを自動解放)
PdfViewerPreferencesSetBookMarkExpandOrCollapse(bool)PdfBookmark::SetExpandBookmark(bool)
PdfUnidimensionalBarcodeGetEnableCheckDigit() / GetShowCheckDigit()なし(ベンダーは置換を提供せず)
PdfSignatureMaker12 の Set{Name,Location,Reason,Date,ContactInfo,DistinguishedName}{,Label}PdfSignature / PdfSignatureAppearance 上の同名プロパティ
PdfTrueTypeFontPdfTrueTypeFont(fontFile, size[, style]) コンストラクタPdfTrueTypeFont::FromFontFile(path, size[, style])

これらを /wd4996 や -Wno-deprecated-declarations で全局的に抑制しないでください — これらの警告こそがアップグレードのロードマップです。

5.4 内部 C 相互運用ヘッダー(意図的に公開されていない)

include/Spire.Pdf.C.h は新パッケージが追加した新しい相互運用形式です:6398 の SPIRE_PDF_API 関数宣言で、
AOT ネイティブライブラリと C++ ラッパー間の相互運用を担います。DOC パッケージのもののような公開 C API では ありません:


6. 移行チェックリスト

6.1 検索置換チェックリスト

以下の順にスキャンすることで、変更の大部分をカバーできます:

#検索変更先備考
1#include <Spire.Pdf.o.h>必要なヘッダーをオンデマンドでインクルード(#include "Spire/Pdf/<path>.h")3.1 参照
2コンパイルコマンドの -I 欠落include + include/Spire/Pdf + include/Spire/Pdf/common/h を追加3.1 参照
3L""(L を削除)4.1 参照
4.c_str()std::string を直接渡す削除する;新しいインターフェースは不要
5LPCWSTR_S維持しても可(現在は const char*)ワイド文字変数を宣言していた場合は std::string に変更
6std::wstringstd::stringエンコーディング変換に注意(UTF-16 / GBK → UTF-8)
7GetInstanceTypeName() / ManagedName()CheckType<T> / Dynamic_cast<T> / Convert<T>両アクセサとも現在は非公開;4.4 参照
8Object::Convert<T> の「失敗しない」に依存するコードnull チェックを追加、または CheckType / Dynamic_cast に切り替え新 Convert は SpireTypeError をスロー
9new PdfDestination(具象宛先サブクラスを構築4.2 参照
10PdfDestinationModePdfExplicitDestinationType / 具象サブクラス4.2 参照
11PdfFieldActions / PdfAnnotationActionsActions::PdfFormFieldAdditionalActions / …AdditionalActions4.3 参照
12PdfDocumentActionsActions::PdfDocumentAdditionalActionsメンバー名も変更;4.3 参照
13PdfEmbeddedGoToActionActions::PdfGoToEmbeddedActionコンストラクタとプロパティの両方が変更;4.3 参照
14PdfTextFindTexts::PdfTextFragment + Texts::PdfTextFinder検索エントリと戻り値の型の両方が変更;4.3 / 4.5 参照
15GetKeyPressed / SetKeyPressed置換なし4.3 参照;再設計が必要
16License::SetLicenseKey などLicense::LicenseProvider::SetLicenseKey などLicense は現在名前空間;4.3 参照
17GetSecurity()GetSecurityPolicy() + Encrypt(policy)旧名は動作するが警告を出力
18add_* / remove_* イベントアクセサC++ エントリポイントなし旧コールバックもほとんど利用不能(行レイアウトイベントのみ登録可);4.6 参照
19PdfPaperSizesPrint::PdfPaperSizeクラス名変更、ただし A4 などの定数は依然利用不可;6.4 参照
20ベアの byte(vector<byte>)unsigned charC++17 以上でのみ必要
21PdfPaperSize::A4 などPdfPageSize::A4()両世代で欠落、リグレッションではない
22コンパイラが C2872 ambiguous を報告3.3 に従い完全修飾名または名前空間エイリアスを使用同名型 62 グループ