Autor Beitrag
mcbain
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60
Erhaltene Danke: 1



BeitragVerfasst: Do 17.03.11 12:38 
Hallo,
ich würde gerne aus Delphi heraus ein PDF erstellen, ohne, dass der Anwender etwas davon bemerkt. Da sich das Dokument recht häufig ändern kann, dachte ich mir es ist das geschickteste ein Word-Dokument per OLE Fernseteuerung und Textmarken auszufüllen und anschließend unter einem anderen Namen abzuspeichern. Dies funktioniert bereits.
Allerdings habe ich noch Probleme mit der PDF-Erstellung. Ghostscript habe ich mir bereits installiert und kann auch über die CMD aus Postscript(.ps) eine PDF erstellen. Leider weiß ich aber noch nicht wie ich eine solche Postscript-Datei zuvor erzeuge. Ich weiß, dass man eine erzeugen kann über den Druckertreiber (in Datei drucken), aber dies muss ja der User zuvor auswählen und widerspricht sich mit meinem oben genannten Kriterium, dass der User von der PDF-Erstellung nichts mitbekommen soll.

Hat jemand einen Tip für mich? Oder geht das ganze einfacher?

Vielen Dank.


Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Do 17.03.2011 um 13:12
Reinhard Kern
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: Do 17.03.11 15:52 
user profile iconmcbain hat folgendes geschrieben Zum zitierten Posting springen:
Hallo,
ich würde gerne aus Delphi heraus ein PDF erstellen, ohne, dass der Anwender etwas davon bemerkt.


Hallo,

es gibt Bibliotheken zur direkten Erstellung von PDF, aber die sind i.d.R. nicht kostenlos.

Mal abgesehen davon: eine Software, die etwas tut, von dem ich nichts wissen soll, würde ich gegen Rückzahlung des Kaufpreises zurückgeben, notfalls per Gerichtsverfahren. My PC is my castle.

Gruss Reinhard
mcbain Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60
Erhaltene Danke: 1



BeitragVerfasst: Do 17.03.11 16:07 
Der User bekommt am Ende schon mit, dass eine PDF erstellt wurde, nur soll der User nicht im Prozess eingreifen müssen, um dies zu bewerkselligen. Er soll nur auf einen Button drucken, dann wird ein Word-Dokument mit Textmarken im Hintergrund geöffnet, die Textmarken werden mit entsprechenden Inhalten versehen, das Word-Dokument anschließend abgespeichert unter einem anderen Namen und dann soll daraus per Ghostscript ein PDF erstellt werden. Ist dies alles erfolgreich gewesen, so erscheint ein Popup und sagt: "PDF erstellt".

Dies müsste ja auch gehen, ich weiß eben nur nicht, wie ich eine Postscript Datei aus dem Word-Dokument erzeugen kann, ohne, dass der User irgendwas beim Druckertreiber auswählen muss.
Eine Postscript Datei in ein PDF umwandeln kann ich bereits, dies geschieht über die cmd und ghostscript...

Ein kommerzielles Produkt möchte ich dafür eher nicht erwerben.

Es gibt hier schon so einen ähnlichen Beitrag
www.delphi-library.d...ight=pdf+ghostscript
, allerdings muss man dafür mit Canvas eine PostScript-Datei zeichnen und das will ich ja eben nicht, das ganze soll aus einem Word-Dokument erstellt werden.

Hat noch jemand einen Rat?
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 17.03.11 16:36 
- Nachträglich durch die Entwickler-Ecke gelöscht -
mcbain Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60
Erhaltene Danke: 1



BeitragVerfasst: Di 22.03.11 13:07 
So, habe mein Problem gelöst.
Am Besten geht man so vor, man installiert sich Ghostscript und einen Drucker der PostScript Dateien schreiben kann. Dies Kann z.B. der PDFCreator oder FreePDF.
Dann erstellt man sich ein Word-Dokument, z.B. C:\test.doc.

Anschließend schreibt man sich noch folgenden Code:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
procedure TForm2.btn1Click(Sender: TObject);
var
  Doc, WordApp: OleVariant; 
begin
  try
    WordApp := CreateOleObject('Word.Application');

    WordApp.Documents.Open('C:\test.doc');
    Doc := WordApp.ActiveDocument;

    if not VarIsEmpty(WordApp) then
    begin
      WordApp.DisplayAlerts := 0;
      WordApp.ActiveDocument.SaveAs('C:\test_neu.doc');

      WordApp.ActiveDocument.PrintOut(Background:=False,
                                     Copies:=1,
                                     PrintToFile:=True,
                                     OutputFileName:='C:\test_neu.ps');

      Sleep(1000);
      ShellAPI.ShellExecute(Handle,'open',PChar('C:\Programme\gs\gs9.01\bin\test.bat'),nil,nil,SW_NORMAL);

      WordApp.Quit;
      WordApp := Unassigned;
    end;

  except
    on E: Exception do
       ShowMessage(e.Message);
  end;

end;


Jetzt wurde aus C:\test.doc ein C:\test_neu.doc und daraus wurde C:\test_neu.ps.
Da wir jetzt die benötigte Postscript-Datei haben, kann man einfach eine Batch-Datei aufrufen, um die *.ps mit Ghostscript umwandeln zu lassen.

Die Batch kann bspw. so aussehen:
ausblenden Quelltext
1:
2:
3:
cd C:
cd C:\Programme\gs\gs9.01\bin
gswin32c.exe -sDEVICE=pdfwrite -o c:/test_neu.pdf c:/test_neu.ps


Der Pfad zur gswin32c.exe varriert natürlich von Benutzer zu Benutzer und Ghostscript Version.

Edit: Ich vergas zu erwähnen, dass natürlich PDFCreator oder FreePDF als StandardDrucker ausgewählt sein muss. Ansonsten muss man halt über den Code den Drucker zuvor auswählen.