xmp_toolkit_ruby 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.idea/.gitignore +8 -0
- data/.rspec +3 -0
- data/.rubocop.yml +88 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/AGENTS.md +72 -0
- data/CHANGELOG.md +45 -0
- data/LICENSE.txt +21 -0
- data/README.md +287 -0
- data/Rakefile +25 -0
- data/cliff.toml +138 -0
- data/docker/Dockerfile +87 -0
- data/docker/ProductConfig.cmake.patch +11 -0
- data/docker/ToolchainGCC.cmake.patch +11 -0
- data/exe/xmp_toolkit_ruby +8 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/LICENSE +31 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/build/XMP_BuildInfo.h +17 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/TXMPFiles.hpp +853 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/TXMPIterator.hpp +234 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/TXMPMeta.hpp +1753 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/TXMPUtils.hpp +967 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMP.hpp +98 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMP.incl_cpp +69 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCommon/Interfaces/BaseInterfaces/IConfigurable.h +225 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCommon/Interfaces/BaseInterfaces/ISharedObject.h +71 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCommon/Interfaces/BaseInterfaces/IThreadSafe.h +76 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCommon/Interfaces/BaseInterfaces/IVersionable.h +71 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCommon/Interfaces/IConfigurationManager.h +167 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCommon/Interfaces/IError.h +377 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCommon/Interfaces/IErrorNotifier.h +52 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCommon/Interfaces/IMemoryAllocator.h +65 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCommon/Interfaces/IObjectFactory.h +90 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCommon/Interfaces/IUTF8String.h +504 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCommon/Utilities/TWrapperFunctions.h +252 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCommon/Utilities/TWrapperFunctions2.h +564 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCommon/XMPCommonDefines.h +194 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCommon/XMPCommonErrorCodes.h +114 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCommon/XMPCommonFwdDeclarations.h +158 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCommon/XMPCommonLatestInterfaceVersions.h +51 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCommon/source/IConfigurable.cpp +204 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCommon/source/IConfigurationManager.cpp +92 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCommon/source/IError.cpp +207 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCommon/source/IErrorNotifier.cpp +26 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCommon/source/IUTF8String.cpp +299 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/Interfaces/IArrayNode.h +303 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/Interfaces/IClientDOMParser.h +88 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/Interfaces/IClientDOMSerializer.h +94 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/Interfaces/ICompositeNode.h +331 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/Interfaces/ICoreConfigurationManager.h +107 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/Interfaces/ICoreObjectFactory.h +279 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/Interfaces/IDOMImplementationRegistry.h +150 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/Interfaces/IDOMParser.h +181 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/Interfaces/IDOMSerializer.h +120 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/Interfaces/IMetadata.h +145 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/Interfaces/IMetadataConverterUtils.h +116 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/Interfaces/INameSpacePrefixMap.h +236 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/Interfaces/INode.h +582 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/Interfaces/INodeIterator.h +193 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/Interfaces/IPath.h +212 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/Interfaces/IPathSegment.h +225 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/Interfaces/ISimpleNode.h +150 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/Interfaces/IStructureNode.h +306 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/XMPCoreDefines.h +94 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/XMPCoreErrorCodes.h +116 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/XMPCoreFwdDeclarations.h +325 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/XMPCoreLatestInterfaceVersions.h +97 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/source/IArrayNode.cpp +163 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/source/IClientDOMParser.cpp +76 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/source/IClientDOMSerializer.cpp +73 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/source/ICompositeNode.cpp +121 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/source/ICoreConfigurationManager.cpp +88 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/source/ICoreObjectFactory.cpp +83 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/source/IDOMImplementationRegistry.cpp +122 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/source/IDOMParser.cpp +116 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/source/IDOMSerializer.cpp +109 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/source/IMetadata.cpp +113 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/source/IMetadataConverterUtils.cpp +92 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/source/INameSpacePrefixMap.cpp +187 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/source/INode.cpp +377 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/source/INodeIterator.cpp +105 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/source/IPath.cpp +157 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/source/IPathSegment.cpp +146 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/source/ISimpleNode.cpp +111 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/source/IStructureNode.cpp +104 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMP_Const.h +1590 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMP_Environment.h +223 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMP_IO.hpp +169 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMP_Version.h +52 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/client-glue/TXMPFiles.incl_cpp +484 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/client-glue/TXMPIterator.incl_cpp +223 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/client-glue/TXMPMeta.incl_cpp +917 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/client-glue/TXMPUtils.incl_cpp +445 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/client-glue/WXMPFiles.hpp +281 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/client-glue/WXMPIterator.hpp +74 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/client-glue/WXMPMeta.hpp +635 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/client-glue/WXMPUtils.hpp +314 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/client-glue/WXMP_Common.hpp +132 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/libraries/i80386linux_x64/debug/libXMPCore.so +0 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/libraries/i80386linux_x64/debug/libXMPCoreStatic.a +0 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/libraries/i80386linux_x64/debug/libXMPFiles.so +0 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/libraries/i80386linux_x64/debug/libXMPFilesStatic.a +0 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/libraries/macintosh/universal/Debug/libXMPCoreStatic.a +0 -0
- data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/libraries/macintosh/universal/Debug/libXMPFilesStatic.a +0 -0
- data/ext/xmp_toolkit_ruby/extconf.rb +101 -0
- data/ext/xmp_toolkit_ruby/xmp_toolkit.cpp +321 -0
- data/ext/xmp_toolkit_ruby/xmp_toolkit.hpp +69 -0
- data/ext/xmp_toolkit_ruby/xmp_toolkit_ruby.cpp +44 -0
- data/lib/xmp_toolkit_ruby/cli.rb +95 -0
- data/lib/xmp_toolkit_ruby/namespaces.rb +77 -0
- data/lib/xmp_toolkit_ruby/plugins/LICENSE +31 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/i80386linux/i80386linux/PDF_Handler.resources/MODULE_IDENTIFIER.txt +1 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/i80386linux/i80386linux/PDF_Handler.resources/XMPPLUGINUIDS.txt +31 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/i80386linux/i80386linux/PDF_Handler.xpi +0 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/i80386linux/i80386linux/libMiniPDFL.so +0 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/i80386linux/i80386linux_x64/PDF_Handler.resources/MODULE_IDENTIFIER.txt +1 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/i80386linux/i80386linux_x64/PDF_Handler.resources/XMPPLUGINUIDS.txt +31 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/i80386linux/i80386linux_x64/PDF_Handler.xpi +0 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/i80386linux/i80386linux_x64/libMiniPDFL.so +0 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/PDF_Handler +0 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Resources/Info.plist +52 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Resources/MODULE_IDENTIFIER.txt +1 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Resources/MiniPDFL.framework/MiniPDFL +0 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Resources/MiniPDFL.framework/Resources/English.lproj/InfoPlist.strings +0 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Resources/MiniPDFL.framework/Resources/Info.plist +35 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Resources/MiniPDFL.framework/Versions/A/MiniPDFL +0 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Resources/MiniPDFL.framework/Versions/A/Resources/English.lproj/InfoPlist.strings +0 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Resources/MiniPDFL.framework/Versions/A/Resources/Info.plist +35 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Resources/MiniPDFL.framework/Versions/A/_CodeSignature/CodeResources +146 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Resources/MiniPDFL.framework/Versions/Current/MiniPDFL +0 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Resources/MiniPDFL.framework/Versions/Current/Resources/English.lproj/InfoPlist.strings +0 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Resources/MiniPDFL.framework/Versions/Current/Resources/Info.plist +35 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Resources/MiniPDFL.framework/Versions/Current/_CodeSignature/CodeResources +146 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Resources/XMPPLUGINUIDS.txt +31 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/A/PDF_Handler +0 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/A/Resources/Info.plist +52 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/A/Resources/MODULE_IDENTIFIER.txt +1 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/A/Resources/MiniPDFL.framework/MiniPDFL +0 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/A/Resources/MiniPDFL.framework/Resources/English.lproj/InfoPlist.strings +0 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/A/Resources/MiniPDFL.framework/Resources/Info.plist +35 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/A/Resources/MiniPDFL.framework/Versions/A/MiniPDFL +0 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/A/Resources/MiniPDFL.framework/Versions/A/Resources/English.lproj/InfoPlist.strings +0 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/A/Resources/MiniPDFL.framework/Versions/A/Resources/Info.plist +35 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/A/Resources/MiniPDFL.framework/Versions/A/_CodeSignature/CodeResources +146 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/A/Resources/MiniPDFL.framework/Versions/Current/MiniPDFL +0 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/A/Resources/MiniPDFL.framework/Versions/Current/Resources/English.lproj/InfoPlist.strings +0 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/A/Resources/MiniPDFL.framework/Versions/Current/Resources/Info.plist +35 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/A/Resources/MiniPDFL.framework/Versions/Current/_CodeSignature/CodeResources +146 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/A/Resources/XMPPLUGINUIDS.txt +31 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/A/_CodeSignature/CodeResources +216 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/Current/PDF_Handler +0 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/Current/Resources/Info.plist +52 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/Current/Resources/MODULE_IDENTIFIER.txt +1 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/Current/Resources/MiniPDFL.framework/MiniPDFL +0 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/Current/Resources/MiniPDFL.framework/Resources/English.lproj/InfoPlist.strings +0 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/Current/Resources/MiniPDFL.framework/Resources/Info.plist +35 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/Current/Resources/MiniPDFL.framework/Versions/A/MiniPDFL +0 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/Current/Resources/MiniPDFL.framework/Versions/A/Resources/English.lproj/InfoPlist.strings +0 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/Current/Resources/MiniPDFL.framework/Versions/A/Resources/Info.plist +35 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/Current/Resources/MiniPDFL.framework/Versions/A/_CodeSignature/CodeResources +146 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/Current/Resources/MiniPDFL.framework/Versions/Current/MiniPDFL +0 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/Current/Resources/MiniPDFL.framework/Versions/Current/Resources/English.lproj/InfoPlist.strings +0 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/Current/Resources/MiniPDFL.framework/Versions/Current/Resources/Info.plist +35 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/Current/Resources/MiniPDFL.framework/Versions/Current/_CodeSignature/CodeResources +146 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/Current/Resources/XMPPLUGINUIDS.txt +31 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/Current/_CodeSignature/CodeResources +216 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/resource/linux/PDF_Handler.exp +11 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/resource/mac/PDF_Handler.exp +2 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/resource/mac/PDF_Handler.plist +28 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/resource/mac/PDF_HandlerPList.h +12 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/resource/win/CopyPDFL.bat +14 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/resource/win/PDF_Handler-32.rc +8 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/resource/win/PDF_Handler-64.rc +8 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/resource/win/PDF_Handler.def +9 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/windows/windows_x64/MiniPDFL.dll +0 -0
- data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/windows/windows_x64/PDF_Handler.xpi +0 -0
- data/lib/xmp_toolkit_ruby/version.rb +5 -0
- data/lib/xmp_toolkit_ruby/xmp_file_format.rb +87 -0
- data/lib/xmp_toolkit_ruby/xmp_file_handler_flags.rb +49 -0
- data/lib/xmp_toolkit_ruby.rb +237 -0
- data/sig/xmp_toolkit_ruby.rbs +4 -0
- data/tasks/changelog.rake +29 -0
- metadata +357 -0
@@ -0,0 +1,321 @@
|
|
1
|
+
#include "xmp_toolkit.hpp"
|
2
|
+
|
3
|
+
|
4
|
+
|
5
|
+
bool xmp_meta_error_callback(
|
6
|
+
void * clientContext,
|
7
|
+
XMP_ErrorSeverity severity,
|
8
|
+
XMP_Int32 cause,
|
9
|
+
XMP_StringPtr message
|
10
|
+
) {
|
11
|
+
const char * sevStr = (severity == kXMPErrSev_Recoverable) ? "RECOVERABLE"
|
12
|
+
: (severity == kXMPErrSev_OperationFatal) ? "FATAL OPERATION"
|
13
|
+
: (severity == kXMPErrSev_FileFatal) ? "FATAL FILE"
|
14
|
+
: (severity == kXMPErrSev_ProcessFatal) ? "FATAL PROCESS"
|
15
|
+
: "UNKNOWN";
|
16
|
+
std::cerr << "[TXMPMeta " << sevStr << "] "
|
17
|
+
<< "Code=0x" << std::hex << cause << std::dec
|
18
|
+
<< " Msg=\"" << (message ? message : "(no detail)") << "\"\n";
|
19
|
+
|
20
|
+
// If it's a recoverable error, return true so XMP can try to continue;
|
21
|
+
// otherwise return false to force an exception back to the caller.
|
22
|
+
return (severity == kXMPErrSev_Recoverable);
|
23
|
+
}
|
24
|
+
|
25
|
+
bool xmp_file_error_callback(
|
26
|
+
void * clientContext,
|
27
|
+
XMP_StringPtr filePath,
|
28
|
+
XMP_ErrorSeverity severity,
|
29
|
+
XMP_Int32 cause,
|
30
|
+
XMP_StringPtr message){
|
31
|
+
|
32
|
+
const char * sevStr = (severity == kXMPErrSev_Recoverable) ? "RECOVERABLE"
|
33
|
+
: (severity == kXMPErrSev_OperationFatal) ? "FATAL OPERATION"
|
34
|
+
: (severity == kXMPErrSev_FileFatal) ? "FATAL FILE"
|
35
|
+
: (severity == kXMPErrSev_ProcessFatal) ? "FATAL PROCESS"
|
36
|
+
: "UNKNOWN";
|
37
|
+
|
38
|
+
std::cerr << "[TXMPFiles " << sevStr << "] "
|
39
|
+
<< "file=\"" << (filePath ? filePath : "(null)") << "\" "
|
40
|
+
<< "cause=0x" << std::hex << cause << std::dec << "\n"
|
41
|
+
<< " msg=\"" << (message ? message : "(no detail)") << "\"\n";
|
42
|
+
|
43
|
+
// Only attempt recovery if the error is marked recoverable
|
44
|
+
return (severity == kXMPErrSev_Recoverable);
|
45
|
+
}
|
46
|
+
|
47
|
+
VALUE write_xmp_to_file(int argc, VALUE* argv, VALUE self){
|
48
|
+
VALUE rb_filename, rb_xmp_data, rb_mode_sym;
|
49
|
+
XMP_OptionBits templateFlags = 0;
|
50
|
+
|
51
|
+
rb_scan_args(argc, argv, "3", &rb_filename, &rb_xmp_data, &rb_mode_sym);
|
52
|
+
|
53
|
+
Check_Type(rb_filename, T_STRING);
|
54
|
+
const char* xmpString = NULL;
|
55
|
+
if (!NIL_P(rb_xmp_data)) {
|
56
|
+
Check_Type(rb_xmp_data, T_STRING);
|
57
|
+
xmpString = StringValueCStr(rb_xmp_data);
|
58
|
+
}
|
59
|
+
|
60
|
+
const char* mode_cstr;
|
61
|
+
if (RB_TYPE_P(rb_mode_sym, T_SYMBOL)) {
|
62
|
+
// Convert symbol to string first
|
63
|
+
VALUE mode_str = rb_sym_to_s(rb_mode_sym);
|
64
|
+
mode_cstr = StringValueCStr(mode_str);
|
65
|
+
} else {
|
66
|
+
// Already a string
|
67
|
+
mode_cstr = StringValueCStr(rb_mode_sym);
|
68
|
+
}
|
69
|
+
bool override;
|
70
|
+
|
71
|
+
if (strcmp(mode_cstr, "upsert") == 0) {
|
72
|
+
templateFlags = kXMPTemplate_AddNewProperties
|
73
|
+
| kXMPTemplate_ReplaceExistingProperties
|
74
|
+
| kXMPTemplate_IncludeInternalProperties;
|
75
|
+
override = false;
|
76
|
+
} else if (strcmp(mode_cstr, "override") == 0) {
|
77
|
+
override = true;
|
78
|
+
} else {
|
79
|
+
rb_raise(rb_eArgError, "mode must be :upsert or :override (String or Symbol). Got '%s'", mode_cstr);
|
80
|
+
return Qnil; // unreachable, but for clarity
|
81
|
+
}
|
82
|
+
|
83
|
+
|
84
|
+
const char* fileName = StringValueCStr(rb_filename);
|
85
|
+
|
86
|
+
bool ok;
|
87
|
+
SXMPFiles xmpFile;
|
88
|
+
SXMPMeta newMeta;
|
89
|
+
SXMPMeta currentMeta;
|
90
|
+
XMP_PacketInfo xmpPacket;
|
91
|
+
|
92
|
+
if (xmpString != NULL) {
|
93
|
+
int i;
|
94
|
+
for (i = 0; i < (long)strlen(xmpString) - 10; i += 10){
|
95
|
+
newMeta.ParseFromBuffer(&xmpString[i], 10, kXMP_ParseMoreBuffers);
|
96
|
+
}
|
97
|
+
|
98
|
+
newMeta.ParseFromBuffer(&xmpString[i], (XMP_StringLen)strlen(xmpString) - i);
|
99
|
+
}
|
100
|
+
|
101
|
+
try {
|
102
|
+
XMP_OptionBits opts = kXMPFiles_OpenForUpdate | kXMPFiles_OpenUseSmartHandler;
|
103
|
+
ok = xmpFile.OpenFile(fileName, kXMP_UnknownFile, opts);
|
104
|
+
if (!ok) {
|
105
|
+
xmpFile.CloseFile();
|
106
|
+
|
107
|
+
opts = kXMPFiles_OpenForUpdate | kXMPFiles_OpenUsePacketScanning;
|
108
|
+
ok = xmpFile.OpenFile( fileName, kXMP_UnknownFile, opts );
|
109
|
+
if ( ! ok ) {
|
110
|
+
// Neither smart handler nor packet scanning worked
|
111
|
+
xmpFile.CloseFile();
|
112
|
+
return Qnil;
|
113
|
+
}
|
114
|
+
}
|
115
|
+
|
116
|
+
fprintf(stderr, "Opened file %s for update\n", fileName);
|
117
|
+
|
118
|
+
ok = xmpFile.GetXMP(¤tMeta, 0, &xmpPacket);
|
119
|
+
if (!ok) {
|
120
|
+
xmpFile.CloseFile();
|
121
|
+
return Qnil;
|
122
|
+
}
|
123
|
+
|
124
|
+
XMP_DateTime dt;
|
125
|
+
SXMPUtils::CurrentDateTime(&dt);
|
126
|
+
std::string nowStr;
|
127
|
+
SXMPUtils::ConvertFromDate(dt, &nowStr);
|
128
|
+
|
129
|
+
if (xmpString != NULL){
|
130
|
+
newMeta.SetProperty(kXMP_NS_XMP, "MetadataDate", nowStr.c_str());
|
131
|
+
}
|
132
|
+
|
133
|
+
std::string newBuffer;
|
134
|
+
if (override) {
|
135
|
+
|
136
|
+
if (xmpFile.CanPutXMP(newMeta) ) {
|
137
|
+
xmpFile.PutXMP(newMeta);
|
138
|
+
} else {
|
139
|
+
xmpFile.CloseFile();
|
140
|
+
|
141
|
+
newMeta.SerializeToBuffer(&newBuffer);
|
142
|
+
|
143
|
+
rb_raise(rb_eArgError, "Can't update XMP new Data: '%s'", newBuffer.c_str());
|
144
|
+
|
145
|
+
return Qnil;
|
146
|
+
}
|
147
|
+
} else {
|
148
|
+
SXMPUtils::ApplyTemplate(
|
149
|
+
¤tMeta,
|
150
|
+
newMeta,
|
151
|
+
templateFlags
|
152
|
+
);
|
153
|
+
|
154
|
+
if (xmpFile.CanPutXMP(currentMeta) ) {
|
155
|
+
xmpFile.PutXMP(currentMeta);
|
156
|
+
} else {
|
157
|
+
xmpFile.CloseFile();
|
158
|
+
|
159
|
+
currentMeta.SerializeToBuffer(&newBuffer);
|
160
|
+
|
161
|
+
rb_raise(rb_eArgError, "Can't update XMP new Data: '%s'", newBuffer.c_str());
|
162
|
+
|
163
|
+
return Qnil;
|
164
|
+
}
|
165
|
+
}
|
166
|
+
|
167
|
+
|
168
|
+
|
169
|
+
|
170
|
+
xmpFile.CloseFile();
|
171
|
+
}
|
172
|
+
catch (XMP_Error& e) {
|
173
|
+
xmpFile.CloseFile();
|
174
|
+
rb_raise(rb_eRuntimeError, "XMP Error: %s", e.GetErrMsg());
|
175
|
+
return Qnil;
|
176
|
+
}
|
177
|
+
catch (...) {
|
178
|
+
xmpFile.CloseFile();
|
179
|
+
rb_raise(rb_eRuntimeError, "Unknown error processing XMP file");
|
180
|
+
return Qnil;
|
181
|
+
}
|
182
|
+
|
183
|
+
return Qnil;
|
184
|
+
}
|
185
|
+
|
186
|
+
VALUE get_xmp_from_file(VALUE self, VALUE rb_filename)
|
187
|
+
{
|
188
|
+
Check_Type(rb_filename, T_STRING);
|
189
|
+
const char* fileName = StringValueCStr(rb_filename);
|
190
|
+
|
191
|
+
bool ok;
|
192
|
+
SXMPMeta xmpMeta;
|
193
|
+
SXMPFiles xmpFile;
|
194
|
+
XMP_FileFormat format;
|
195
|
+
XMP_OptionBits openFlags, handlerFlags;
|
196
|
+
XMP_PacketInfo xmpPacket;
|
197
|
+
|
198
|
+
try {
|
199
|
+
XMP_OptionBits opts = kXMPFiles_OpenForRead | kXMPFiles_OpenUseSmartHandler;
|
200
|
+
ok = xmpFile.OpenFile(fileName, kXMP_UnknownFile, opts);
|
201
|
+
if (!ok) {
|
202
|
+
xmpFile.CloseFile();
|
203
|
+
|
204
|
+
opts = kXMPFiles_OpenForRead | kXMPFiles_OpenUsePacketScanning;
|
205
|
+
ok = xmpFile.OpenFile( fileName, kXMP_UnknownFile, opts );
|
206
|
+
if ( ! ok ) {
|
207
|
+
// Neither smart handler nor packet scanning worked
|
208
|
+
xmpFile.CloseFile();
|
209
|
+
return Qnil;
|
210
|
+
}
|
211
|
+
}
|
212
|
+
|
213
|
+
ok = xmpFile.GetFileInfo(0, &openFlags, &format, &handlerFlags);
|
214
|
+
if (!ok) {
|
215
|
+
xmpFile.CloseFile();
|
216
|
+
return Qnil;
|
217
|
+
}
|
218
|
+
|
219
|
+
ok = xmpFile.GetXMP(&xmpMeta, 0, &xmpPacket);
|
220
|
+
if (!ok) {
|
221
|
+
xmpFile.CloseFile();
|
222
|
+
return Qnil;
|
223
|
+
}
|
224
|
+
|
225
|
+
VALUE result = rb_hash_new();
|
226
|
+
|
227
|
+
rb_hash_aset(result,
|
228
|
+
rb_str_new_cstr("format"),
|
229
|
+
UINT2NUM(format));
|
230
|
+
rb_hash_aset(result,
|
231
|
+
rb_str_new_cstr("handler_flags"),
|
232
|
+
UINT2NUM(handlerFlags));
|
233
|
+
rb_hash_aset(result,
|
234
|
+
rb_str_new_cstr("offset"),
|
235
|
+
LONG2NUM(xmpPacket.offset));
|
236
|
+
rb_hash_aset(result,
|
237
|
+
rb_str_new_cstr("length"),
|
238
|
+
LONG2NUM(xmpPacket.length));
|
239
|
+
|
240
|
+
std::string xmpString;
|
241
|
+
xmpMeta.SerializeToBuffer(&xmpString);
|
242
|
+
rb_hash_aset(result,
|
243
|
+
rb_str_new_cstr("xmp_data"),
|
244
|
+
rb_str_new_cstr(xmpString.c_str()));
|
245
|
+
|
246
|
+
xmpFile.CloseFile();
|
247
|
+
return result;
|
248
|
+
}
|
249
|
+
catch (XMP_Error& e) {
|
250
|
+
xmpFile.CloseFile();
|
251
|
+
rb_raise(rb_eRuntimeError, "XMP Error: %s", e.GetErrMsg());
|
252
|
+
return Qnil;
|
253
|
+
}
|
254
|
+
catch (...) {
|
255
|
+
xmpFile.CloseFile();
|
256
|
+
rb_raise(rb_eRuntimeError, "Unknown error processing XMP file");
|
257
|
+
return Qnil;
|
258
|
+
}
|
259
|
+
}
|
260
|
+
|
261
|
+
// xmp_initialize(self, filename)
|
262
|
+
// Initialize the XMP Toolkit and SXMPFiles with an optional PLUGINS_PATH
|
263
|
+
VALUE xmp_initialize(VALUE self)
|
264
|
+
{
|
265
|
+
try {
|
266
|
+
if (!SXMPMeta::Initialize()) {
|
267
|
+
rb_raise(rb_eRuntimeError, "Failed to initialize XMP Toolkit metadata");
|
268
|
+
return Qnil;
|
269
|
+
}
|
270
|
+
|
271
|
+
// Look up XmpToolkitRuby::PLUGINS_PATH if defined
|
272
|
+
VALUE xmp_module = rb_const_get(rb_cObject, rb_intern("XmpToolkitRuby"));
|
273
|
+
if (rb_const_defined(xmp_module, rb_intern("PLUGINS_PATH"))) {
|
274
|
+
VALUE plugins_path = rb_const_get(xmp_module, rb_intern("PLUGINS_PATH"));
|
275
|
+
|
276
|
+
if (TYPE(plugins_path) == T_STRING) {
|
277
|
+
const char* path = StringValueCStr(plugins_path);
|
278
|
+
XMP_OptionBits options = 0;
|
279
|
+
options |= kXMPFiles_ServerMode;
|
280
|
+
|
281
|
+
if (!SXMPFiles::Initialize(options, path)) {
|
282
|
+
rb_raise(rb_eRuntimeError, "Failed to initialize XMP Files with plugin path");
|
283
|
+
return Qnil;
|
284
|
+
}
|
285
|
+
}
|
286
|
+
else {
|
287
|
+
if (!SXMPFiles::Initialize()) {
|
288
|
+
rb_raise(rb_eRuntimeError, "Failed to initialize XMP Files without plugin path");
|
289
|
+
return Qnil;
|
290
|
+
}
|
291
|
+
}
|
292
|
+
}
|
293
|
+
else {
|
294
|
+
if (!SXMPFiles::Initialize()) {
|
295
|
+
rb_raise(rb_eRuntimeError, "Failed to initialize XMP Files (PLUGINS_PATH not defined)");
|
296
|
+
return Qnil;
|
297
|
+
}
|
298
|
+
}
|
299
|
+
|
300
|
+
return Qnil;
|
301
|
+
}
|
302
|
+
catch (const XMP_Error& e) {
|
303
|
+
rb_raise(rb_eRuntimeError, "XMP Error during initialization: %s", e.GetErrMsg());
|
304
|
+
return Qnil;
|
305
|
+
}
|
306
|
+
catch (const std::exception& e) {
|
307
|
+
rb_raise(rb_eRuntimeError, "C++ exception during initialization: %s", e.what());
|
308
|
+
return Qnil;
|
309
|
+
}
|
310
|
+
catch (...) {
|
311
|
+
rb_raise(rb_eRuntimeError, "Unknown error during XMP initialization");
|
312
|
+
return Qnil;
|
313
|
+
}
|
314
|
+
}
|
315
|
+
|
316
|
+
VALUE xmp_terminate(VALUE self)
|
317
|
+
{
|
318
|
+
SXMPFiles::Terminate();
|
319
|
+
SXMPMeta::Terminate();
|
320
|
+
return Qnil;
|
321
|
+
}
|
@@ -0,0 +1,69 @@
|
|
1
|
+
#ifndef XMP_TOOLKIT_HPP
|
2
|
+
#define XMP_TOOLKIT_HPP
|
3
|
+
|
4
|
+
#include <cstdio>
|
5
|
+
#include <vector>
|
6
|
+
#include <string>
|
7
|
+
#include <cstring>
|
8
|
+
|
9
|
+
//#define ENABLE_XMP_CPP_INTERFACE 1
|
10
|
+
|
11
|
+
// Must be defined to instantiate template classes
|
12
|
+
#define TXMP_STRING_TYPE std::string
|
13
|
+
|
14
|
+
// Must be defined to give access to XMPFiles
|
15
|
+
#define XMP_INCLUDE_XMPFILES 1
|
16
|
+
|
17
|
+
// Ensure XMP templates are instantiated
|
18
|
+
#include "XMP.incl_cpp"
|
19
|
+
|
20
|
+
// Provide access to the API
|
21
|
+
#include "XMP.hpp"
|
22
|
+
|
23
|
+
#include <iostream>
|
24
|
+
#include <fstream>
|
25
|
+
|
26
|
+
#include <ruby.h>
|
27
|
+
|
28
|
+
using namespace std;
|
29
|
+
|
30
|
+
//#define ENABLE_XMP_CPP_INTERFACE 1;
|
31
|
+
|
32
|
+
// Must be defined to instantiate template classes
|
33
|
+
#define TXMP_STRING_TYPE std::string
|
34
|
+
// Must be defined to give access to XMPFiles
|
35
|
+
#define XMP_INCLUDE_XMPFILES 1
|
36
|
+
|
37
|
+
#include "XMP.incl_cpp"
|
38
|
+
#include "XMP.hpp"
|
39
|
+
|
40
|
+
// TXMPMeta‐style error callback
|
41
|
+
bool xmp_meta_error_callback(
|
42
|
+
void * clientContext,
|
43
|
+
XMP_ErrorSeverity severity,
|
44
|
+
XMP_Int32 cause,
|
45
|
+
XMP_StringPtr message
|
46
|
+
);
|
47
|
+
|
48
|
+
// TXMPFiles‐style error callback
|
49
|
+
bool xmp_file_error_callback(
|
50
|
+
void * clientContext,
|
51
|
+
XMP_StringPtr filePath,
|
52
|
+
XMP_ErrorSeverity severity,
|
53
|
+
XMP_Int32 cause,
|
54
|
+
XMP_StringPtr message
|
55
|
+
);
|
56
|
+
|
57
|
+
// Initialize SXMPMeta + SXMPFiles, installing callbacks.
|
58
|
+
// Returns Qtrue or raises a Ruby exception.
|
59
|
+
VALUE xmp_initialize(VALUE self);
|
60
|
+
|
61
|
+
// Terminate SXMPFiles + SXMPMeta.
|
62
|
+
VALUE xmp_terminate(VALUE self);
|
63
|
+
|
64
|
+
// process_file(filename) → Ruby Hash or nil
|
65
|
+
VALUE get_xmp_from_file(VALUE self, VALUE rb_filename);
|
66
|
+
|
67
|
+
VALUE write_xmp_to_file(int argc, VALUE* argv, VALUE self);
|
68
|
+
|
69
|
+
#endif
|
@@ -0,0 +1,44 @@
|
|
1
|
+
// xmp_init.cpp
|
2
|
+
|
3
|
+
#include "xmp_toolkit.hpp"
|
4
|
+
#include <ruby.h>
|
5
|
+
|
6
|
+
// The one and only Init function. Ruby will look for Init_xmp_toolkit_ruby
|
7
|
+
// because we will (in extconf.rb) build this extension as “xmp_toolkit_ruby.so”.
|
8
|
+
extern "C"
|
9
|
+
void Init_xmp_toolkit_ruby()
|
10
|
+
{
|
11
|
+
|
12
|
+
SXMPMeta::SetDefaultErrorCallback(
|
13
|
+
xmp_meta_error_callback,
|
14
|
+
nullptr,
|
15
|
+
0
|
16
|
+
);
|
17
|
+
|
18
|
+
SXMPFiles::SetDefaultErrorCallback(
|
19
|
+
xmp_file_error_callback,
|
20
|
+
nullptr,
|
21
|
+
0
|
22
|
+
);
|
23
|
+
|
24
|
+
VALUE mXmpToolkitRuby = rb_define_module("XmpToolkitRuby");
|
25
|
+
VALUE mXMPToolkit = rb_define_module_under(mXmpToolkitRuby, "XmpToolkit");
|
26
|
+
|
27
|
+
rb_define_singleton_method(mXMPToolkit,
|
28
|
+
"initialize_xmp",
|
29
|
+
RUBY_METHOD_FUNC(xmp_initialize),
|
30
|
+
0);
|
31
|
+
rb_define_singleton_method(mXMPToolkit,
|
32
|
+
"terminate",
|
33
|
+
RUBY_METHOD_FUNC(xmp_terminate),
|
34
|
+
0);
|
35
|
+
rb_define_singleton_method(mXMPToolkit,
|
36
|
+
"read_xmp",
|
37
|
+
RUBY_METHOD_FUNC(get_xmp_from_file),
|
38
|
+
1);
|
39
|
+
rb_define_singleton_method(mXMPToolkit,
|
40
|
+
"write_xmp",
|
41
|
+
RUBY_METHOD_FUNC(write_xmp_to_file),
|
42
|
+
-1);
|
43
|
+
|
44
|
+
}
|
@@ -0,0 +1,95 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "thor"
|
4
|
+
|
5
|
+
module XmpToolkitRuby
|
6
|
+
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
7
|
+
class CLI < Thor
|
8
|
+
# Ensures that the CLI exits with a non-zero status code on failure.
|
9
|
+
def self.exit_on_failure?
|
10
|
+
true
|
11
|
+
end
|
12
|
+
|
13
|
+
desc "print_xmp FILE_PATH [OUTPUT_FILE_PATH]", "Prints the XMP metadata from a given file. Optionally writes to OUTPUT_FILE_PATH."
|
14
|
+
method_option :raw, type: :boolean, default: false, desc: "Output the original, raw XMP data instead of the cleaned version."
|
15
|
+
|
16
|
+
def print_xmp(file_path, output_file_path = nil)
|
17
|
+
metadata = XmpToolkitRuby.xmp_from_file(file_path)
|
18
|
+
key_to_print = options[:raw] ? "xmp_data_orig" : "xmp_data"
|
19
|
+
|
20
|
+
if metadata && metadata[key_to_print]
|
21
|
+
xmp_content = metadata[key_to_print]
|
22
|
+
if output_file_path
|
23
|
+
begin
|
24
|
+
File.write(output_file_path, xmp_content)
|
25
|
+
puts "XMP Metadata from #{file_path}#{" (raw)" if options[:raw]} written to #{output_file_path}"
|
26
|
+
rescue SystemCallError => e # Catches errors like EACCES, ENOENT etc.
|
27
|
+
raise Thor::Error, "Error writing to output file #{output_file_path}: #{e.message}"
|
28
|
+
end
|
29
|
+
else
|
30
|
+
puts "XMP Metadata for: #{file_path}#{" (raw)" if options[:raw]}"
|
31
|
+
puts xmp_content
|
32
|
+
end
|
33
|
+
else
|
34
|
+
message = "No XMP metadata found (key: #{key_to_print}) or an error occurred for: #{file_path}"
|
35
|
+
raise Thor::Error, message if output_file_path
|
36
|
+
|
37
|
+
puts message
|
38
|
+
|
39
|
+
end
|
40
|
+
rescue XmpToolkitRuby::FileNotFoundError => e
|
41
|
+
raise Thor::Error, "Error: #{e.message}"
|
42
|
+
rescue StandardError => e
|
43
|
+
raise Thor::Error, "An unexpected error occurred: #{e.message}"
|
44
|
+
end
|
45
|
+
|
46
|
+
desc "override_xmp FILE_PATH XML_FILE_PATH", "Overrides or merges XMP metadata in FILE_PATH with content from XML_FILE_PATH."
|
47
|
+
long_desc <<-LONGDESC
|
48
|
+
This command will either replace or merge the XMP metadata in FILE_PATH
|
49
|
+
with the XMP metadata provided in XML_FILE_PATH.
|
50
|
+
|
51
|
+
When using --no-override (the default), new properties are added and existing ones updated.
|
52
|
+
When using --override, all existing XMP metadata is replaced with the new content.
|
53
|
+
|
54
|
+
The content of XML_FILE_PATH will be validated as XML before attempting to write.
|
55
|
+
LONGDESC
|
56
|
+
method_option :override, type: :boolean, default: false, desc: "Completely replace existing XMP instead of merging"
|
57
|
+
|
58
|
+
def override_xmp(file_path, xml_file_path)
|
59
|
+
raise Thor::Error, "XML file not found: #{xml_file_path}" unless File.exist?(xml_file_path)
|
60
|
+
raise Thor::Error, "XML file is not readable: #{xml_file_path}" unless File.readable?(xml_file_path)
|
61
|
+
|
62
|
+
xml_content = File.read(xml_file_path)
|
63
|
+
|
64
|
+
# Validate XML
|
65
|
+
doc = Nokogiri::XML(xml_content) do |config|
|
66
|
+
config.strict.nonet # More secure parsing options
|
67
|
+
end
|
68
|
+
|
69
|
+
unless doc.errors.empty?
|
70
|
+
error_messages = doc.errors.map(&:message).join("\n - ")
|
71
|
+
raise Thor::Error, "Invalid XML in #{xml_file_path}:\n - #{error_messages}"
|
72
|
+
end
|
73
|
+
|
74
|
+
# The XmpToolkitRuby.xmp_to_file method itself will call check_file! for file_path
|
75
|
+
XmpToolkitRuby.xmp_to_file(file_path, xml_content, override: options[:override])
|
76
|
+
|
77
|
+
mode = options[:override] ? "overrode" : "merged"
|
78
|
+
puts "Successfully #{mode} XMP metadata in #{file_path} with content from #{xml_file_path}."
|
79
|
+
rescue XmpToolkitRuby::FileNotFoundError => e
|
80
|
+
raise Thor::Error, "Error: #{e.message}"
|
81
|
+
rescue Thor::Error # Re-raise Thor errors directly
|
82
|
+
raise
|
83
|
+
rescue StandardError => e
|
84
|
+
raise Thor::Error, "An unexpected error occurred: #{e.message}\n#{e.backtrace.join("\n")}"
|
85
|
+
end
|
86
|
+
|
87
|
+
desc "version", "Show xmp_toolkit_ruby version"
|
88
|
+
|
89
|
+
def version
|
90
|
+
puts "xmp_toolkit_ruby version #{XmpToolkitRuby::VERSION}"
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
95
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module XmpToolkitRuby
|
4
|
+
module Namespaces
|
5
|
+
XMP_NS_XMP = "http://ns.adobe.com/xap/1.0/"
|
6
|
+
|
7
|
+
XMP_NS_XMP_RIGHTS = "http://ns.adobe.com/xap/1.0/rights/"
|
8
|
+
XMP_NS_XMP_MM = "http://ns.adobe.com/xap/1.0/mm/"
|
9
|
+
XMP_NS_XMP_BJ = "http://ns.adobe.com/xap/1.0/bj/"
|
10
|
+
|
11
|
+
XMP_NS_PDF = "http://ns.adobe.com/pdf/1.3/"
|
12
|
+
XMP_NS_PHOTOSHOP = "http://ns.adobe.com/photoshop/1.0/"
|
13
|
+
XMP_NS_PSALBUM = "http://ns.adobe.com/album/1.0/"
|
14
|
+
XMP_NS_EXIF = "http://ns.adobe.com/exif/1.0/"
|
15
|
+
XMP_NS_EXIF_AUX = "http://ns.adobe.com/exif/1.0/aux/"
|
16
|
+
XMP_NS_TIFF = "http://ns.adobe.com/tiff/1.0/"
|
17
|
+
XMP_NS_PNG = "http://ns.adobe.com/png/1.0/"
|
18
|
+
XMP_NS_SWF = "http://ns.adobe.com/swf/1.0/"
|
19
|
+
XMP_NS_JPEG = "http://ns.adobe.com/jpeg/1.0/"
|
20
|
+
XMP_NS_JP2K = "http://ns.adobe.com/jp2k/1.0/"
|
21
|
+
XMP_NS_CAMERA_RAW = "http://ns.adobe.com/camera-raw-settings/1.0/"
|
22
|
+
XMP_NS_DM = "http://ns.adobe.com/xmp/1.0/DynamicMedia/"
|
23
|
+
XMP_NS_SCRIPT = "http://ns.adobe.com/xmp/1.0/Script/"
|
24
|
+
XMP_NS_ASF = "http://ns.adobe.com/asf/1.0/"
|
25
|
+
XMP_NS_WAV = "http://ns.adobe.com/xmp/wav/1.0/"
|
26
|
+
XMP_NS_BWF = "http://ns.adobe.com/bwf/bext/1.0/"
|
27
|
+
XMP_NS_AESCART = "http://ns.adobe.com/aes/cart/"
|
28
|
+
XMP_NS_RIFFINFO = "http://ns.adobe.com/riff/info/"
|
29
|
+
XMP_NS_IXML = "http://ns.adobe.com/ixml/1.0/"
|
30
|
+
XMP_NS_XMP_NOTE = "http://ns.adobe.com/xmp/note/"
|
31
|
+
|
32
|
+
XMP_NS_ADOBE_STOCK_PHOTO = "http://ns.adobe.com/StockPhoto/1.0/"
|
33
|
+
XMP_NS_CREATOR_ATOM = "http://ns.adobe.com/creatorAtom/1.0/"
|
34
|
+
|
35
|
+
XMP_NS_EXIF_EX = "http://cipa.jp/exif/1.0/"
|
36
|
+
|
37
|
+
XMP_NS_XMP_IDENTIFIER_QUAL = "http://ns.adobe.com/xmp/Identifier/qual/1.0/"
|
38
|
+
XMP_NS_XMP_DIMENSIONS = "http://ns.adobe.com/xap/1.0/sType/Dimensions#"
|
39
|
+
XMP_NS_XMP_TEXT = "http://ns.adobe.com/xap/1.0/t/"
|
40
|
+
XMP_NS_XMP_PAGED_FILE = "http://ns.adobe.com/xap/1.0/t/pg/"
|
41
|
+
XMP_NS_XMP_GRAPHICS = "http://ns.adobe.com/xap/1.0/g/"
|
42
|
+
XMP_NS_XMP_IMAGE = "http://ns.adobe.com/xap/1.0/g/img/"
|
43
|
+
XMP_NS_XMP_FONT = "http://ns.adobe.com/xap/1.0/sType/Font#"
|
44
|
+
XMP_NS_XMP_RESOURCE_EVENT = "http://ns.adobe.com/xap/1.0/sType/ResourceEvent#"
|
45
|
+
XMP_NS_XMP_RESOURCE_REF = "http://ns.adobe.com/xap/1.0/sType/ResourceRef#"
|
46
|
+
XMP_NS_XMP_ST_VERSION = "http://ns.adobe.com/xap/1.0/sType/Version#"
|
47
|
+
XMP_NS_XMP_ST_JOB = "http://ns.adobe.com/xap/1.0/sType/Job#"
|
48
|
+
XMP_NS_XMP_MANIFEST_ITEM = "http://ns.adobe.com/xap/1.0/sType/ManifestItem#"
|
49
|
+
|
50
|
+
# Deprecated XML namespace constants
|
51
|
+
XMP_NS_XMP_T = "http://ns.adobe.com/xap/1.0/t/"
|
52
|
+
XMP_NS_XMP_T_PG = "http://ns.adobe.com/xap/1.0/t/pg/"
|
53
|
+
XMP_NS_XMP_G_IMG = "http://ns.adobe.com/xap/1.0/g/img/"
|
54
|
+
|
55
|
+
XMP_NS_DC = "http://purl.org/dc/elements/1.1/"
|
56
|
+
|
57
|
+
XMP_NS_IPTC_CORE = "http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/"
|
58
|
+
XMP_NS_IPTC_EXT = "http://iptc.org/std/Iptc4xmpExt/2008-02-29/"
|
59
|
+
|
60
|
+
XMP_NS_DICOM = "http://ns.adobe.com/DICOM/"
|
61
|
+
|
62
|
+
XMP_NS_PLUS = "http://ns.useplus.org/ldf/xmp/1.0/"
|
63
|
+
|
64
|
+
XMP_NS_PDFA_SCHEMA = "http://www.aiim.org/pdfa/ns/schema#"
|
65
|
+
XMP_NS_PDFA_PROPERTY = "http://www.aiim.org/pdfa/ns/property#"
|
66
|
+
XMP_NS_PDFA_TYPE = "http://www.aiim.org/pdfa/ns/type#"
|
67
|
+
XMP_NS_PDFA_FIELD = "http://www.aiim.org/pdfa/ns/field#"
|
68
|
+
XMP_NS_PDFA_ID = "http://www.aiim.org/pdfa/ns/id/"
|
69
|
+
XMP_NS_PDFA_EXTENSION = "http://www.aiim.org/pdfa/ns/extension/"
|
70
|
+
|
71
|
+
XMP_NS_PDFX = "http://ns.adobe.com/pdfx/1.3/"
|
72
|
+
XMP_NS_PDFX_ID = "http://www.npes.org/pdfx/ns/id/"
|
73
|
+
|
74
|
+
XMP_NS_RDF = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
75
|
+
XMP_NS_XML = "http://www.w3.org/XML/1998/namespace"
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
BSD 3-Clause License
|
2
|
+
|
3
|
+
Copyright (c) 2020, Adobe
|
4
|
+
All rights reserved.
|
5
|
+
|
6
|
+
See: https://github.com/adobe/XMP-Toolkit-SDK
|
7
|
+
|
8
|
+
Redistribution and use in source and binary forms, with or without
|
9
|
+
modification, are permitted provided that the following conditions are met:
|
10
|
+
|
11
|
+
1. Redistributions of source code must retain the above copyright notice, this
|
12
|
+
list of conditions and the following disclaimer.
|
13
|
+
|
14
|
+
2. Redistributions in binary form must reproduce the above copyright notice,
|
15
|
+
this list of conditions and the following disclaimer in the documentation
|
16
|
+
and/or other materials provided with the distribution.
|
17
|
+
|
18
|
+
3. Neither the name of the copyright holder nor the names of its
|
19
|
+
contributors may be used to endorse or promote products derived from
|
20
|
+
this software without specific prior written permission.
|
21
|
+
|
22
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
23
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
24
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
25
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
26
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
27
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
28
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
29
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
30
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
31
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
@@ -0,0 +1 @@
|
|
1
|
+
com.adobe.XMP.plugins.MiniPDFL
|
@@ -0,0 +1,31 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<PluginResource Architecture="x86">
|
3
|
+
<Handler
|
4
|
+
Name="adobe.coretech.xmp.minipdfl"
|
5
|
+
Version="1.00"
|
6
|
+
HandlerType="OwningHandler"
|
7
|
+
>
|
8
|
+
<CheckFormat
|
9
|
+
Offset="0"
|
10
|
+
Length="4"
|
11
|
+
ByteSeq="%PDF"
|
12
|
+
/>
|
13
|
+
<Extensions>
|
14
|
+
<Extension Name="pdf" />
|
15
|
+
<Extension Name="pdfl" />
|
16
|
+
</Extensions>
|
17
|
+
<HandlerFlags>
|
18
|
+
<HandlerFlag Name="kXMPFiles_CanInjectXMP" />
|
19
|
+
<HandlerFlag Name="kXMPFiles_CanExpand" />
|
20
|
+
<HandlerFlag Name="kXMPFiles_CanRewrite" />
|
21
|
+
<HandlerFlag Name="kXMPFiles_AllowsOnlyXMP" />
|
22
|
+
<HandlerFlag Name="kXMPFiles_ReturnsRawPacket" />
|
23
|
+
<HandlerFlag Name="kXMPFiles_HandlerOwnsFile" />
|
24
|
+
<HandlerFlag Name="kXMPFiles_AllowsSafeUpdate" />
|
25
|
+
<HandlerFlag Name="kXMPFiles_NeedsPreloading" />
|
26
|
+
</HandlerFlags>
|
27
|
+
<SerializeOptions>
|
28
|
+
<SerializeOption Name="kXMP_OmitPacketWrapper" />
|
29
|
+
</SerializeOptions>
|
30
|
+
</Handler>
|
31
|
+
</PluginResource>
|
Binary file
|
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
com.adobe.XMP.plugins.MiniPDFL
|