Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   PDF Merge (https://www.delphipraxis.net/206905-pdf-merge.html)

gaisser 8. Feb 2021 15:51

AW: PDF Merge
 
Ich habe den Fehler gefunden!
Ich muss den kompletten Pfad angeben, dann funktioniert es!
Coole Sache :)

Delphi-Quellcode:
var
  xProg: String;
begin
  xProg := '"C:\Program Files (x86)\gs\gs9.53.3\bin\gswin32.exe" -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=' + JvFilenameEdit3.Text
    + ' -dBATCH ' + JvFilenameEdit1.Text + ' ' + JvFilenameEdit2.Text;
  showmessage(xprog);
  JvCreateProcess1.CommandLine := xProg;
  JvCreateProcess1.Run;

end;

himitsu 8. Feb 2021 16:03

AW: PDF Merge
 
Zitat:

Delphi-Quellcode:
CommandLine := ExtractFilePath(Application.ExeName) + 'gs ...';

Liegt denn GS im selben Verzeichnis, wie deine Application?



Und dennoch solltest du sicherheitshalber "eventuelle" Leerzeichen beachten (Parameter in " einschließen), nicht nur bei der EXE, sondern auch bei den PDFs.
und das eine fehlende Leerzeichen einfügen. siehe #8

Außerdem ist denn das aktuelle Arbeitsverzeichnis auch das Verzeichnis wo die PDFs liegen?
Sicherheitshalber immer nur mit absoluten Pfaden arbeiten.

HolgerX 9. Feb 2021 17:26

AW: PDF Merge
 
Hmm..

Alternativ kannst du auch von GS die DLL direkt in deinem Programm verwenden, dann braucht gar kein GS mehr installiert werden und es muss auch kein (externes) Programm mehr aufgerufen werden.

Als Parameter werden die gleichen an einen Funktionsaufruf übergeben, wie beim Aufruf der Exe.

Die API-Pas files waren von Alessandro Briosi und müssen nur auf UniCode angepasst werden.

gaisser 10. Feb 2021 10:05

AW: PDF Merge
 
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  argv: Array of PAnsiChar;
  instance: Pointer;
  x: Integer;
begin
  // new(instance); //how many bytes, this really doesn't make sense with a untyped pointer!
  // setlength(argv, 4);
  // argv[0] := PANsiChar('ps2pdf');
  // argv[1] := PAnsiChar('-dNOPAUSE');
  // argv[2] := PAnsiChar('-dBATCH');
  // argv[3] := PAnsiChar('-dSAFER');
  // gsapi_init_with_args(instance, Length(argv), PPAnsiChar(argv));
  // gsapi_exit(instance);
  gsapi_new_instance(instance, instance);
  // ShowMessage(inttostr(x));
  // new(instance); //how many bytes, this really doesn't make sense with a untyped pointer!
  setlength(argv, 5);
  argv[0] := PAnsiChar('');
  argv[1] := PAnsiChar('-dNOPAUSE');
  argv[2] := PAnsiChar('-sDEVICE=pdfwrite');
  argv[3] := PAnsiChar('-sOUTPUTFILE= ' + JvFilenameEdit3.Text);
  argv[4] := PAnsiChar(' -dBATCH ' + JvFilenameEdit1.Text + ' ' +
    JvFilenameEdit2.Text);
  gsapi_init_with_args(instance, Length(argv), PPAnsiChar(argv));
  gsapi_exit(instance);
  showmessage('fertig!');

end;
Danke HolgerX!
Das funktioniert aber nicht, kommt nicht mal ne Fehlermeldung!

jziersch 10. Feb 2021 10:16

AW: PDF Merge
 
Falls es ohne Abhängigkeit zu GhostScript laufen soll:

WPViewPDF PLUS kann mehrere PDFs in eine neue zusammen führen. Es kann auch Seiten aus einer PDF herausnehmen und als Wasserzeichen (z.b. als Briefkopf) unter existierende Seiten aus einer anderen PDF legen. Seiten können auch gelöscht werden, dabei werden dann die Resourcen, die nur von diesen Seiten verwenden werden, nicht in der neuen PDF eingebunden.

Viele Grüsse,
Julian

Blup 10. Feb 2021 11:33

AW: PDF Merge
 
argv[0] // ein Pointer auf nil, sicher das die API damit etwas anfangen kann?
argv[3] // warum ein Leerzeichen nach dem = ?
argv[4] // warum ein Leerzeichen am Anfang ?

gaisser 10. Feb 2021 14:41

AW: PDF Merge
 
Ich blick es nicht:oops:
Was mache ich falsch, es kommt hier nun immer der Errocode 100
Kann vielleicht mal jemand Source testen?

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  ArgV: Array of PAnsiChar;
  instance: Pointer;
  x, code: Integer;
  xArgV: PPAnsiChar;
begin

  code := gsapi_new_instance(instance, nil);
  if code < 0 then
    raise Exception.Create
      ('Impossible to open an instance of ghostscript. Error code: ' +
      IntToStr(code));

  setlength(ArgV, 4);

  ArgV[0] := PAnsiChar('-dNOPAUSE' + #0);
  ArgV[1] := PAnsiChar('-sDEVICE=pdfwrite' + #0);
  ArgV[2] := PAnsiChar('-sOUTPUTFILE="' + JvFilenameEdit3.Text + '"' + #0);
  ArgV[3] := PAnsiChar('-dBATCH ' + '"' + JvFilenameEdit1.Text + '"' + ' ' + '"'
    + JvFilenameEdit2.Text + '"' + #0);

  code := gsapi_init_with_args(instance, Length(ArgV), @ArgV);
  if code < 0 then
    raise Exception.Create('ERROR: init_args: ' + IntToStr(code));

  gsapi_exit(instance);
  showmessage('fertig!');

end;
Ich verzweifle:roll:

HolgerX 10. Feb 2021 16:48

AW: PDF Merge
 
Hmm..

JvFilenameEdit1.Text dürfte wohl Unicode sein...

Ghostscipt DLL kann nur ANSI oder UTF8

Für UTF8 muss das Encodiung vor gsapi_init_with_args gesetzt werden (gsapi_set_arg_encoding(instance, GS_ARG_ENCODING_UTF8))

Somit die UnicodeStrings nach UTF8, dann dass Encoding setzen, dann gsapi_init_with_args.

haentschman 11. Feb 2021 05:09

AW: PDF Merge
 
Moin...:P

ein funktionierendes Beispiel:
Delphi-Quellcode:
function TGhostscript.PDFShrink(FileName: string): Boolean;
var
  TargetFileName: string;
  InitError: Integer;
begin
  if FDLLHandle = 0 then
  begin
    if not LoadDLL(FDLLPath) then
    begin
      Result := False;
      Exit;
    end;
  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));

    InitError := FGsApiInitWithArgs(FGsInstance, Length(FParameters), FParameters);
    Result := (InitError = 0);
    if InitError <> 0 then
    begin
      if Assigned(FOnError) then
      begin
        FOnError(Self, Format('Fehlercode: %d', [InitError]));
      end;
    end;
  finally
    FGsApiExit(FGsInstance);
  end;

  if Result then
  begin
    if not TToolsIO.IsFileInUse(FileName) then
    begin
      try
        TFile.Delete(FileName);
        if not TToolsIO.IsFileInUse(FileName) then
        begin
          if not RenameFile(TargetFileName, FileName) then
          begin
            if Assigned(FOnError) then
            begin
              FOnError(Self, Format('Fehler beim Umbenennen von TempPDF.pdf: %s', ['Rename']));
            end;
          end;
        end
        else
        begin
          if Assigned(FOnError) then
          begin
            FOnError(Self, Format('Fehler beim Umbenennen von TempPDF.pdf: %s', ['InUse']));
          end;
        end;
      except
        if Assigned(FOnError) then
        begin
          FOnError(Self, Format('Fehler beim Umbenennen von TempPDF.pdf: %s', ['Delete']));
        end;
      end;
    end
    else
    begin
      if Assigned(FOnError) then
      begin
        FOnError(Self, Format('Fehler beim Umbenennen von TempPDF.pdf (in Benutzung): %s', [FileName]));
      end;
    end;
  end;
end;
PS:
So eine Funktion gehört nicht auf die Form sondern in eine seperate Unit / Klasse. Dieser Klasse übergiebst du dann die Dateien...:zwinker:

gaisser 12. Feb 2021 09:42

AW: PDF Merge
 
Hi Danke für den Test, aber ich will ja Merge machen, aber das funktioniert nicht.
Habe es auch in einer eigenen Klasse deklariert!
Delphi-Quellcode:
function TGhostscript.PDFMerge(InFile1, InFile2, InFile3,
  OutFile: Ansistring): Boolean;
var
  xDLLFile: String;
begin
  if not FileExists(InFile1) then
  begin
    ShowMessage('PDF Nr1 wurde nicht gefunden!!!');
    Exit;
  end;
  if not FileExists(InFile2) then
  begin
    ShowMessage('PDF Nr2 wurde nicht gefunden!!!');
    Exit;
  end;
  if FDLLHandle = 0 then
  begin
    xDLLFile := IncludeTrailingBackslash(FDLLPath) + conDLLName;
    if FileExists(xDLLFile) then
      LoadDLL(xDLLFile);
  end;
  try
    SetLength(FParameters, 4);
    FParameters[0] := ('-dNOPAUSE');
    FParameters[1] := PAnsiChar('-dBATCH ' + '"'+InFile1+ '"' +' ' +
      '"'+InFile2+ '"') ;
    FParameters[2] := ('-sDEVICE=pdfwrite');
    FParameters[3] := PAnsiChar('-sOUTPUTFILE=' + '"'+OutFile+ '"' );

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

    ShowMessage(booltostr(Result));
  finally
    FGsApiExit(FGsInstance);
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:53 Uhr.
Seite 2 von 4     12 34      

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