Xbase++ und PDF und Word
Moderator: Moderatoren
Xbase++ und PDF und Word
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
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
- brandelh
- Foren-Moderator
- Beiträge: 15710
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 73 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
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.
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
Hubert
- Martin Altmann
- Foren-Administrator
- Beiträge: 16586
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 116 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
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"
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
die Erstellung von Worddokumenten funktioniert auch ohne ActiveX. Mache ich zumindest so - weder mit ActiveX noch mit Reportgenerator, dafür aber "the hard way"
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
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.
- brandelh
- Foren-Moderator
- Beiträge: 15710
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 73 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
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
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
Gruß
Hubert
Hubert
- Lewi
- 1000 working lines a day
- Beiträge: 830
- Registriert: Di, 07. Feb 2006 14:10
- Wohnort: Hamburg
- Danksagung erhalten: 2 Mal
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.
Das ganze würde sich auch auf Basis von HTML-Dokumenten realisieren lassen.
Viele Grüße
Olaf
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.)
Viele Grüße
Olaf
- Lewi
- 1000 working lines a day
- Beiträge: 830
- Registriert: Di, 07. Feb 2006 14:10
- Wohnort: Hamburg
- Danksagung erhalten: 2 Mal
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.dvdbommel hat geschrieben:@Lewi
hast du einen LINK für JazzAge ???
Gruß DVDbommel
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
- brandelh
- Foren-Moderator
- Beiträge: 15710
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 73 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
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
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
Hubert