Как извлечь изображение из файла IDML, используя IDMLlib
Мне нужно проанализировать файл IDML и сохранить изображения отдельно от этого файла в форматах для Интернета. Могу ли я сделать это IDMLlib? И если это возможно, то можете ли вы показать мне несколько примеров? PS Документация этой библиотеки ужасна, а примеры ужасны.
2 ответа
Очень известные файлы IDML не содержат данных изображений в кодировке Base-64 для связанных изображений, только для встроенных. Для связанных изображений сохраняются только их физические местоположения на исходном компьютере.
Встроенные изображения находятся внутри файлов "Spread_uXX.xml" в теге <Image>
, Этот тег содержит размеры изображения и некоторую другую метаинформацию, а также вложенный тег <Contents>
который перечисляет CDATA в Base-64. Имейте в виду: для каждого изображения может быть более одного блока CDATA.
Тип встроенных изображений может или не может быть таким же, как оригинал; тег Image должен объявить тип в атрибуте ImageTypeName
, Если формат файла не тот, который вы можете использовать "для Интернета", вам необходимо конвертировать его самостоятельно.
Я не использую IDMLlib, поэтому я не могу комментировать стиль его примеров.
Да, вы можете сделать это с помощью IDMLlib или написав свой собственный анализатор IDML (что я и сделал).
Изображения в IDML могут быть встроенными или связанными. Чтобы извлечь встроенное изображение, вам нужно найти узел контента, как описал Jongware.
Вот пример IDML для изображения, которое не внедрено:
<Image ItemTransform="1 0 0 1 -32.04 -35.04" Self="uf4" Name="$ID/" Visible="true" AppliedObjectStyle="ObjectStyle/$ID/[None]" GradientFillHiliteAngle="0" GradientFillHiliteLength="0" LocalDisplaySetting="Default" GradientFillAngle="0" GradientFillLength="0" GradientFillStart="0 0" VerticalLayoutConstraints="FlexibleDimension FixedDimension FlexibleDimension" HorizontalLayoutConstraints="FlexibleDimension FixedDimension FlexibleDimension" OverriddenPageItemProps="" LastUpdatedInterfaceChangeCount="" TargetInterfaceChangeCount="" ParentInterfaceChangeCount="" ImageTypeName="$ID/JPEG" ImageRenderingIntent="UseColorSettings" EffectivePpi="300 300" ActualPpi="300 300" Space="$ID/#Links_RGB">
<Properties>
<Profile type="string">$ID/None</Profile>
<GraphicBounds Right="64.08" Left="0" Bottom="70.08" Top="0"/>
</Properties>
<TextWrapPreference TextWrapMode="None" TextWrapSide="BothSides" ApplyToMasterPageOnly="false" Inverse="false">
<Properties>
<TextWrapOffset Right="0" Left="0" Bottom="0" Top="0"/>
</Properties>
<ContourOption ContourPathName="$ID/" IncludeInsideEdges="false" ContourType="SameAsClipping"/>
</TextWrapPreference>
<Link Self="uf7" LinkResourceSize="0~6561" LinkImportTime="2012-09-03T15:23:30" LinkImportModificationTime="2012-05-22T15:25:15" LinkImportStamp="file 129821703152428740 25953" ExportPolicy="NoAutoExport" ImportPolicy="NoAutoImport" CanPackage="true" CanUnembed="true" CanEmbed="true" ShowInUI="true" LinkObjectModified="false" LinkResourceModified="false" LinkClientID="257" LinkClassID="35906" StoredState="Normal" LinkResourceFormat="$ID/JPEG" LinkResourceURI="file:D:/Pictures/hkp.jpg" AssetID="$ID/" AssetURL="$ID/"/>
<ClippingPathSettings IncludeInsideEdges="false" Index="-1" AppliedPathName="$ID/" InsetFrame="0" Tolerance="2" Threshold="25" UseHighResolutionImage="true" RestrictToFrame="false" InvertPath="false" ClippingType="None"/>
<ImageIOPreference AlphaChannelName="$ID/" AllowAutoEmbedding="true" ApplyPhotoshopClippingPath="true"/>
</Image>
Чтобы найти изображение, вам нужно найти Link
узел, который является дочерним Image
узел и извлечь значение из LinkResourceURI
атрибут, который является путем к изображению. Это локальный путь, поэтому вам нужно делать все это на той же машине, на которой был создан IDML.
Чтобы документ IDML можно было переносить между компьютерами, необходимо встроить изображения с помощью панели "Ссылки" в InDesign.