Ghostscriptの使い方


やまさ  2023-12-07 18:45:46  No: 151302

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に表示するようにしたいのですが、どうにもうまくいきません。
どなたかご教授お願い致します。


HFUKUSHI  2023-12-07 21:17:17  No: 151303

このページ参考になりませんか?

GhostScriptで一時ファイルを作らずにPDFのサムネイルを作成する - YAS's VB.NET Tips
http://www.yas-s.com/index.php?key=jonv32cpc-11

>  しかし、各ページをサムネイルで表示したい場合などでは、むやみにファイルを作らず、メモリ上でdllとやり取りをしたいと思います。
>  「gsapi_set_display_callback()」を使うことで、コールバック関数で、dllが生成した画像を直接受け取ることができました。


やまさ  2023-12-08 11:46:33  No: 151304

HFUKUSHIさん 書き込みありがとうございます。
きっとこれが再現できればいけそうですが、なにぶんVB.NETはよくわからないです。
ChatGPTも使って読み解いてはみていますが苦戦しています。


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加