Xbase++ und PDF und Word

Von Ausgaben mit der Gra-Engine über Generatoren bis zum Export in diversen Formaten

Moderator: Moderatoren

Antworten
JanR
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 129
Registriert: Di, 18. Okt 2005 14:44

Xbase++ und PDF und Word

Beitrag von JanR »

Hallo,

wie kann ich am besten Daten in einem PDF Dokument speichern und Daten in ein Word Dokument schaffen? Ich verwende Xbase++ 1.8 ohne Zusätze :).

Vielen Dank schonmal.

Grüsse,
Jan
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo,

grundsätzlich gibt es mit der 1.9 die Verwendung von ActiveX Komponenten (mit Excel und JazzAge habe ich sowas mal gemacht),
wenn es dir aber darum geht die Druckausgabe in ein PDF zu bekommen, kann ich den eDocPrinter PDF Pro empfehlen.

Dieser ist erstmal ein Druckertreiber, welcher PDF Dateien schreibt, genauso wie ein Drucker sie drucken würde. Aber man kann ihm über die Schriftarten Bedingungen für die automatische Erstellung von Lesezeichen beibrinngen:

Ich habe z.B. einen 1000 Seiten Report über Statistische Ergebnisse.
Die Hauptüberschriften in 16, die nächste Ebene 14 fett, die 3. 14 normal, der Rest in z.B. 12 Punkt.

Nun erzeugt er in der PDF links hirarchische Lesezeichen:

16. Blabla
14. fett blea
14. normal
16. Blad die 2.

...

Den Dateinamen gibt man über den XbpPrinter vor, kann Ihn aber ändern. Mit dem original Adobe kann man auch solche Ausdrucke machen, aber die Integration von Lesezeichen ist mir nicht gelungen.

Bei AktiveX war mein größtes Problem immer das finden der richtigen Word / Excel Klassen und das richtige kombinieren dieser um zum gewünschten Ergebnis zu kommen.

Dabei hilft einem der Macrorecorder. Dieser zeichnet VBA Befehle auf, die als Grundlage für eigene ActiveX Anweisung dienen können.

Ich habe gerade gesehen, dass in der 1.9 RC2 unter source\samples\activex\
einmal acrobat erwähnt wird und unter spellchk wird MS-Word zur Rechtschreibüberprüfung benutzt.

Wenn du also ein Worddokument als Gerüst erstellt hast, mußt du dort Sprungmarken oder eigene {/Schlüsselwörter/} unterbringen und mit Suchen und Ersetzen mit dem Wert überschreiben oder dort Werte direkt einfügen, kommt drauf an was du willst. Im Prinzip so ähnlich wie man früher in Text Dateien mit StrTran() Platzhalter ersetzt hat, nur ist das Suchen und Ersetzen jetzt etwas anders.
Gruß
Hubert
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Jan,
die Erstellung von Worddokumenten funktioniert auch ohne ActiveX. Mache ich zumindest so - weder mit ActiveX noch mit Reportgenerator, dafür aber "the hard way" 8)
Ich erstelle keine Worddateien, sondern eine RTF-Datei. Ist (ähnlich wie HTML) eine strukturierte "Sprache" und kann "hardcodiert" werden. Ist zwar sehr umständlich, aber irgendwann hat man den Dreh einigermaßen raus. Habe auf diese Art alle Druckausgaben, die vorher auf Drucker oder in eine Textdatei gingen jetzt umgestellt auf Drucker und RTF-Datei. Klappt wunderbar und zum Glück braucht man Sonderzeichen (Umlaute) nicht unbedingt durch die RTF-Pendants ersetzen - zumindest nicht, wenn man sich die RTF-Datei unter Windows anschaut/druckt!

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Puh, ich bin doch ein Weichei ;-) Ich habe mich immer vor den Hilfedateien gedrückt, da diese mit RTF formatiert eingegeben werden müssen...

Aber wegen der PDF habe ich im Alaska ActiveX Forum was gefunden.
Da berichtet ein Brasilianer (wenn ich die email adresse richtig zuordne) von einem Produkt 'QuickPDF' mit dem er Felder in PDFs ausfüllt.

Um solche Felder allerdings in ein PDF zu bekommen kenne ich nur den Weg über Acrobat, er erwähnt aber auch OpenOffice, eventell kann man das auch darüber anlegen. Jedenfalls füllt er diese mit QuickPDF.

Sein Problem ist, dass der Kunde nun alles so ausgedruckt haben will und es 8000 Rechnungen in eine PDF oder 8000 PDF Dateien bedeuten würde ;-)

Ich würde gerne 8000 Rechnungen schreiben, da wäre mir die Art egal 8)
Gruß
Hubert
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Viele Wege führen nach Rom. Dies gilt auch hinsichtlich der Erzeugung von PDF- und Worddokumente.

Eine Lösung konntest Du mit folgenden Tools realisieren:
- PDFCreator (Freeware)
- JazzAge ActiveX/COM (Freeware)

Erzeugung Word-Dokument

Bestehen die Rechungen nur aus einer Seite, würde es sich anbieten, ein Rechungsformular mit Word anzulegen. Innerhalb des Formulars müssen Platzhalter z.B. „#F_100#“, angegeben werden, in denen dann beim Druck die entsprechenden Werten eingesetzt werden. Dieses Formular wird dann im RTF-Format abgespeichert.

Im Prinzip lässt sich dieser Lösungsansatz auch für mehrseitige Formulare anwenden, indem Du mehrer Formularsätze erstellst, und Deine Anwendung auf Basis der Anzahl Artikelpositionen prüft, welcher Formularsatz herangezogen wird.

Im Zuge des Ausdrucks wird das das Formular eingelesen und die Platzhalter durch die entsprechenden Werte ersetzt.


PDF-Dokument erzeugen

Der PDFCreator kann ein gedrucktes Dokument automatisch abspeichern. Dazu sind die entsprechenden Einstellungen vorzunehmen. Im Netzwerkumfeld kann der Benutzername des Users berücksichtigt werden, so das ggf. Druckjobs anderer Stationen, die ebenfalls den PDFCreator zur Erzeugung von PDF-Dokumenten nutzen, nicht überschrieben werden.

Der programmtechnische Ablauf zur Erzeugung einer Rechnung ist dann wie folgt:

- Formularvorlage in einen String einlesen
- Platzhalter mit Werten ersetzen
- String in eine temporäre Datei speichern
- Word aufrufen und die temporäre Datei auf PDfCreator ausgeben
- Die erzeugte PDF-Datei weiter verarbeiten (Mailen, Anzeigen, drucken, etc)

Das nachfolge Codebeispiel soll dies unter der Nutzung von JazzAge veranschaulichen.

Code: Alles auswählen

********************************************************************************************************
Func BuiltRgFormular( oDb)
Local aWerte	:= { {„#F_100#“, ltrim( Str( oDb:RGNR(1),8,0 ) } ,;     // Hier das Array mit Paltzhaltern und Werten
                     {“#F_200#”, Dtoc( oDb:RGDATUM) }            ;
                   }

Local cFormFile	   := c:\anwendung\Form\RGForm.rtf“          // Formularvorlage
Local cTempFile	  := “c:\tmp\RGTemp.rtf”                            // temporäre RTF-Datei 
Local cFileStr

cFileStr               := ReadFile( cFormFile )


if empty( cFileStr )
   Return ( NIL )
Endif
FOR i := 1 TO len( aWerte)
   aItem[i,2] := ConvToAnsiCP( aitem[i,2] )                    // Datenbankwerte in das ASN-Format konvertieren  
   cFileStr   := StrTran( cFileStr, aWerte[i,1], aWerte[i,2] , 1, 1)  // Platzhalter durch Werte ersetzen
NEXT

If ! WriteFile( cTempFile , cFileStr)                        // neuen String in eine temporäre RTF-Datei schreiben    
   Return ( .F.
endif
PrintFile( cTempFile )                                           // temporäre Datei über Word in eine PDF-Datei ausgeben
PdfFileAction()                                                    // Erzeugte PDF-Datei weiter verarbeiten
Return ( NIL )



// Liest Datei in einen String ein
Function  ReadFile( cDatei )
Local cStr := ""
Local nSize
Local nHandle

IF ( !file( cDatei ) )
   MsgBox("Die Datei: " + cDatei + " wurde nicht gefunden")
   Return ( cStr  )
ENDIF

nHandle 	:= fopen( cDatei, FO_READ)
IF ( nHandle == -1 )
   MsgBox("Fehler beim Öffnen der Datei:" + str( FError() ) )
   Return ( cStr )
else
   nSize 	:= FSize( nHandle )
   cStr		:= Space( nSize )
   fRead( nHandle, @cStr, nSize )
   fclose( nHandle )
endif

Return ( cStr )




// Speichert "cStr) in die Datei "cDatei"
Function WriteFile( cDatei, cStr )
Local nHandle
Local lRet := .T.

nHandle := fcreate( cDatei, FC_NORMAL )
IF ( nHandle == -1 )
   lRet := .F.
ELSE
   FWrite( nHandle, cStr )
   FClose( nHandle )
ENDIF
Return ( lRet)

/**************************************************************************
* Drucken einer RTF-Datei "cDocFile" mit Word um eine PDF-Datei zu erzeugen
**************************************************************************/
Function Printfile(  cDocFile )
Local aActivePrinter

oWord:=JAObject():New()                                               // Word-Objekt erzeugen
oWord:Connect(JAXPPCREATEACTIVEXOBJECT("ProgID:Word.Application"))    // Word-Objekt mit Word-Applikations verbinden
cActivePrinter := <oWord:Activeprinter>                               // Namen des aktuellen Standardprinter sichern
<oWord:Visible:=.F.>                                                  // Word nicht sichtbar
oDoc:= JAObject():new()                                               // Dokumenten-Object erzeugen  
<oWord:Activeprinter := “PdfCreator”>                                 // Durckausgabe auf den Durcker "PDFCreator" setzen
oDoc:Connect(<oWord:Documents:Open( cDocFile )>)                      // Dokumenten-Objekt mit Dokument verbinden
<oDoc:PrintOut("Background",.F., )>                                   // Druckt Dokument im Hintergrund
<oWord:Activeprinter  := cActivePrinter>                              // Windows wieder auf den Standarddrucker setzten
oDoc:Disconnect()                                                     // Dokument von Objekt trennen
<oWord:Quit(0)>                                                       // Word beeenden
oWord:Disconnect()                                                    // Word-Object freigeben
FErase( cDocFile )                                                    // temporäre RTF-löschen (optional)
Return ( .T. )





// Hier erfolgt die Weiterverarbeitung des erzeugten PDF-Dokumentes
Func PdfFileAction()

If ! File( “c:\BENUTZERNAME\Print.pdf” )                                     // Entspricht der Einstellung für die automatische Speicherung des PDFCreators
   Return ( .F.)
endif

..... Do something
Return ( .T.)


Das ganze würde sich auch auf Basis von HTML-Dokumenten realisieren lassen.

Viele Grüße
Olaf
dvdbommel
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 49
Registriert: Sa, 11. Feb 2006 11:07

Beitrag von dvdbommel »

@Lewi

hast du einen LINK für JazzAge ???

Gruß DVDbommel
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

dvdbommel hat geschrieben:@Lewi

hast du einen LINK für JazzAge ???

Gruß DVDbommel
Ich habe JazzAge selbst käuflich erworben, als es noch keine FreeWare war. Ein Link ist mir nicht bekannt. Die HP des Autors ist ebenfalls nicht mehr aktiv.
Die letzten Informationen, die ich auf der HP des Autors gelesen habe, waren die, dass er das Tool als Freeware samt Source zur Verfügung stellen wollte.
Mich beispielsweise würde der Sourcecode interessieren.

Nach positiver Prüfung der Lizenzfrage würde ich ggf. eine Kopie der Bibliothek als Download zu Verfügung stellen.

Gruß, Olaf
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo DVDBommel,

also ich würde mir das mit Jazzage nochmals überlegen, ich habe gelesen, dass die ActiveX-Unterstützung in 1.9 - was in den nächsten Tagen kommen soll - wesentlich leichter ist, und diese wird auch weiterhin gewartet. Laut Alaska Support (vor einigen Monaten in einem Forum) wurde die Entscheidung dies in 1.90 selbst anbieten zu wollen damit begründet, dass die Probleme mit Jazzage doch nicht ganz trivial waren.

Mir war es damals zu umständlich, ich konnte aber auch die ActiveX Geschichte komplett umschiffen.

Tschüß
Hubert
Gruß
Hubert
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Mit JazzAge hatte ich bisher mit Word und Excel keine Probleme. Dies gilt auch in Zusammenhang mit Kundeninstallationen.
Benutzeravatar
mini990
1000 working lines a day
1000 working lines a day
Beiträge: 592
Registriert: Sa, 28. Jan 2006 9:44
Wohnort: Berg-Richtheim bei Neumarkt i.d.Opf.
Danksagung erhalten: 1 Mal

Beitrag von mini990 »

ich hatte das mit den Word-Dokumenten abgeleitet vom RTF-Beispiel auf der Alaska-HP. Funktioniert eigentlich sehr gut und problemlos.
Es werden RTF-Dokumente mit Platzhaltern angelegt die dann automatisch gefüllt werden...

Gruß Stefan
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Wer Interesse an der Bibliothek von Jazzage hat, kann sich unter meiner Mail-Adresse an mich wenden.
Antworten