Другие пользователи, имеющие STRUGGLED, чтобы получить правильные параметры для получения GhostScript DLL, работающие в Delphi, могут оказаться полезными. Это быстро и грязно, но работает. Очистите его, как хотите. НАСЛАЖДАТЬСЯ!
GhostTools.pas файл класса для gsdll32.dll
// GhostTools.pas v.03, 12/20013, Marvi mail: [email protected]
//
// Open source, modify to whatever extent
// Class to interact with GhostScript gsdll32.dll for simple PDF manipulation
// i.e. PDF to Jpeg, PDF to PNG, PDF to PS, PDF to Text, PS to PDF, etc.
// Requires GhostScript GSDLL32.DLL to reside in .EXE project folder
// or at the very least somewhere your app can get to it.
// If you use the ps2ascii.ps interpreter, do same as well.
//
// include GhostTools in your uses section, and use as needed
unit GhostTools;
interface
uses SysUtils, gsapi; {gsapi.pas file required as well}
procedure PDF2PNG(input : AnsiString; output: AnsiString);
{generates PNG image from PDF }
procedure PDF2JPEG(input : AnsiString; output: AnsiString);
{generates JPEG image from PDF }
procedure PDF2PS(input : AnsiString; output: AnsiString);
{generates PostScript file from PDF file }
procedure PS2PDF(input : AnsiString; output: AnsiString);
{generates PDF file from PostScript file }
procedure PDF2TXT(input : AnsiString; output: AnsiString);
{extracts plain text via TxtWrite device - Method #1 }
procedure PDS2TXT(input : AnsiString; output: AnsiString);
{extract plain text via PostScript interpreter - Method #2 }
function SlashSwap(PathVar: string): string;
{exchange backslash for forward slash - unix style }
implementation
{ exchange backslash for forward slash - to unix path format }
{ resolves path issue in ps2ascii.ps running on Windows platform }
function SlashSwap(PathVar: string): string;
var tmp: string;
begin
tmp:= PathVar;
while Pos('\', tmp) > 0 do
tmp[Pos('\', tmp)] := '/';
result:= tmp;
end;
{ generates PostScript file from PDF file }
procedure PDF2PS(input : AnsiString; output: AnsiString);
var
ExitCode:integer;
instance: Pointer;
Arg: array of PAnsiChar;
begin
ExitCode := gsapi_new_instance(instance, nil);
if ExitCode < 0 then
raise Exception.Create('Impossible to open an instance of ghostscript. Error ExitCode: '+IntToStr(ExitCode));
try
SetLength(Arg, 7);
Arg[0] := PAnsiChar('-q');
arg[1] := PAnsiChar('-dSAFER');
Arg[2] := PAnsiChar('-dNOPAUSE');
arg[3] := PAnsiChar('-dBATCH');
arg[4] := PAnsiChar('-sOutputFile=' + output + '.ps');
arg[5] := PAnsiChar('-sDEVICE=ps2write');
arg[6] := PAnsiChar(input);
ExitCode := gsapi_init_with_args(instance, Length(Arg), @Arg[0]);
if ExitCode < 0 then raise Exception.Create('ERROR: init_args: '+IntToStr(ExitCode));
gsapi_exit(instance);
finally
gsapi_delete_instance(instance);
end;
end;
{ generates PDF file from PostScript file }
procedure PS2PDF(input : AnsiString; output: AnsiString);
var
ExitCode:integer;
instance: Pointer;
Arg: array of PAnsiChar;
begin
ExitCode := gsapi_new_instance(instance, nil);
if ExitCode < 0 then
raise Exception.Create('Impossible to open an instance of ghostscript. Error ExitCode: '+IntToStr(ExitCode));
try
SetLength(Arg, 9);
Arg[0] := PAnsiChar('ps2pdf');
arg[1] := PAnsiChar('-dNOPAUSE');
arg[2] := PAnsiChar('-dBATCH');
arg[3] := PAnsiChar('-dSAFER');
arg[4] := PAnsiChar('-sDEVICE=pdfwrite');
arg[5] := PAnsiChar('-sOutputFile='+ output+'.pdf');
arg[6] := PAnsiChar('-c');
arg[7] := PAnsiChar('.setpdfwrite');
arg[8] := PAnsiChar('-f' + input);
ExitCode := gsapi_init_with_args(instance, Length(Arg), @Arg[0]);
if ExitCode < 0 then raise Exception.Create('ERROR: init_args: '+IntToStr(ExitCode));
gsapi_exit(instance);
finally
gsapi_delete_instance(instance);
end;
end;
{ generates JPEG image from PDF - 1 image per page }
procedure PDF2JPEG(input : AnsiString; output: AnsiString);
var
ExitCode:integer;
instance: Pointer;
Arg: array of PAnsiChar;
begin
ExitCode := gsapi_new_instance(instance, nil);
if ExitCode < 0 then
raise Exception.Create('Impossible to open an instance of ghostscript. Error ExitCode: '+IntToStr(ExitCode));
try
SetLength(Arg, 16);
Arg[0] := PAnsiChar('-q');
Arg[1] := PAnsiChar('-dQUIET');
Arg[2] := PAnsiChar('-dPARANOIDSAFER');
Arg[3] := PAnsiChar('-dBATCH');
Arg[4] := PAnsiChar('-dNOPAUSE');
Arg[5] := PAnsiChar('-dNOPROMPT');
Arg[6] := PAnsiChar('-dMaxBitmap=500000000');
Arg[7] := PAnsiChar('-dFirstPage=1');
Arg[8] := PAnsiChar('-dAlignToPixels=0');
Arg[9] := PAnsiChar('-dGridFitTT=0');
Arg[10] := PAnsiChar('-sDEVICE=jpeg');
Arg[11] := PAnsiChar('-dTextAlphaBits=4');
Arg[12] := PAnsiChar('-dGraphicsAlphaBits=4');
Arg[13] := PAnsiChar('-r300x300');
Arg[14] := PAnsiChar('-sOutputFile='+ output + ' Page-%02d.jpeg');
Arg[15] := PAnsiChar(input);
ExitCode := gsapi_init_with_args(instance, Length(Arg), @Arg[0]);
if ExitCode < 0 then raise Exception.Create('ERROR: init_args: '+IntToStr(ExitCode));
gsapi_exit(instance);
finally
gsapi_delete_instance(instance);
end;
end;
{ extracts plain text from PDF file via ps2ascii.ps interpreter}
{ another interpreter is pstotxt.ps floating on the internet }
procedure PDS2TXT(input : AnsiString; output: AnsiString);
var
ExitCode:integer;
instance: Pointer;
Arg: array of PAnsiChar;
PSInterpreter: string;
OutputFile: string;
begin
input:= SlashSwap(input);
{*note: place your interpreter in your .EXE project folder }
PSInterpreter:= ExtractFilePath(ParamStr(0)) + 'ps2ascii.ps';
PSInterpreter:= SlashSwap(PSInterpreter);
outputFile:= ExtractFilePath(input) + output + '.txt';
OutputFile:= SlashSwap(OutputFile);
output:= OutputFile;
ExitCode := gsapi_new_instance(instance, nil);
if ExitCode < 0 then
raise Exception.Create('Impossible to open an instance of ghostscript. Error ExitCode: '+IntToStr(ExitCode));
try
SetLength(Arg, 9);
Arg[0] := PAnsiChar('-q');
Arg[1] := PAnsiChar('-sstdout='+ output); { Your_TXT_File_Out.txt }
Arg[2] := PAnsiChar('-dSIMPLE');
Arg[3] := PAnsiChar('-sFONTPATH=c:/windows/fonts');
Arg[4] := PAnsiChar('-dNODISPLAY');
Arg[5] := PAnsiChar('-dDELAYBIND');
Arg[6] := PAnsiChar('-dWRITESYSTEMDICT');
Arg[7] := PAnsiChar('-f'+ PSInterpreter); { path/to/ps2ascii.ps }
Arg[8] := PAnsiChar(input); { Your_PDF_File_In.pdf }
ExitCode := gsapi_init_with_args(instance, Length(Arg), @Arg[0]);
if ExitCode < 0 then raise Exception.Create('ERROR: init_args: '+IntToStr(ExitCode));
gsapi_exit(instance);
finally
gsapi_delete_instance(instance);
end;
end;
{ extract plain text from PDF File via TxtWrite device }
procedure PDF2TXT(input : AnsiString; output: AnsiString);
var ExitCode:integer;
instance: Pointer;
Arg: array of PAnsiChar;
begin
ExitCode := gsapi_new_instance(instance, nil);
if ExitCode < 0 then
raise Exception.Create('Impossible to open an instance of ghostscript. Error ExitCode: '+IntToStr(ExitCode));
try
SetLength(Arg, 5);
Arg[0] := PAnsiChar('-dBATCH');
Arg[1] := PAnsiChar('-dNOPAUSE');
Arg[2] := PAnsiChar('-sDEVICE=txtwrite');
Arg[3] := PAnsiChar('-sOutputFile='+ output + '.txt');
Arg[4] := PAnsiChar(input);
ExitCode := gsapi_init_with_args(instance, Length(Arg), @Arg[0]);
if ExitCode < 0 then raise Exception.Create('ERROR: init_args: '+IntToStr(ExitCode));
gsapi_exit(instance);
finally
gsapi_delete_instance(instance);
end;
end;
{ generates PNG image from PDF - 1 image per page }
procedure PDF2PNG(input : AnsiString; output: AnsiString);
var
ExitCode:integer;
instance: Pointer;
Arg: array of PAnsiChar;
begin
ExitCode := gsapi_new_instance(instance, nil);
if ExitCode < 0 then
raise Exception.Create('Impossible to open an instance of ghostscript. Error ExitCode: '+IntToStr(ExitCode));
try
SetLength(Arg, 11);
Arg[0] := PAnsiChar('ps2pdf');
Arg[1] := PAnsiChar('-dNOPAUSE');
Arg[2] := PAnsiChar('-dBATCH');
Arg[3] := PAnsiChar('-dSAFER');
Arg[4] := PAnsiChar('-sDEVICE=pngalpha');
Arg[5] := PAnsiChar('-r300');
Arg[6] := PAnsiChar('-dTextAlphaBits=4');
Arg[7] := PAnsiChar('-sOutputFile='+output+' Page-%02d.png');
Arg[8] := PAnsiChar('-c');
Arg[9] := PAnsiChar('.setpdfwrite');
Arg[10]:= PAnsiChar('-f'+ input);
ExitCode := gsapi_init_with_args(instance, Length(Arg), @Arg[0]);
if ExitCode < 0 then raise Exception.Create('ERROR: init_args: '+IntToStr(ExitCode));
gsapi_exit(instance);
finally
gsapi_delete_instance(instance);
end;
end;
end.
Если вы сделаете это лучше, пришлите мне копию ;-)
Незначительные обновления: получил экспорт рутина PDF в файл PostScript формат работы. Но до сих пор не выяснили фильтрацию текста с ps2ascii.ps еще –
Есть ли вообще текст? можете ли вы выбрать и скопировать текст с помощью средств просмотра PDF, таких как Sumatra, PDF XChange и т. д.? –
На самом деле да, удивительно. PDF-файл генерируется RICOH Aficio MP 5002. И почти каждый PDF-файл для извлечения текста, который я пробовал, как бесплатный, так и пробный, не может его извлечь. Там не включен бит безопасности, поэтому я предполагаю, что это был экранный дамп и пробежал дистиллятор. Но при переходе на постскриптум все данные есть. Я использовал студию PostScript, чтобы переконвертировать ее обратно в PDF из файла postscript, и она отлично работала. Я думаю, что это запатентованный рикошильный дистиллятор, который его испортил. Попытайтесь перекомпилировать PDF через gsdll32, а затем попробуйте устройство txtwrite, чтобы проверить, исправлено ли это. –