Я пытаюсь использовать Adobe Acrobat OLE для оптимизации и сжатия PDF-файлов, которые мы принимаем с помощью различных внутренних программ. Adobe использует C для всей своей документации, и у меня проблемы с преобразованием структуры в запись в Delphi.
Ссылка на SDK здесь:
Структура Adobe:
struct _t_PDFOptParams{
ASSize_t size;
ASPathName asPathDest;
ASFileSys fileSys;
ProgressMonitor progMon;
void* progMonClientData;
PDFOptPDFVersion enmAcrobatVersion;
PDFOptImageOptionsRec imageOptionsColor;
PDFOptImageOptionsRec imageOptionsGrayscale;
PDFOptImageOptionsRec imageOptionsMonochrome;
PDFont* arrPDFontsToUnembed;
ASInt32 cPDFontsToUnembed;
PDFOptFlattenTransparencyOptions pdfOptFlattenTransparencyOptions;
ASBool bRemoveFormActions;
ASBool bFlattenFormFields;
ASBool bRemoveJavascriptActions;
ASBool bRemoveAlternateImages;
ASBool bRemoveThumbnails;
ASBool bRemoveDocumentTags;
ASBool bSmoothenLines;
ASBool bMergeImageFragments;
ASBool bRemovePrintSettings;
ASBool bRemoveSrchIndex;
ASBool bRemoveBookmarks;
ASBool bRemoveCommentsAndWidgets;
ASBool bRemoveDocInfoAndMetadata;
ASBool bRemoveObjectData;
ASBool bRemoveFileAttachments;
ASBool bRemoveCrossRefs;
ASBool bRemovePrivateData;
ASBool bFlattenVisibleLayers;
PDFOptObjectCompression enmObjectCompression;
ASBool bUnencodedToFlate;
ASBool bLZWToFlate;
ASBool bRemoveInvalidBookmarks;
ASBool bRemoveInvalidLinks;
ASBool bRemoveUnreferencedNamedDests;
ASBool bLinearize;
}PDFOptParamsRec, *PDFOptParams;
Моя попытка в Delphi создать запись:
type PDFParams = record
size : byte;
asPathDest : string;
//fileSys : ;
//progMon : null
//progMonClientData : null
//enmAcrobatVersion : PDFOptPDFVersion;
//imageOptionsColor
//imageOptionsGrayscale
//imageOptionsMonochrome
//arrPDFontsToUnembed
cPDFontsToUnembed :Integer;
//pdfOptFlattenTransparencyOptions
bRemoveFormactions : bool;
bFlattenFormFields : bool;
bRemoveJavascriptActions : bool;
bRemoveAlternateImages : bool;
bRemoveThumbnails : bool;
bRemoveDocumentTags : bool;
bSmoothenLines : bool;
bMergeImageFragments : bool;
bRemovePrintSettings : bool;
bRemoveSrchIndex : bool;
bRemoveBookmarks : bool;
bRemoveCommentsAndWidgets: bool;
bRemoveDocInfoAndMetadata: bool;
bRemoveObjectData : bool;
bRemoveFileAttachments : bool;
bRemoveCrossRefs : bool;
bRemovePrivateData : bool;
bFlattenVisibleLayers : bool;
//enmObjectCompression : bool;
bUnencodedToFlate : bool;
bLZWToFlate : bool;
bRemoveInvalidBookmarks : bool;
bRemoveInvalidLinks : bool;
bRemoveUnreferencedNamedDests : bool;
bLinearize : bool;
end;
Я не уверен, что мне следует установить в закомментированных полях?
FWIW. нулевой (Null является константой для нулевого варианта) тоже определенно неправильно. Вобще ProgMon: ProgressMonitor;. или что-то в этом роде. Еще раз: покажите нам соответствующие определения.
Документы на самом деле не объясняют, что, например, ASFileSys - это. Я предполагать, это какая-то структура или даже интерфейс, но пока мы не увидим определение, это трудно сказать. Итак, я предполагать, вы можете просто написать: fileSys: ASFileSys, например, вы можете объявить все типы AsBool как таковые (например, bRemoveBookmarks: ASBool;). Если возможно, держитесь как можно ближе к оригиналу, поэтому не начинайте «переводить слишком много». Просто убедитесь, что используемые вами типы тоже хорошо переведены. Но опять же, без определений используемых типов вам никто не поможет. Гадать нет смысла.
FWIW, я ненавижу записи вроде PDFOptFlattenTransparencyOptions pdfOptFlattenTransparencyOptions;, где тип и имя поля различаются только регистром. Скорее укажите тип T впереди (в вашем переводе Delphi), чтобы устранить любую двусмысленность, даже если компилятор, вероятно, также может обрабатывать исходные имена (он часто может различать идентичный тип и имена полей).
А в C size_t обычно является кардиналом. Использование неправильного типа приведет к плохому выравниванию, поэтому обязательно посмотрите, что такое ASSize_t на самом деле.
@Remy: этот трюк с <!-- language:delphi --> всегда работает? Это ново?
@ Реми: неважно. Найдено stackoverflow.com/editing-help
@Rudy Нет, size_t имеет размер указателя
@ Дэвид: да, значит, NativeUInt, не всегда кардинал.





То, что вы перевели, даже близко не соответствует действительности. ASSize_t не является одним byte, ASPathName не является string, ASBool не является bool и т. д.
Структура PDFOptParams зависит от МНОГО других типов. На основе PDF определения этих типов будут выглядеть примерно так:
type
{ define this manually only if your Delphi version does not already provide it }
size_t = NativeUInt;
ASSize_t = size_t;
ASInt32 = Int32;
ASUns16 = UInt16;
ASBool = ASUns16;
ASDuration = ASInt32;
ASFileMode = ASUns16;
ASMDFile = Pointer;
ASErrorCode = ASInt32;
{ the following types are not documented in the PDF, so you need
to track down what they are actually defined as in the SDK and
translate them as needed... }
_t_ASPathNameRec = record
...
end;
ASPathName = ^_t_ASPathNameRec;
_t_PDFont = record
...
end;
PDFont = ^_t_PDFont;
_t_ASTextRec = record
...
end;
ASText = ^_t_ASTextRec;
{ I'm not going to translate all of the following callback types,
I'll leave that as an exercise for you to do. I've done the 1st
two for you (note: the PDF doesn't describe calling conventions
used, so if 'cdecl' doesn't work, try 'stdcall' instead)... }
ASFileSysOpenProc = function(pathName: ASPathName; mode: ASFileMode; var fP: ASMDFile): ASErrorCode; cdecl;
ASFileSysCloseProc = function(f: ASMDFile): ASErrorCode; cdecl;
ASFileSysFlushProc = ...;
ASFileSysSetPosProc = ...;
ASFileSysGetPosProc = ...;
ASFileSysSetEofProc = ...;
ASFileSysGetEofProc = ...;
ASFileSysReadProc = ...;
ASFileSysWriteProc = ...;
ASFileSysRemoveProc = ...;
ASFileSysRenameProc = ...;
ASFileSysIsSameFileProc = ...;
ASFileSysGetNameProc = ...;
ASFileSysGetTempPathNameProc = ...;
ASFileSysCopyPathNameProc = ...;
ASFileSysDiPathFromPathProc = ...;
ASFileSysPathFromDIPathProc = ...;
ASFileSysDisposePathNameProc = ...;
ASFileSysGetFileSysNameProc = ...;
ASFileSysGetStorageFreeSpaceProc = ...;
ASFileSysFlushVolumeProc = ...;
ASFileSysGetFileFlags = ...;
ASFileSysAsyncReadProc = ...;
ASFileSysAsyncWriteProc = ...;
ASFileSysAsyncAbortProc = ...;
ASFileSysYieldProc = ...;
ASFileSysMReadRequestProc = ...;
ASFileSysGetStatusProc = ...;
ASFileSysCreatePathNameProc = ...;
ASFileSysAcquireFileSysPathProc = ...;
ASFileSysClearOutstandingMReadsProc = ...;
ASFileSysGetItemPropsProc = ...;
ASFileSysFirstFolderItemProc = ...;
ASFileSysNextFolderItemProc = ...;
ASFileSysDestroyFolderIteratorProc = ...;
ASFileSysSetModeProc = ...;
ASFileSysURLFromPathProc = ...;
ASFileSysGetParentProc = ...;
ASFileSysCreateFolderProc = ...;
ASFileSysRemoveFolderProc = ...;
ASFileSysDisplayStringFromPathProc = ...;
ASFileSysSetTypeAndCreatorProc = ...;
ASFileSysGetTypeAndCreatorProc = ...;
ASFileSysReopenProc = ...;
ASFileSysHardFlushProc = ...;
ASFileSysGetPlatformThingProc = ...;
ASFileSysGetItemPropsAsCabProc = ...;
ASFileSysCanPerformOpOnItemProc = ...;
ASFileSysPerformOpOnItemProc = ...;
ASFileSysAcquirePlatformPathProc = ...;
ASFileSysReleasePlatformPathProc = ...;
ASFileSysGetNameAsASTextProc = ...;
ASFileSysDisplayASTextFromPathProc = ...;
ASFileSysRangeArrivedProc = ...;
ASFileSysCanSetEofProc = ...;
ASFileSysDIPathFromPathExProc = ...;
ASFileSysPathFromDIPathExProc = ...;
ASFileSysGetFilePositionLimitProc = ...;
ASFileSysOpen64Proc = ...;
ASFileSysSetPos64Proc = ...;
ASFileSysGetPos64Proc = ...;
ASFileSysSetEof64Proc = ...;
ASFileSysGetEof64Proc = ...;
ASFileSysGetNameForDisplayProc = ...;
ASFileSysGetStorageFreeSpace64Proc = ...;
_t_ASFileSysRec = record
size: ASSize_t;
open: ASFileSysOpenProc;
close: ASFileSysCloseProc;
flush: ASFileSysFlushProc;
setpos: ASFileSysSetPosProc;
getpos: ASFileSysGetPosProc;
seteof: ASFileSysSetEofProc;
geteof: ASFileSysGetEofProc;
read: ASFileSysReadProc;
write: ASFileSysWriteProc;
remove: ASFileSysRemoveProc;
rename: ASFileSysRenameProc;
isSameFile: ASFileSysIsSameFileProc;
getName: ASFileSysGetNameProc;
getTempPathName: ASFileSysGetTempPathNameProc;
copyPathName: ASFileSysCopyPathNameProc;
diPathFromPath: ASFileSysDiPathFromPathProc;
pathFromDIPath: ASFileSysPathFromDIPathProc;
disposePathName: ASFileSysDisposePathNameProc;
getFileSysName: ASFileSysGetFileSysNameProc;
getStorageFreeSpace: ASFileSysGetStorageFreeSpaceProc;
flushVolume: ASFileSysFlushVolumeProc;
getFileFlags: ASFileSysGetFileFlags;
readAsync: ASFileSysAsyncReadProc;
writeAsync: ASFileSysAsyncWriteProc;
abortAsync: ASFileSysAsyncAbortProc;
yield: ASFileSysYieldProc;
mreadRequest: ASFileSysMReadRequestProc ;
getStatus: ASFileSysGetStatusProc;
createPathName: ASFileSysCreatePathNameProc;
acquireFileSysPath: ASFileSysAcquireFileSysPathProc;
clearOutstandingMReads: ASFileSysClearOutstandingMReadsProc;
getItemProps: ASFileSysGetItemPropsProc;
firstFolderItem: ASFileSysFirstFolderItemProc;
nextFolderItem: ASFileSysNextFolderItemProc;
destroyFolderIterator: ASFileSysDestroyFolderIteratorProc;
setFileMode: ASFileSysSetModeProc;
urlFromPath: ASFileSysURLFromPathProc;
getParent: ASFileSysGetParentProc;
createFolder: ASFileSysCreateFolderProc;
removeFolder: ASFileSysRemoveFolderProc;
displayStringFromPath: ASFileSysDisplayStringFromPathProc;
setTypeAndCreator: ASFileSysSetTypeAndCreatorProc;
getTypeAndCreator: ASFileSysGetTypeAndCreatorProc;
reopen: ASFileSysReopenProc;
hardFlush: ASFileSysHardFlushProc;
getPlatformThing: ASFileSysGetPlatformThingProc;
getItemPropsAsCab: ASFileSysGetItemPropsAsCabProc;
canPerformOpOnItem: ASFileSysCanPerformOpOnItemProc;
performOpOnItem: ASFileSysPerformOpOnItemProc;
acquirePlatformPath: ASFileSysAcquirePlatformPathProc;
releasePlatformPath: ASFileSysReleasePlatformPathProc;
getNameAsASText: ASFileSysGetNameAsASTextProc;
displayASTextFromPath: ASFileSysDisplayASTextFromPathProc;
rangeArrived: ASFileSysRangeArrivedProc;
canSetEof: ASFileSysCanSetEofProc;
diPathFromPathEx: ASFileSysDIPathFromPathExProc;
pathFromDIPathEx: ASFileSysPathFromDIPathExProc;
getfileposlimit: ASFileSysGetFilePositionLimitProc;
open64: ASFileSysOpen64Proc;
setpos64: ASFileSysSetPos64Proc;
getpos64: ASFileSysGetPos64Proc;
seteof64: ASFileSysSetEof64Proc;
geteof64: ASFileSysGetEof64Proc;
getNameForDisplay: ASFileSysGetNameForDisplayProc;
getStorageFreeSpace64: ASFileSysGetStorageFreeSpace64Proc;
end;
ASFileSysRec = _t_ASFileSysRec;
ASFileSys = ^_t_ASFileSysRec;
PMBeginOperationProc = procedure(clientData: Pointer); cdecl;
PMEndOperationProc = procedure(clientData: Pointer); cdecl;
PMSetDurationProc = procedure(duration: ASDuration; clientData: Pointer); cdecl;
PMSetCurrValueProc = procedure(currValue: ASDuration; clientData: Pointer); cdecl;
PMGetDurationProc = function(clientData: Pointer): ASDuration; cdecl;
PMGetCurrValueProc = function(clientData: Pointer): ASDuration;
PMSetTextProc = procedure(text: ASText; clientData: Pointer); cdecl;
_t_ProgressMonitor = record
size: ASSize_t;
beginOperation: PMBeginOperationProc;
endOperation: PMEndOperationProc;
setDuration: PMSetDurationProc;
setCurrValue: PMSetCurrValueProc;
getDuration: PMGetDurationProc;
getCurrValue: PMGetCurrValueProc;
setText: PMSetTextProc;
end;
ASProgressMonitorRec = _t_ProgressMonitor;
ASProgressMonitor = ^_t_ProgressMonitor;
ProgressMonitor = ASProgressMonitor;
PDFOptPDFVersion = (kPDFOptRetainVersion = 0, kPDFOptAcrobat4, kPDFOptAcrobat5, kPDFOptAcrobat6, kPDFOptAcrobat7, kPDFOptAcrobat8);
PDFOptDownsamplingAlgo = (kPDFOptNoDownsampling = 0, kPDFOptAverage, kPDFOptSubsampling, kPDFOptBicubic);
PDFOptCompressionAlgo = (kPDFOptNoRecompression = 0, kPDFOptJpeg2000, kPDFOptJpeg, kPDFOptFlate, kPDFOptJBIG2, kPDFOptCCITT3, kPDFOptCCITT4, kPDFOptRunLengh);
PDFOptCompressionQlty = (kPDFOptMinimumQlty = 0, kPDFOptLowQlty, kPDFOptMediumQlty, kPDFOptHighQlty, kPDFOptMaximumQlty, kPDFOptLossless);
_t_PDFOptImageOptions = record
size: ASSize_t;
enmDownsamplingAlgo: PDFOptDownsamplingAlgo;
ppiDownsampleTo: ASInt32;
ppiDownsampleAbove: ASInt32;
enmCompressionAlgo: PDFOptCompressionAlgo;
enmCompressionQlty: PDFOptCompressionQlty;
nTileSize: ASInt32;
end;
PDFOptImageOptionsRec = _t_PDFOptImageOptions;
PDFOptImageOptions = ^_t_PDFOptImageOptions;
_t_PDFOptFlattenTransparencyOptions = record
size: ASSize_t;
pctRasterVectorBalance,
ppiLineArtAndText,
ppiGradientAndMesh: ASInt32;
bConvertText,
bConvertStrokes,
bClipComplexRegions,
bPreserveOverprint: ASBool;
end;
PDFOptFlattenTransparencyOptionsRec = _t_PDFOptFlattenTransparencyOptions;
PDFOptFlattenTransparencyOptions = ^_t_PDFOptFlattenTransparencyOptions;
PDFOptObjectCompression = (kPDFOptUntouchedCompression = 0, kPDFOptFullCompression, kPDFOptPartialCompression, kPDFOptRemoveCompression);
_t_PDFOptParams = record
size: ASSize_t;
asPathDest: ASPathName;
fileSys: ASFileSys;
progMon: ProgressMonitor;
progMonClientData: Pointer;
enmAcrobatVersion: PDFOptPDFVersion;
imageOptionsColor,
imageOptionsGrayscale,
imageOptionsMonochrome: PDFOptImageOptionsRec;
arrPDFontsToUnembed: ^PDFont;
cPDFontsToUnembed: ASInt32;
pdfOptFlattenTransparencyOptions: PDFOptFlattenTransparencyOptions;
bRemoveFormActions,
bFlattenFormFields,
bRemoveJavascriptActions,
bRemoveAlternateImages,
bRemoveThumbnails,
bRemoveDocumentTags,
bSmoothenLines,
bMergeImageFragments,
bRemovePrintSettings,
bRemoveSrchIndex,
bRemoveBookmarks,
bRemoveCommentsAndWidgets,
bRemoveDocInfoAndMetadata,
bRemoveObjectData,
bRemoveFileAttachments,
bRemoveCrossRefs,
bRemovePrivateData,
bFlattenVisibleLayers: ASBool;
enmObjectCompression: PDFOptObjectCompression;
bUnencodedToFlate,
bLZWToFlate,
bRemoveInvalidBookmarks,
bRemoveInvalidLinks,
bRemoveUnreferencedNamedDests,
bLinearize: ASBool;
end;
PDFOptParamsRec = _t_PDFOptParams;
PDFOptParams = ^_t_PDFOptParams;
Спасибо вам за помощь. Это дает мне много работы и направляет меня в правильном направлении.
Проблема в том, что мы не видим определения таких типов, как ASBool или ASPathName, поэтому можем только догадываться. Но в одном можно быть уверенным на 100%: ни один из этих типов C не переводится в строковый тип Delphi. Пожалуйста, покажите определения соответствующих типов, и мы сможем сказать вам, что правильно, а что нет. А пока можете приступить к чтению моей статьи: Питфалы конвертации.