Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: rhaller am 04.01.06 - 13:26:10

Titel: Distiller zum PDF erzeugen
Beitrag von: rhaller am 04.01.06 - 13:26:10
Hallo Gemeinde!

erstmal ein frohes neues Jahr 2006!

Ich stehe vor dem Problem, dass ich per Script ein Word-Dokument mit Daten aus Notes fülle, es für die Archivierung abspeichere und aus diesem Dokument dann ein PDF machen möchte. Das geht mit dem Destiller als Drucker ganz gut, aber leider nicht vollautomatisch. Drucken in eine Datei ist auch nicht das wahre bzw. ein Zwischenschritt, dann muss der Distiller als Objekt definiert werden, denn ich habe da was aufgeschnappt mit oDistiller.FileToPDF...

Oder braucht man zwingend das SDK von Adobe, um solche Dinge zu realisieren?

Vielleicht hat da schon jemand Erfahrungen gemacht oder kann mir sagen, wie der Distiller als Objekt mit createObject definiert wird...wäre toll!

Danke im Voraus!
Rudi
Titel: Re: Distiller zum PDF erzeugen
Beitrag von: Driri am 04.01.06 - 13:34:29
Muß es über den Distiller sein ? Das klingt auch nach nem teueren Vergnügen.

Und wenns was kosten darf, könnte man sich auch existierende Tools anschauen. Z.B. gibts von der Groupware AG einen PDF-Server, wo man überverschiedene Möglichkeiten Dokumente in PDF umwandeln lassen kann (http://www.groupware-ag.de/epdf.html).

Ansonsten gabs auf dem letzten Entwicklercamp einen Vortrag, wo eine Konvertierung über XML/XSLT vorgestellt wurde. Wäre evtl. eine Alternative.
Titel: Re: Distiller zum PDF erzeugen
Beitrag von: flaite am 04.01.06 - 13:45:26
Mit epdf habe ich keine guten Erfahrungen gemacht. Das packt keinen komplexen RichText. Viele Leute haben sich hier sehr unzufrieden über das Tool geäußert Mit xml/xslt ist die dokumenten-echte Konvertierung von xml/xslt übrigens auch nicht sichergestellt. IBM gibt das zu, arbeitet aber daran. Ich vermute btw. stark, dass dies das eigentliche Problem von epdf ist.

Es gibt genug PDF Druckertreiber, die beliebige Dokumente (u.a. auch Notes) in PDF umwandeln können.
Ich benutze für Notes-Dokumente einen dedizierten Rechner, der gescheduled die Drucks durchführt. Das geht über einen clientseitigen Agenten, der den Druck durchführt. Auf dem Server geht ja kein Drucken.

Das Problem ist, den Agenten zu schedulen.

Für Word Dokumente ist es nicht so schwierig eine wsh Datei oder eine VB-exe zu schreiben, die in ein bestimmtes Verzeichnis nach Word-Dokumenten sucht und dann diese mit dem pdf Druckertreiber ausdruckt (d.h. in PDF konvertiert).

Für Notes-to-tif: Nachdem ich keine guten Erfahrungen mit Windows-XP scheduling und wsh-Dateien gemacht habe (nach einer gewissen Zeit kommen automation errors), mache ich dieses scheduling mit quartz. Zum Glück arbeitet jemand gerade an einem Buch, so dass es für umsonst prima Doku-Material gibt: http://www.opensymphony.com/quartz/book_chaps.html
Klappt gut: Hier der log eines Programms, das einmal in einem bestimmten Rythmus 4 wechselnde Notes Agenten aufrufen soll. Der aufgerufene Agent kann dann ja uidoc Operationen ausführen.

Hier ist ein aktuelles Log. Sieht gut aus.
Code
INFO [QuartzScheduler_Worker-0] (ScanDirectoryJob.java:37) - ScanDirectory1 fired at Wed Jan 04 13:44:00 CET 2006
 INFO [QuartzScheduler_Worker-0] (ScanDirectoryJob.java:45) - next agent:2
 INFO [QuartzScheduler_Worker-0] (ScanDirectoryJob.java:37) - ScanDirectory1 fired at Wed Jan 04 13:45:00 CET 2006
 INFO [QuartzScheduler_Worker-0] (ScanDirectoryJob.java:45) - next agent:3
 INFO [QuartzScheduler_Worker-0] (ScanDirectoryJob.java:37) - ScanDirectory1 fired at Wed Jan 04 13:46:00 CET 2006
 INFO [QuartzScheduler_Worker-0] (ScanDirectoryJob.java:45) - next agent:4
 INFO [QuartzScheduler_Worker-0] (ScanDirectoryJob.java:37) - ScanDirectory1 fired at Wed Jan 04 13:47:00 CET 2006
 INFO [QuartzScheduler_Worker-0] (ScanDirectoryJob.java:45) - next agent:1

hoffe das ist einigermassen verständlich

Axel
Titel: Re: Distiller zum PDF erzeugen
Beitrag von: m3 am 04.01.06 - 13:46:58
Möglich wäre auch noch der Aufruf von Ghostscript (http://www.cs.wisc.edu/~ghost/), das kann das auch.
Titel: Re: Distiller zum PDF erzeugen
Beitrag von: rhaller am 04.01.06 - 14:05:24
Danke für die Tipps. aber Agenten und PDF-Server sind mir zu hoch gegriffen. Vielleicht sollte ich konkreter den Ablauf beschreiben:

Es wird aus einem NotesDokument heraus ein Word-Dokument mit den Daten erstellt und gefüllt und anschließend gespeichert und gedruckt, Word bleibt dabei vollständig im Hintergrund.

Bei dem neuen Ablauf soll as Word-Dokument soll quasi nicht gedruckt, sondern statt dessen in ein PDF oder TIFF umgewandelt werden (automatisch, die User speichern die Dokumente ja doch wieder ins Irgendwo und fangen dann an zu weinen, ich auch...) und anschließend automatisch an eine Notes-Email angehängt werden. Die Email wird schon mit allem notwendigen Angaben ausgefüllt und zur weiteren Bearbeitung geöffnet.

Ist soweit alles klar und funkt auch, bis auf das automatische Speichern des PDF-Dokuments. Es sollte doch möglich sein, den Distiller per CreateObject als Applikation zu laden. Vielleicht hat auch jemand ein Code-Schnipsel für mich übrig  ;-)


Titel: Re: Distiller zum PDF erzeugen
Beitrag von: flaite am 04.01.06 - 14:37:51
Dann solltest du dich an ein pdf distiller Forum wenden. Aber bitte hier mitteilen.
Über einen Druckertreiber öffnet sich natürlich Word im Hintergrund. Ich halte es persönlich auch für die einfachere Lösung. Aber für verschiedene Leute sind eben unterschiedliche Dinge verschieden kompliziert (ohne jede Wertung).


Gruß Axel
Titel: Re: Distiller zum PDF erzeugen
Beitrag von: rhaller am 04.01.06 - 14:47:41
@Axel: Das mit dem Adobe-Forum habe ich schon befürchtet, aber wenigstens siehst Du den Lösungsansatz ebenfalls wie ich: einfach für den Anwender, umständlich für den Entwickler ;-)

@Alle: Falls Ihr mir trotzdem weiterhelfen könnt, wäre das richtig Klasse!
Titel: Re: Distiller zum PDF erzeugen
Beitrag von: rhaller am 04.01.06 - 14:49:11
Ach ja, es muss ja nicht unbedingt ein PDF sein, ein TIFF wäre auch toll  O0

@Axel: Falls sich was findet, werde ich es auf jeden Fall hier posten!
Titel: Re: Distiller zum PDF erzeugen
Beitrag von: rhaller am 04.01.06 - 16:51:19
Das war ich bis vorhin:   ???

Jetzt bin ich das:  ;D

und hier (tätä) ist die Lösung:

      
       Set wrd = createobject("Word.Application")
       Set ard = createobject("PDFDistiller.PDFDistiller6")
      
       wrd.Visible = False
       wrd.ScreenUpdating = False
       wrd.ActivePrinter = "Adobe PDF"

'Word Dokument öffnen und mit Distiller als PS-Datei "ausdrucken"
       Set doc = wrd.Documents.Open("c:\balkow.doc")
       doc.PrintOut False, False, , "c:\test.ps", , , , , , , True
       doc.Close False
       wrd.Quit False
       Set doc = Nothing
       Set wrd = Nothing

'Distiller zum Konvertieren öffnen   
       ard.bShowWindow = True
       ard.FileToPDF "c:\test.ps", "c:\Balkow.pdf", True
       Set ard = Nothing

'Alte PS-Datei löschen
       Kill "c:\test.ps"
'Des wars
       Exit Sub
PDF_error:
       Debug.Print "Error"
       wrd.Quit
       Set doc = Nothing
       Set wrd = Nothing
       Set ard = Nothing

Eigentlich ist das ganz einfach, wenn man weiss, wie man das Distiller-Objekt ansprechen muss...und es ist eine einfache Lösung, in die der geneigte Anwender nicht reinpfuschen kann.

Grüße!

Titel: Re: Distiller zum PDF erzeugen
Beitrag von: flaite am 04.01.06 - 22:29:35
Hier der log eines Programms, das einmal in einem bestimmten Rythmus 4 wechselnde Notes Agenten aufrufen soll. Der aufgerufene Agent kann dann ja uidoc Operationen ausführen.

Das klappt natürlich nicht wie ich mir das gedacht habe. Man kann von Java keinen Notes Agenten ansprechen, der UI-Objekte benutzt.
Es geht einfach nicht.
Titel: Re: Distiller zum PDF erzeugen
Beitrag von: rhaller am 05.01.06 - 08:12:15
Guten Morgen! Denke mal, Dein Posting sollte woanders stehen...und im Übrigen klappt das wirklich nicht.

Titel: Geht auch per PDFCreator
Beitrag von: jo@chim am 04.05.07 - 21:21:06
Uups, dass ich diesen Post erst jetzt finde ... habe mir inzwischen selbst etwas mit dem PDFCreator http://www.pdfforge.org/products/pdfcreator/, einem freien PDF-Druckertreiber unter GNU GPL, gebastelt.
Das Skript kann auch mehrere Dateien zu einer einzigen PDF-Ausgabedatei kombinieren:

Code
Function file2PDF(fileNames As Variant,outPath As String,outFile As String) As String
%REM
	**********************************************************************************
	Uses the PDFCreator COM - http://www.pdfforge.org/products/pdfcreator
	to convert one or multiple files (and combine, if neccessary) to PDF
	**********************************************************************************
	Example use:
	Dim fileNames List As String
	Dim outPath As String
	Dim outFile As String
	fileNames(1) = "c:\temp\test1.doc"
	fileNames(2) = "c:\temp\test2.doc"	
	fileNames(3) = "c:\temp\test.xls"	
	outPath="c:\temp\"
	Combined output file(s) name:
	outFile="output.pdf"
	If you don't want a combined output file, specify
	outFile=""
	Msgbox file2PDF(fileNames,outPath,outFile),64,"file2PDF Ausgabemeldung"
	**********************************************************************************
	by jo@chim - version 2007/05/04
	**********************************************************************************
%END REM
	Dim PDFCreator As Variant	
	Dim combine As Boolean
	Dim DefaultPrinter As String
	Dim success As String
	
	Const sleepTime = 1 'Printer needs some sleepin' to avoid PDFCreator crash
	
	If Dir(outPath)="" Then
		file2PDF="The output path '" & outPath & "' does not exist"
		Exit Function
	End If	
	
	If outFile ="" Then
		combine=False
	Else
		combine=True
	End If	
	
	Set PDFCreator = CreateObject("PDFCreator.clsPDFCreator")	
	With PDFCreator
		.cStart "/NoProcessingAtStartup"			
		.cVisible = False
		.cWindowState = 1
		.cOption("UseAutosave") = 1
		.cOption("UseAutosaveDirectory") = 1
		.cOption("AutosaveFormat") = 0		
		.cOption("AutosaveDirectory") = outPath
		DefaultPrinter = .cDefaultprinter
		.cDefaultprinter = "PDFCreator"
		.cClearcache			
		
		Forall cFile In fileNames
			If Dir(cfile)="" Then
				success= success & Chr$(10) & "'"& cFile & "' does not exist"
			Elseif Not .cIsPrintable(cFile) Then
				success= success & Chr$(10) & "'"& cFile & "' cannot be converted to PDF"
			Else	
				j=0
				If combine=False Then
					For i = 1 To Len(cFile)
						If Instr(i,cFile,"\")<>0 Then
							j=Instr(i,cFile,"\")
						End If						
					Next i
					outFile=Right(cFile,Len(cFile)-j)
					.cOption("AutosaveFilename") = outFile
					.cPrintfile cFile
					.cPrinterStop = False
					Sleep sleepTime						
				Else
					.cPrintfile cFile
					Sleep sleepTime	
				End If				
				success= success & Chr$(10) & "'"& cFile & "' has been converted"
			End If	
		End Forall	
		
		If combine =True Then
			.cOption("AutosaveFilename") = outFile
			.cCombineAll
			.cPrinterStop = False
			Sleep sleepTime	
			success= success & Chr$(10)  & Chr$(10) & "Combined output file:" & Chr$(10) & outPath & outFile
		End If
		
		.cDefaultprinter = DefaultPrinter
		.cClearcache
		.cClose
	End With		
	Set PDFCreator =Nothing
	file2PDF=success
End Function
Titel: Re: Distiller zum PDF erzeugen
Beitrag von: Driri am 07.05.07 - 09:05:38
Sieht interessant aus, dazu mal eine Frage. Kann ich mit dem PDFCreator nur vorhandene Dateien ins PDF drucken ? Ich habe mal in der Hilfe zu COM nachgesehen und finde da nur die Subroutine cPrintFile.

Oder bleibt für ein NotesDocument nur der Umweg über z.B. eine Worddatei, die man dann vorher erzeugen muß ?
Titel: Re: Distiller zum PDF erzeugen
Beitrag von: Matthias1974 am 07.05.07 - 09:17:00
Hallo Diri,

ich habe auch seit kurzem den PDF-Creator als Dienst am Print-Server laufen, da kannst Du aus jeder Anwendung heraus direkt ein PDF-File erzeugen, läuft problemlos. Bei uns wird das PDF-File im Homedirectory des Benutzers erzeugt.
Titel: Re: Distiller zum PDF erzeugen
Beitrag von: jo@chim am 07.05.07 - 09:32:05
Den PDFCreator per cDefaultprinter als Standard-Drucker und wieder zurück zu setzen, scheint leider nur in Zusammenhang mit dem cPrintFile zu funktionieren (@matthias: ist das anders, wenn er als Dienst installiert ist? falls ja: wie steuere ich das per COM an?)

Ein temporäres Word-File ist sicher ein möglicher Problemlösungsansatz. Die Druckereinstellung per API-Calls (RegQueryValueEx / RegSetValueEx) zu steuern und dann das Notes-Dokument direkt als PDF zu drucken, erscheint mir aber, da Office-unabhängig, naheliegender.
Titel: Re: Distiller zum PDF erzeugen
Beitrag von: Driri am 07.05.07 - 10:23:57
Danke für die Info  :)
Titel: Re: Distiller zum PDF erzeugen
Beitrag von: Matthias1974 am 07.05.07 - 10:36:04
Die Doku zum installieren des Serverdienstes gibt es unter http://pdfforge.org/node/560.
Bin leider kein COM-Guru  ;D . Die Parameter stelle ich dann an der Konsole des PDF-Creator ein.


Titel: Re: Distiller zum PDF erzeugen
Beitrag von: jo@chim am 08.05.07 - 15:16:38
Nach einigem Basteln komme ich zu der Überzeugung, dass Du mit Deiner Idee, eine temporäre Word-Datei zur Konvertierung als PDF zu erzeugen, wohl doch richtig(er) liegst, Ingo:
Auf lotusrnext.net (http://www.lotusrnext.net/lotusrnext/LRDownload.nsf/WVFilesListHTML/B342FFB8340AC3AE85256D820012C004) findet sich zwar eine nette Musterlösung zur Manipulation der Druckerauswahl per Registry, um so das uidoc.print(...) nutzen zu können - Notes will aber zumindest bis R 6.5* im Gegensatz zu Redmond-Produkten die Auswahl des Druckers nicht zur Laufzeit des Skripts aktualisieren, so dass Frickeleien mit Werte-Zwischenspeicherung in Dokument-Feldern und Auslösung des PDF-Drucks im queryclose nötig werden.

(*An die 7er-Fahrer: hat sich diesbezüglich etwas geändert?)
Titel: Re: Distiller zum PDF erzeugen
Beitrag von: ozzy1206 am 09.05.07 - 12:35:39
Nach einigem Basteln komme ich zu der Überzeugung, dass Du mit Deiner Idee, eine temporäre Word-Datei zur Konvertierung als PDF zu erzeugen, wohl doch richtig(er) liegst, Ingo:

Hi,

wie würde man das effektiv bewerkstelligen, will heissen: Wie bekomme ich denn das Notes-Dokument möglichst 1:1 in Word rüber ?

Sorry, bin auf dem Gebiet noch nicht so weit vorgedrungen, daher die Frage  :) !

Gruß

ozzy
Titel: Re: Distiller zum PDF erzeugen
Beitrag von: jo@chim am 09.05.07 - 12:46:36
Hier (http://www.free.dominoserver.de/computer/noteslibrary.nsf/d2d59a3d7fc73a2bc1256a6900638352/331dd66d2239a1b2c1256dc50038f49e!OpenDocument) findest Du eine LS-Klasse zur Datenübergabe an MS Word. "A bissla" Lotusscript solltest Du aber schon können ...
Titel: Re: Distiller zum PDF erzeugen
Beitrag von: diali am 09.05.07 - 12:49:52
Wie hast Du den Drucker gewechselt per Win-API geht es unter 200, XP und ich glaube sogar schon unter NT 4 nicht mehr.

Aber mit dem WSH kannst Du zur Laufzeit den Druckertreiber wechseln.
Code
'Print mit WSH
Sub Initialize
	Call myprinter("FreePDF XP")  ' hier Drucker eintragen, es funktionieren auch Netzdrucker
End Sub

Sub myprinter(printer As String)
	Dim ws As New NotesUIWorkspace
	dim session as New NotesSession
	Dim db As NotesDatabase
	Dim uidoc As NotesUIDocument
	Dim PrinterPathAndName As String
	Dim objNetwork As Variant
	Set db = session.CurrentDatabase
	PrinterPathAndName = printer
	Set objNetwork = CreateObject("WScript.Network")
	
	objNetwork.SetDefaultPrinter PrinterPathAndName
	Print "aktueller Drucker ist jetzt " + Cstr(PrinterPathAndName)
	
	Set uidoc = ws.CurrentDocument
	Call uidoc.Print( 1 )  
End Sub
Titel: Re: Distiller zum PDF erzeugen
Beitrag von: jo@chim am 09.05.07 - 13:01:14
Die weiter oben verlinkte Musterlösung zum Druckerwechsel per API-Direktzugriff funktioniert zumindest hier bei mir unter XP!
Aktualisiert Notes die Druckausgabe zur Script-Laufzeit, wenn ich es per WSH anstosse? (Hab grad keine Zeit das zu testen). Das wäre natürlich:  8)
Titel: Re: Distiller zum PDF erzeugen
Beitrag von: ozzy1206 am 09.05.07 - 13:43:25
"A bissla" Lotusscript solltest Du aber schon können ...
Wie jetzt, das geht nicht mit Formelsprache  :o  ;) ?

Ernsthaft:
 Ja, "a bissla" LotusScript kann ich schon   ;D  - nur hatte ich bisher noch nicht das dringende Bedürfnis, von Notes aus Word anzusteuern. Jetzt liegt aber eine entsprechende Anforderung vor, und da ist mir der von Dir genannte Link als Beispiel sehr nützlich !

Danke & Gruß

Ozzy
Titel: Re: Distiller zum PDF erzeugen
Beitrag von: diali am 09.05.07 - 13:49:03
... der WSH kann zur Laufzeit den Drucker wechseln.
Titel: Re: Distiller zum PDF erzeugen
Beitrag von: jo@chim am 09.05.07 - 13:59:31
Den Drucker oder die Druckausgabe? Aus dem selben Script soll ein uidoc.print(...) gestartet werden. Per API triggert das den Drucker, der beim Start des Scripts eingestellt war ...
Titel: Re: Distiller zum PDF erzeugen
Beitrag von: diali am 09.05.07 - 14:02:36
ich habe das Script mit dem WSH so im Einsatz und funktioniert. Vorher habe ich ewig mit der Win-Api experimentiert und nachdem dies in einem Script nicht funktionierte wieder weggeschmissen.
Titel: Re: Distiller zum PDF erzeugen
Beitrag von: atbits am 09.05.07 - 22:24:12
Also PDF's könnte man auch ganz einfach per Java-Agent und der iText-Library erstellen.
Problem bereiten da nur RichText-Felder (die Formatierung im Speziellen).
An sonsten funktioniert die Generierung von PDF's damit super, sowohl server- als auch clientseitig.

Grüße David