vložil Radek Červinka
11. srpna 2010 00:56
O vytváření PDF jsem již poznámku utrousil, ale někdy je třeba i opačný přístup. Parsování PDF neumím (komentáře uvítám), ale ghostscript s PDF umí pracovat a převádět do jiných formátů.
Ghostscript je pěkný kousek software, ale jeho použití je trochu komplikované, jelikož se většinou používá jako volání jeho exe. Naštěstí to lze i jinak. Veškerý kód je integrován v knihovně gsdll32.dll, která je jen z exe volána, takže stačí jen používat uvedenou knihovnu a patřičně ji zavolat.
Je to už dávno, co rozhraní pro použití gsapi z Delphi publikoval Alessandro Briosi a pořád se povaluje na internetu, ale pokud ho nemůžete najít, je zde lokální kopie gsapi.
Ukázka použití (v podstatě z jednoho dema na internetu), volání spočívá v předání parametrů shodných s exe variantou a trochu inicializace (osobně bych nepoužil StrNew - ale nebudu to upravovat, šlo mi o to ukázat, že to jde i bez exe):
uses
gsapi ….
function msPdfToJpg(const sPdfFile: string; const sJpgFile:string) : string;
var
argv:PPAnsiChar;
code:integer;
S, OutBuf : Ansistring;
instance:Pgs_main_instance;
begin
Result:= '';
S:= '';
new(instance);
code:=gsapi_new_instance(@instance,nil);
if code<>0 then
raise Exception.Create('Impossible to open an instance
of ghostscript. Error code: '+IntToStr(code));
OutBuf:= '';
setlength(argv,9);
argv[0]:= StrNew(PAnsiChar(AnsiString(ParamStr(0))));
argv[1]:= '-q';
argv[2]:= '-dNOPAUSE';
argv[3]:= '-dBATCH';
argv[4]:= '-dSAFER';
argv[5]:= PAnsiChar('-sDEVICE=jpeggray');
//argv[5]:= PAnsiChar('-sDEVICE=jpeg');
argv[6]:= StrNew(PAnsiChar(AnsiString('-sOUTPUTFILE=%02d' + sJpgFile)));
argv[7]:= '-f';
argv[8]:= StrNew(PAnsiChar(AnsiString(sPdfFile)));
try
code:=gsapi_init_with_args(instance,length(argv),argv);
if code<0 then
raise Exception.Create('ERROR: init_args: '+IntToStr(code))
except
try
gsapi_exit(instance);
except
end;
try
gsapi_delete_instance(instance);
except;
end;
raise Exception.Create('ERROR: init_args: Access violation. Something went wrong.');
end;
StrDispose(Argv[0]);
StrDispose(Argv[6]);
StrDispose(Argv[8]);
gsapi_exit(instance);
try
gsapi_delete_instance(instance);
except;
end;
S:= OutBuf;
Result:= string(S);
end;
Pokud si prostudujete parametry které program podporuje, zjistíte, že se tak dají např. generovat obrázky z PDF co soubor to stránka, výstupem může být PNG nebo jiný formát atd.