本アップデートは、差し替え可能なパッチではなく構造的なアップグレードです。ヘッダーのエントリポイントは単一ヘッダーからオンデマンドなインクルードへ、名前空間の構成はフラットから .NET に準拠した階層へ、文字列の ABI はワイド文字から UTF-8 へと変更されます。また、169 のクラス名と 3 つの利用形式(ネイティブコレクション、入れ子配列、辞書)が追加されています。既存のプロジェクトではソースの修正と完全な再コンパイルが必要であり、ライブラリファイルの置き換えのみでは機能しません。
Spire.Pdf for C++ 12.10.7 — 旧 C++ パッケージとの詳細な変更点
ソースライブラリ:
Spire.Pdf.dll12.10.7 (netstandard2.0,FileVersion 12.10.7.1420)
想定読者: 旧 C++ パッケージを利用している顧客コード —#include <Spire.Pdf.o.h>、フラットなSpire::Pdf名前空間、wchar_tの文字列インターフェースを使用
ベースライン: 以下の「旧パッケージ」=ベンダーの以前の C++ パッケージ(src/CPPの構成);「新パッケージ」=ここで配布されるパッケージ
| 項目 | 旧パッケージ | 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 定義数 | 558 | 616(ユニークなクラス名 571) | +169 追加 / −156 削除 |
| C インターフェースヘッダー | なし | Spire.Pdf.C.h、6398 の宣言 | 新規(内部相互運用ヘッダーであり、公開 C API ではない) |
| AOT ライブラリのバージョン | — | 12.10.7.1420 | — |
| エクスポートされたシンボル総数 | — | 6398 | — |
| 同梱 boost ヘッダー | 38 | 41 | +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 参照)。
| プラットフォーム系統 | 旧パッケージ | 12.10.7 |
|---|---|---|
| Windows | x64(Debug / Release ビルド;Spire.Pdf.Cpp.dll / .lib) | win-x64、win-arm64(SpirePdfCpp.dll / .lib、デバッグディレクトリなし) |
| Linux glibc | x64(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 を同梱 |
主なバイナリの相違:
.lib)。include/ とともに完全に再コンパイルする必要がある。ライブラリファイルの置き換えのみでは不十分。std::string / std::vector / std::vector<intrusive_ptr<T>> を渡すため、顧客プロジェクトと新パッケージの DLL は同じ MSVC + STL を使用しなければならない。同梱 README からの新しいデプロイ制約:
linux-musl-* および ohos-* では、自身で ICU(libicuuc.so + libicui18n.so のバージョン番号なしコピー + icudt*.dat)および fontconfig チェーン(libfontconfig / freetype / expat / libpng / libz)をデプロイする必要があります。そうしないと、最初の PdfDocument 構築で FailFast するか、libSkiaSharp.so がロード時に失敗します。.so の NEEDED エントリにも 現れません(実行時 dlopen による推移的依存であるため);.so リストをスキャンしても表示されないので、「自己完結している」と結論付けないでください。ohos-clang を使用する必要があります(ラッパーは std::__n1 libc++ を静的にリンクしており、標準 libc++ と互換性がありません)。旧バージョン:
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 の設定を含む)
Spire.Pdf.o.h 包括エントリは削除され、新版には 同等の単一ファイルエントリが存在せず、集約する包括ヘッダーもフラットな互換ヘッダーもありません。-I フラグを使用する必要があります: include、include/Spire/Pdf、include/Spire/Pdf/common/h。Spire::Pdf に存在していましたが、新版ではサブ名前空間に分割されたため、using namespace Spire::Pdf; だけでは不十分です。C2027(未定義型の使用)および C2065(未宣言の識別子)です。| 型 | 旧パッケージ | 新パッケージ |
|---|---|---|
PdfDocument / PdfPageBase / PdfPageSize / FileFormat | Spire::Pdf::… | 変更なし(ルート名前空間) |
PdfCanvas / PdfBrush / PdfFont | Spire::Pdf::PdfCanvas など(すべてルート) | Spire::Pdf::Graphics::PdfCanvas / …::PdfBrush / …::PdfFont |
PdfGrid | Spire::Pdf::PdfGrid | Spire::Pdf::Grid::PdfGrid |
PdfTable(PdfLayoutWidget 派生) | Spire::Pdf::PdfTable | Spire::Pdf::Tables::PdfTable |
PdfTextExtractor | Spire::Pdf::PdfTextExtractor | Spire::Pdf::Texts::PdfTextExtractor |
PdfBookmark | Spire::Pdf::PdfBookmark | Spire::Pdf::Bookmarks::PdfBookmark |
PdfAnnotation | 1 つのみ | Annotations::PdfAnnotation および Interactive::Annotations::PdfAnnotation |
PdfField | 1 つのみ | Fields::PdfField および Interactive::Forms::PdfField |
PdfSignature | 1 つのみ | 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 などのベア名を利用可能に
} }
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 を入れ替えると衝突対象そのものが変化するため、これを定数とは見なさないでください。
LPCWSTR_S という名前は維持されていますが、その定義が変更されました:
typedef const wchar_t* LPCWSTR_S; // 旧パッケージ
typedef const char* LPCWSTR_S; // 新パッケージ
インターフェースのシグネチャはそれに応じて const std::string& に統一されています:
| API | 旧パッケージ | 新パッケージ |
|---|---|---|
PdfDocument::LoadFromFile | void LoadFromFile(LPCWSTR_S fileName) | void LoadFromFile(const std::string& fileName) |
PdfDocument::SaveToFile | void SaveToFile(LPCWSTR_S fileName, FileFormat f) | void SaveToFile(const std::string& fileName, FileFormat f) |
PdfField::GetFullName | LPCWSTR_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 の中国語コメントが含まれています。
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);
| 宛先の種類 | 新パッケージのクラス |
|---|---|
| XYZ | Destinations::PdfXYZExplicitDestination(page, left, top[, zoom]) |
| Fit / FitH / FitV / FitR / FitB / FitBH / FitBV | Destinations::PdfFit*ExplicitDestination(…) |
これに伴い、
PdfEmbeddedGoToActionのコンストラクタ引数も「宛先オブジェクト」から「ページ番号 + ズーム」に変更されています(4.3 参照)。
KeyPressed を含む)以下は計測された旧 → 新のマッピングです(フォームフィールド/注釈のアクションクラスは .NET 側で一連のリネームを経ており、GetActions() / GetAdditionalActions() が返す型は特に影響を受けやすいです):
| 旧パッケージ | 新パッケージ | 相違 |
|---|---|---|
Spire::Pdf::PdfFieldActions | Spire::Pdf::Actions::PdfFormFieldAdditionalActions | メンバー名が変更:GetFormat/GetValidate/GetCalculate → GetOnFormat/GetOnValidate/GetOnCalculate(セッターも同様);マウス enter/exit は基底クラス PdfAnnotationAdditionalActions に繰り上がり(OnEnter/OnExit);KeyPressed は 置換なし |
Spire::Pdf::PdfAnnotationActions | Spire::Pdf::Actions::PdfAnnotationAdditionalActions | マウス/フォーカスアクションに On プレフィックスが付与:GetMouseDown → GetOnMouseDown、GetGotFocus → GetOnReceiveFocus など;OnOpenPage/OnClosePage/OnShowPage/OnHidePage が追加;Format/Validate/Calculate はこのクラスになくなった |
Spire::Pdf::PdfDocumentActions | Spire::Pdf::Actions::PdfDocumentAdditionalActions | メンバーが GetBeforeClosing/GetBeforeSaving/GetBeforePrinting/GetAfterSaving/GetAfterPrinting に変更(旧 GetBeforeCloseAction などは動名詞形に);GetAfterOpenAction に同名メンバーはなし |
Spire::Pdf::PdfEmbeddedGoToAction | Spire::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::PdfPaperSizes | Spire::Pdf::Print::PdfPaperSize | クラス名変更、ただし A4 などの静的定数は 引き続きエクスポートされない(6.4 参照) |
Security_PdfSignature / Utilities_PdfTable / Utilities_PdfImageInfo / Collections_PdfCollection / Security_IPdfSignatureFormatter | Security::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以外にギャップはない」とは主張しません。
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+ 例外処理に切り替えてください。
| 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<…>> |
旧パッケージは 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 のみです。したがって:
Invoke を引き続きエクスポートしていますが、登録エントリポイントがありません);また:
*EventArgs / *EventHandler クラス自体は新パッケージのエクスポート対象に残っています(32 クラス名)、今回は Invoke も実際に生成されています;Spire.Pdf.C.h には 12 の _add_ エクスポート が含まれていますPdfTable_add_BeginCellLayout、PdfLayoutWidget_add_BeginPageLayout、PdfPageBase_add_BeginSave);Spire.Pdf.C.h は 内部相互運用ヘッダーであり、公開 C API ではありません ⇒ イベントに依存する C++ コードは 再設計が必要;「クラスをリネームすれば登録できる」と期待しないでください。クラスのベース名で比較すると、156 の旧クラス名が新パッケージに現れなくなっています。これを 156 の機能消滅と読んではいけません:
Security_PdfSignature、Utilities_PdfTable、Utilities_PdfImageInfo、Collections_PdfCollection、Security_IPdfSignatureFormatter)— 新パッケージは名前空間で区別し、ベア名は変わらない;PdfFieldActions、PdfAnnotationActions、PdfEmbeddedGoToAction、PdfTextFind、PdfDocumentActions、PdfPaperSizes、License など);| カテゴリ | 代表的なクラス | 備考 |
|---|---|---|
| 基底値型 / コレクションインターフェース | 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、Resources | PDF の公開 API の一部ではない;新パッケージはエクスポートしない |
| ベンダーによりリファクタリング/削除された PDF 型 | PdfGraphicsState、PdfImageMask、PdfHTMLTextElement、PdfHtmlLayoutFormat、PdfPaperSourceTray、PdfButtonWidgetWidgetItem、PdfTexBoxWidgetItem など | すでにベンダーの .NET API 側でリネーム/削除済み;コンパイラエラーを正とみなしてください |
旧パッケージの
PdfPaperSizesの定数(Letter/A4…)は すべてコメントアウト されており、いずれの生成でもエクスポートされたことはありません(6.4 参照)。
| 機能領域 | 代表的なクラス |
|---|---|
| 文書比較 | 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 |
旧パッケージでは 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 のシグネチャ)。
[Obsolete])API:エクスポートは維持されるがコンパイラ警告を出力ベンダーが .NET 側で [Obsolete] とマークしたメンバーは、新パッケージでも 通常通りエクスポートされ続けます(17 クラスにわたり 72 の宣言)、宣言の前に SPIRE_DEPRECATED("…vendor text…") が追加されるのみです:
/W3(VS プロジェクトの既定)で表示、/W1 では非表示;-Wdeprecated-declarations を報告します。| クラス | 非推奨メンバー | 推奨される置換 |
|---|---|---|
PdfDocument | GetSecurity() | GetSecurityPolicy() + Encrypt(policy) |
PdfDocument | 文書を返す MergeFiles(…) オーバーロード | static void MergeFiles(inputFiles, outputFile)(リソースを自動解放) |
PdfViewerPreferences | SetBookMarkExpandOrCollapse(bool) | PdfBookmark::SetExpandBookmark(bool) |
PdfUnidimensionalBarcode | GetEnableCheckDigit() / GetShowCheckDigit() | なし(ベンダーは置換を提供せず) |
PdfSignatureMaker | 12 の Set{Name,Location,Reason,Date,ContactInfo,DistinguishedName}{,Label} | PdfSignature / PdfSignatureAppearance 上の同名プロパティ |
PdfTrueTypeFont | PdfTrueTypeFont(fontFile, size[, style]) コンストラクタ | PdfTrueTypeFont::FromFontFile(path, size[, style]) |
これらを
/wd4996や-Wno-deprecated-declarationsで全局的に抑制しないでください — これらの警告こそがアップグレードのロードマップです。
include/Spire.Pdf.C.h は新パッケージが追加した新しい相互運用形式です:6398 の SPIRE_PDF_API 関数宣言で、
AOT ネイティブライブラリと C++ ラッパー間の相互運用を担います。DOC パッケージのもののような公開 C API では ありません:
int*、文字列は UTF-8 の const char*、末尾の int** が例外スロット;Spire/Pdf/** 配下の C++ ヘッダーを使用すべき;以下の順にスキャンすることで、変更の大部分をカバーできます:
| # | 検索 | 変更先 | 備考 |
|---|---|---|---|
| 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 参照 |
| 3 | L" | "(L を削除) | 4.1 参照 |
| 4 | .c_str() | std::string を直接渡す | 削除する;新しいインターフェースは不要 |
| 5 | LPCWSTR_S | 維持しても可(現在は const char*) | ワイド文字変数を宣言していた場合は std::string に変更 |
| 6 | std::wstring | std::string | エンコーディング変換に注意(UTF-16 / GBK → UTF-8) |
| 7 | GetInstanceTypeName() / ManagedName() | CheckType<T> / Dynamic_cast<T> / Convert<T> | 両アクセサとも現在は非公開;4.4 参照 |
| 8 | Object::Convert<T> の「失敗しない」に依存するコード | null チェックを追加、または CheckType / Dynamic_cast に切り替え | 新 Convert は SpireTypeError をスロー |
| 9 | new PdfDestination( | 具象宛先サブクラスを構築 | 4.2 参照 |
| 10 | PdfDestinationMode | PdfExplicitDestinationType / 具象サブクラス | 4.2 参照 |
| 11 | PdfFieldActions / PdfAnnotationActions | Actions::PdfFormFieldAdditionalActions / …AdditionalActions | 4.3 参照 |
| 12 | PdfDocumentActions | Actions::PdfDocumentAdditionalActions | メンバー名も変更;4.3 参照 |
| 13 | PdfEmbeddedGoToAction | Actions::PdfGoToEmbeddedAction | コンストラクタとプロパティの両方が変更;4.3 参照 |
| 14 | PdfTextFind | Texts::PdfTextFragment + Texts::PdfTextFinder | 検索エントリと戻り値の型の両方が変更;4.3 / 4.5 参照 |
| 15 | GetKeyPressed / SetKeyPressed | 置換なし | 4.3 参照;再設計が必要 |
| 16 | License::SetLicenseKey など | License::LicenseProvider::SetLicenseKey など | License は現在名前空間;4.3 参照 |
| 17 | GetSecurity() | GetSecurityPolicy() + Encrypt(policy) | 旧名は動作するが警告を出力 |
| 18 | add_* / remove_* イベントアクセサ | C++ エントリポイントなし | 旧コールバックもほとんど利用不能(行レイアウトイベントのみ登録可);4.6 参照 |
| 19 | PdfPaperSizes | Print::PdfPaperSize | クラス名変更、ただし A4 などの定数は依然利用不可;6.4 参照 |
| 20 | ベアの byte(vector<byte>) | unsigned char | C++17 以上でのみ必要 |
| 21 | PdfPaperSize::A4 など | PdfPageSize::A4() | 両世代で欠落、リグレッションではない |
| 22 | コンパイラが C2872 ambiguous を報告 | 3.3 に従い完全修飾名または名前空間エイリアスを使用 | 同名型 62 グループ |