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):
1uses
2 gsapi ….
3
4function msPdfToJpg(const sPdfFile: string; const sJpgFile:string) : string;
5var
6 argv:PPAnsiChar;
7 code:integer;
8 S, OutBuf : Ansistring;
9 instance:Pgs_main_instance;
10
11begin
12 Result:= '';
13 S:= '';
14 new(instance);
15
16 code:=gsapi_new_instance(@instance,nil);
17 if code<>0 then
18 raise Exception.Create('Impossible to open an instance
19 of ghostscript. Error code: '+IntToStr(code));
20 OutBuf:= '';
21
22 setlength(argv,9);
23 argv[0]:= StrNew(PAnsiChar(AnsiString(ParamStr(0))));
24 argv[1]:= '-q';
25 argv[2]:= '-dNOPAUSE';
26 argv[3]:= '-dBATCH';
27 argv[4]:= '-dSAFER';
28 argv[5]:= PAnsiChar('-sDEVICE=jpeggray');
29
30 argv[6]:= StrNew(PAnsiChar(AnsiString('-sOUTPUTFILE=%02d' + sJpgFile)));
31 argv[7]:= '-f';
32 argv[8]:= StrNew(PAnsiChar(AnsiString(sPdfFile)));
33
34 try
35 code:=gsapi_init_with_args(instance,length(argv),argv);
36
37 if code<0 then
38 raise Exception.Create('ERROR: init_args: '+IntToStr(code))
39 except
40 try
41 gsapi_exit(instance);
42 except
43
44 end;
45 try
46 gsapi_delete_instance(instance);
47 except;
48 end;
49 raise Exception.Create('ERROR: init_args: Access violation. Something went wrong.');
50
51 end;
52 StrDispose(Argv[0]);
53 StrDispose(Argv[6]);
54 StrDispose(Argv[8]);
55
56 gsapi_exit(instance);
57 try
58 gsapi_delete_instance(instance);
59 except;
60
61 end;
62 S:= OutBuf;
63 Result:= string(S);
64end;
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.