AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

PDF Merge

Ein Thema von gaisser · begonnen am 8. Feb 2021 · letzter Beitrag vom 15. Feb 2021
Antwort Antwort
Seite 2 von 3     12 3   
gaisser

Registriert seit: 7. Sep 2003
Ort: Dotternhausen(Baden Württemberg)
59 Beiträge
 
Delphi 10.4 Sydney
 
#11

AW: PDF Merge

  Alt 8. Feb 2021, 16:51
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;
Jochen
Nicht alles dem System anlasten, meistens sitzt der Fehler vor den Tasten !!!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.096 Beiträge
 
Delphi 10.4 Sydney
 
#12

AW: PDF Merge

  Alt 8. Feb 2021, 17:03
Zitat:
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu ( 8. Feb 2021 um 17:05 Uhr)
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
893 Beiträge
 
Delphi 6 Professional
 
#13

AW: PDF Merge

  Alt 9. Feb 2021, 18:26
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.
(Ja ich Verwende Delphi 6 Pro und will NICHT wechseln!)
  Mit Zitat antworten Zitat
gaisser

Registriert seit: 7. Sep 2003
Ort: Dotternhausen(Baden Württemberg)
59 Beiträge
 
Delphi 10.4 Sydney
 
#14

AW: PDF Merge

  Alt 10. Feb 2021, 11:05
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!
Jochen
Nicht alles dem System anlasten, meistens sitzt der Fehler vor den Tasten !!!
  Mit Zitat antworten Zitat
jziersch

Registriert seit: 9. Okt 2003
Ort: München
172 Beiträge
 
Delphi 10.4 Sydney
 
#15

AW: PDF Merge

  Alt 10. Feb 2021, 11:16
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
WPCubed GmbH
Komponenten für Delphi:
WPTools, wPDF, WPViewPDF
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
1.280 Beiträge
 
Delphi 2007 Professional
 
#16

AW: PDF Merge

  Alt 10. Feb 2021, 12:33
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 ?
  Mit Zitat antworten Zitat
gaisser

Registriert seit: 7. Sep 2003
Ort: Dotternhausen(Baden Württemberg)
59 Beiträge
 
Delphi 10.4 Sydney
 
#17

AW: PDF Merge

  Alt 10. Feb 2021, 15:41
Ich blick es nicht
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
Jochen
Nicht alles dem System anlasten, meistens sitzt der Fehler vor den Tasten !!!
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
893 Beiträge
 
Delphi 6 Professional
 
#18

AW: PDF Merge

  Alt 10. Feb 2021, 17:48
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.
(Ja ich Verwende Delphi 6 Pro und will NICHT wechseln!)
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
4.701 Beiträge
 
Delphi 10.1 Berlin Professional
 
#19

AW: PDF Merge

  Alt 11. Feb 2021, 06:09
Moin...

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...

Geändert von haentschman (11. Feb 2021 um 06:13 Uhr)
  Mit Zitat antworten Zitat
gaisser

Registriert seit: 7. Sep 2003
Ort: Dotternhausen(Baden Württemberg)
59 Beiträge
 
Delphi 10.4 Sydney
 
#20

AW: PDF Merge

  Alt 12. Feb 2021, 10:42
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;
Jochen
Nicht alles dem System anlasten, meistens sitzt der Fehler vor den Tasten !!!
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +2. Es ist jetzt 21:31 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf