Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi vorhandene PDF verleinern, Optionen Ghostscript gesucht (https://www.delphipraxis.net/197424-vorhandene-pdf-verleinern-optionen-ghostscript-gesucht.html)

haentschman 6. Aug 2018 07:45

vorhandene PDF verleinern, Optionen Ghostscript gesucht
 
Moin...:P

Aufgabe:
Eine Orderstruktur, mit Unterordnern (ca.4000), die enthaltenen PDF, die von einem Scanner stammen, ohne nennenswerten Qualitätsverlust zu verkleinern. Mit dem PDF Creator geht das perfekt. (aus einer A4 Seite mit 6,2 MB wird ein PDF mit 250 KB - "optisch" identisch :thumb:) Aber da müßte ich jeden Order manuell konvertieren. :? Da der Ghostscript das kann (PDF laden und wieder mit geäderten Optionen speichern) wollte ich das mal probieren.

Nur komme ich grad mit dem gefühlt 1000 Optionen nicht klar. :?

Ich benötige:
1. Input File
2. Qutput File
3. in der PDF enthaltenes TIFF verleinern


GhostScript HowTo: https://www.ghostscript.com/doc/current/Use.htm

Könnte mir jemand helfen?

Danke.8-)

p80286 6. Aug 2018 09:25

AW: vorhandene PDF verleinern, Optionen Ghostscript gesucht
 
vielleicht hilft Dir dieser Link weiter:https://stackoverflow.com/questions/...ge-pdf#5802486

Gruß
K-H

Delphi.Narium 6. Aug 2018 11:01

AW: vorhandene PDF verleinern, Optionen Ghostscript gesucht
 
Der PDFCreator nutzt GhostScript.

Im Verzeichnis "Com Scripts" gibt es einige Beispiele für die Nutzung des PDFCreators aus diversen Programmiersprachen hinaus. Delphi ist leider nicht dabei.

Dann gibt es da noch die PDFCreator.COM.tlb im Installationsverzeichnis des PDFCreators. Die kann man in Delphi importieren. Wäre das eventuell auch eine Option?

Dann mal nicht in die Ferne schweifen, die DelphiPraxis liegt so nah: https://www.delphipraxis.net/152330-...hi-nutzen.html

Lektüre zum Thema Delphi und PDFCreator: https://www.colorpilot.com/pdfsamples/delphi.pdf

haentschman 6. Aug 2018 11:53

AW: vorhandene PDF verleinern, Optionen Ghostscript gesucht
 
Hallöle...:P
Danke für eure Tips...:wink:

Inzwischen bin ich schon weiter. Über die Konsole geht das:
Zitat:

C:\Program Files (x86)\gs\gs9.14\bin>gswin32 -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE -dBATCH -sOutputFile="E:\tmp2\Test.pdf" "E:\tmp2\Test1.PDF"
Das heißt...in eine Schleife mit ShellExecute gießen... 8-)

Danke...:P

haentschman 8. Aug 2018 14:57

AW: vorhandene PDF verleinern, Optionen Ghostscript gesucht
 
Hallöle...:P

Ich habe eine Miniklasse daraus gemacht... Bitteschön. 8-)

Delphi-Quellcode:
unit uGhostscript;

interface

uses
  Winapi.Windows,
  System.Classes, System.SysUtils, System.IOUtils;

const
  conDLLName = 'gsdll32.dll';
  conFileNameTempPDF = 'TempPDF.pdf';

type
  TStdIoFunction = function(CallerHandle: Pointer; Buffer: PAnsiChar; Length: Integer): Integer stdcall;
  TGsInit = function (I: Pointer; P: Pointer): Integer; stdcall;
  TGsApiInitWithArgs = function (I: Pointer; L: Integer; A: array of PAnsiChar): Integer; stdcall;
  TGsApiExit = function (I: Pointer): Integer; stdcall;
  TGsApiDeleteInstance = function (I: Pointer): Integer; stdcall;

  TOnErrorEvent = procedure(Sender: TObject; MessageText: string) of object;

  TGhostscript = class
  private
    FDLLPath: string;
    FDLLHandle: THandle;
    FGsInit: TGsInit;
    FGsApiInitWithArgs: TGsApiInitWithArgs;
    FGsApiExit: TGsApiExit;
    FGsApiDeleteInstance: TGsApiDeleteInstance;
    FGsInstance: Pointer;
    FParameters: array of PAnsiChar;
    FOnError: TOnErrorEvent;
    function LoadDLL(PathDLL: string): Boolean;
   function IsFileInUse(FileName: string): Boolean;
  public
    constructor Create(PathDLL: string = '');
    destructor Destroy; override;
    property OnError: TOnErrorEvent read FOnError write FOnError;
    function PDFShrink(FileName: string): Boolean;
  end;

implementation

{ TGhostscript }

// Initialisation
constructor TGhostscript.Create(PathDLL: string);
begin
  FDLLPath := PathDLL;
  FDLLHandle := 0;
end;

destructor TSEAMGhostscript.Destroy;
begin
  if FDLLHandle > 0 then
  begin
    FreeLibrary(FDLLHandle);
  end;
  inherited;
end;

// Work
function TGhostscript.LoadDLL(PathDLL: string): Boolean;
var
  CurrentDLLPath: string;
begin
  if PathDLL = '' then
  begin
    CurrentDLLPath := IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0))) + conDLLName;
  end
  else
  begin
    CurrentDLLPath := PathDLL;
  end;
  FDLLHandle := LoadLibrary(PChar(CurrentDLLPath));
  if FDLLHandle > 0 then
  begin
    FGsInit := GetProcAddress(FDLLHandle, 'gsapi_new_instance');
    Result := (FGsInit(@FGsInstance, nil) = 0);
    if Result then
    begin
      FGsApiInitWithArgs := GetProcAddress(FDLLHandle, 'gsapi_init_with_args');
      FGsApiExit := GetProcAddress(FDLLHandle, 'gsapi_exit');
      FGsApiDeleteInstance := GetProcAddress(FDLLHandle, 'gsapi_delete_instance');
    end
    else
    begin
      FOnError(Self, 'Die Ghostscript Instanz konnte nicht erzeugt werden.');
      Result := False;
    end;
  end
  else
  begin
    FOnError(Self, Format('Die Ghostscript DLL %s wurde nicht geladen.', [QuotedStr(CurrentDLLPath)]));
    Result := False;
  end;
end;

function TGhostscript.IsFileInUse(FileName: string): Boolean;
var
  Stream: TFileStream;
begin
  Result := False;
  Stream := nil;
  if not FileExists(FileName) then Exit;
  try
    Stream := TFileStream.Create(FileName, fmOpenRead); // Alternative: 'or fmShareExclusive'
  except
    Result := True;
  end;
  Stream.Free;
end;

function TGhostscript.PDFShrink(FileName: string): Boolean;
var
  TargetFileName: string;
begin
  if FDLLHandle = 0 then
  begin
    LoadDLL(FDLLPath);
  end;
  try
    TargetFileName := IncludeTrailingPathDelimiter(ExtractFilePath(FileName)) + conFileNameTempPDF;
    SetLength(FParameters, 7);
    FParameters[0] := '';
    FParameters[1] := '-dNOPAUSE';
    FParameters[2] := '-dBATCH';
    FParameters[3] := '-dPDFSETTINGS=/ebook';
    FParameters[4] := '-sDEVICE=pdfwrite';
    FParameters[5] := PAnsiChar(AnsiString('-sOutputFile=' + TargetFileName));
    FParameters[6] := PAnsiChar(AnsiString(FileName));

    Result := (FGsApiInitWithArgs(FGsInstance, Length(FParameters), FParameters) = 0);

  finally
    FGsApiExit(FGsInstance);
  end;

  if Result then
  begin
    if not IsFileInUse(FileName) then
    begin
      TFile.Delete(FileName);
      RenameFile(TargetFileName, FileName);
   end;
  end
end;

end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:19 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz