unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls,jpeg;
type
TForm4 = class(TForm)
Button1: TButton;
Image1: TImage;
OpenDialog1: TOpenDialog;
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
PGSDLLInstance = ^TGSDLLInstance;
TGSDLLInstance = record
gsapi_revision: integer;
argc: integer;
argv: PAnsiChar;
pHandle: Pointer;
pDevices: Pointer;
end;
var
Form4: TForm4;
function gsapi_new_instance(var pinstance: PGSDLLInstance; caller_handle: Pointer): integer; stdcall; external 'gsdll32.dll';
function gsapi_init_with_args(instance: PGSDLLInstance; argc: integer; argv: PAnsiChar): integer; stdcall; external 'gsdll32.dll';
function gsapi_exit(instance: PGSDLLInstance): integer; stdcall; external 'gsdll32.dll';
function gsapi_delete_instance(instance: PGSDLLInstance): integer; stdcall; external 'gsdll32.dll';
implementation
{$R *.dfm}
procedure TForm4.Button1Click(Sender: TObject);
var
gsInstance: PGSDLLInstance;
exitCode: integer;
args: array[0..6] of PAnsiChar;
inputFile, outputFile: AnsiString;
BMP : TBitmap;
begin
BMP := TBitmap.Create;
if OpenDialog1.Execute then
begin
inputFile := AnsiString(OpenDialog1.FileName);
outputFile := ChangeFileExt(inputFile, '.bmp');
args[0] := 'pdf2bmp';
args[1] := '-dNOPAUSE';
args[2] := '-dBATCH';
args[3] := '-r600';
args[4] := '-sDEVICE=bmp256';
args[5] := PAnsiChar(AnsiString('-sOutputFile=' + outputFile));
args[6] := PAnsiChar(inputFile);
gsInstance := nil;
try
exitCode := gsapi_new_instance(gsInstance, nil);
if exitCode <> 0 then
begin
ShowMessage('Error: Ghostscript could not create new instance');
Exit;
end;
exitCode := gsapi_init_with_args(gsInstance, Length(args), @args[0]);
if exitCode <> 0 then
begin
ShowMessage('Error: Ghostscript initialization failed with error code ' + IntToStr(exitCode));
Exit;
end;
// Load JPEG image into TImage
//Image1.Picture.LoadFromFile(outputFile);
exitCode := gsapi_exit(gsInstance);
if exitCode <> 0 then
begin
ShowMessage('Error: Ghostscript exit code ' + IntToStr(exitCode));
end;
finally
gsapi_delete_instance(gsInstance);
BMP.LoadFromFile(outputFile);
Image1.Picture.Assign(BMP);
BMP.Free;
end;
end;
end;
end.
このプログラムをファイルに書き出さず、メモリストリームを使って直接Image1に表示するようにしたいのですが、どうにもうまくいきません。
どなたかご教授お願い致します。
このページ参考になりませんか?
GhostScriptで一時ファイルを作らずにPDFのサムネイルを作成する - YAS's VB.NET Tips
http://www.yas-s.com/index.php?key=jonv32cpc-11
> しかし、各ページをサムネイルで表示したい場合などでは、むやみにファイルを作らず、メモリ上でdllとやり取りをしたいと思います。
> 「gsapi_set_display_callback()」を使うことで、コールバック関数で、dllが生成した画像を直接受け取ることができました。
HFUKUSHIさん 書き込みありがとうございます。
きっとこれが再現できればいけそうですが、なにぶんVB.NETはよくわからないです。
ChatGPTも使って読み解いてはみていますが苦戦しています。
ツイート | ![]() |