![]() |
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; |
AW: PDF Merge
Zitat:
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. |
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. |
AW: PDF Merge
Delphi-Quellcode:
Danke HolgerX!
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; Das funktioniert aber nicht, kommt nicht mal ne Fehlermeldung! |
AW: PDF Merge
Falls es ohne Abhängigkeit zu GhostScript laufen soll:
![]() Viele Grüsse, Julian |
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 ? |
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:
Ich verzweifle:roll:
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; |
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. |
AW: PDF Merge
Moin...:P
ein funktionierendes Beispiel:
Delphi-Quellcode:
PS:
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; So eine Funktion gehört nicht auf die Form sondern in eine seperate Unit / Klasse. Dieser Klasse übergiebst du dann die Dateien...:zwinker: |
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 08:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz