AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

PDF Merge

Ein Thema von gaisser · begonnen am 8. Feb 2021 · letzter Beitrag vom 25. Okt 2021
Antwort Antwort
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.487 Beiträge
 
Delphi 12 Athens
 
#1

AW: PDF Merge

  Alt 10. Feb 2021, 11: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)
64 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: PDF Merge

  Alt 10. Feb 2021, 14: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
981 Beiträge
 
Delphi 6 Professional
 
#3

AW: PDF Merge

  Alt 10. Feb 2021, 16: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
5.431 Beiträge
 
Delphi 12 Athens
 
#4

AW: PDF Merge

  Alt 11. Feb 2021, 05: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 05:13 Uhr)
  Mit Zitat antworten Zitat
gaisser

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

AW: PDF Merge

  Alt 12. Feb 2021, 09: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
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.431 Beiträge
 
Delphi 12 Athens
 
#6

AW: PDF Merge

  Alt 12. Feb 2021, 10:11
...griegst du gleich. Ich hatte gestern Probleme mit "dynamischen" Parametern.
https://www.delphipraxis.net/206950-...usfuellen.html
FParameters[1] := PAnsiChar('-dBATCH ' + '"'+InFile1+ '"'  +' ' + '"'+InFile2+ '"') ; Das ist der Knackpunkt. Die Files gehören ans Ende als separate Parameter!

Geändert von haentschman (12. Feb 2021 um 10:15 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.341 Beiträge
 
Delphi 12 Athens
 
#7

AW: PDF Merge

  Alt 12. Feb 2021, 10:15
@gaisser: Bei dieser ART von DLLs, wo man die "selben" Parameter reingibt, wie für die EXE,
dort muß man oftmals/meistens auch den Param0 mit reingeben (gefüllt oder leer ist oft egal), also den "Programmaufruf" und erst ab Param1 die Parameter, da in der DPP praktisch der "selbe" Code steckt, wie in der EXE.
Delphi-Quellcode:
FParameters[0] := '';
FParameters[1] := ...;
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
elmar.faber

Registriert seit: 10. Sep 2007
Ort: Neustadt (Hessen)
37 Beiträge
 
Delphi 10.2 Tokyo Architect
 
#8

AW: PDF Merge

  Alt 30. Sep 2021, 14:49
Hallo,

habe gerade versucht, zwei FastReport PDF's mit Ghostscript zu mergen aber
trotz Aufrufs von gsapi_set_arg_encoding(FGsInstance, GS_ARG_ENCODING_UTF8),
wie von HolgerX vorgeschlagen, werden die Umlaute in Hieroglyphen umgewandelt.

Hat jemand eine Idee, wie man das korrigieren kann?

Viele Grüße
Elmar Faber
  Mit Zitat antworten Zitat
HolgerX

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

AW: PDF Merge

  Alt 1. Okt 2021, 07:02
Hmm..

Hallo,

habe gerade versucht, zwei FastReport PDF's mit Ghostscript zu mergen aber
trotz Aufrufs von gsapi_set_arg_encoding(FGsInstance, GS_ARG_ENCODING_UTF8),
wie von HolgerX vorgeschlagen, werden die Umlaute in Hieroglyphen umgewandelt.
Hasst Du die FileNamen auch vorher in ein UTF8 String konvertiert (bei Verwendung von GS_ARG_ENCODING_UTF8)?

In den Quelltexten von gaisser wird nur nach AnsiString konvertiert und nicht nach UTF8, und dann gehen schon so einige Zeichen verloren...
(Ja ich Verwende Delphi 6 Pro und will NICHT wechseln!)
  Mit Zitat antworten Zitat
Antwort Antwort


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 +1. Es ist jetzt 16:26 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