carbone.io als Druckeditor in NINOX integrieren
Das Thema Drucklayouteditor ist ja schon seit Jahren leidiges Thema hier im Forum. Zu Recht, da man aus der Ninox heraus leider nur rudimentär Daten zu "Papier" bzw. PDF bringen kann. Formatierungen werden nicht unterstützt, HTML genauso wenig. Diverse Workarounds sind die Folge oder gar Abwanderungen auf andere Softwarelösungen.
Auch nach dem Update sind wieder nicht alle User glücklich, da die Nutzung von Word-Templates wohl nur Private Cloud bzw. On-Premise Usern vorbehalten ist.
Die dort verwendete Engine lässt sich aber klassisch über RestAPI in die NINOX integrieren. Benötigt wird ein carbone-Account, welcher in der Free Version mit 100 credits (100 erzeugte Dokumente) kostenfrei ist...
Hat man einen Account erstellt, kann man unter account.carbone.io seinen Test- bzw. Production-API-Key erzeugen:
In der NINOX brauchen wir dann ein Bildfeld in das unser erzeugtes PDF geladen wird, ein mehrzeiliges Textfeld "API", ein Feld für die spätere RenderID, einen Button für das Script und ein Word- oder OpenOffice-Template. Ich benutze OpenOffice und habe hier mal das Sample-Template von carbone geöffnet:
Wie man sieht, sind alle zu ersetzenden Felder durch {d.xxxxxxxxx} gekennzeichnet. Wir legen uns also unser Dokument in dieser Form an und laden es anschließend in das carbone Studio (studio.carbone.io)
Hier kann man schon mit den Daten spielen und testen, ob alles soweit funktioniert. Wenn alles passt, brauchen wir zum ansteuern aus NINOX heraus die ID des Templates. Diese findet man oben rechts unter dem Info-Button (i)...
Zurück zur NINOX. Wir haben also unser Bildfeld namens "Ausdruck", unser Textfeld "API" und "renderID" zur Kontrolle und unseren Button. In den Button schreiben wir nun folgendes Script:
let testKey := "Bearer DER_TESTKEY_AUS_CARBONE";
let liveKey := "Bearer DER_PRODUCTION_KEY_AUS_CARBONE";
let myKey := testKey;
let auth := {
Authorization: myKey,
'Content-Type': "application/json",
'carbone-version': "3"
};
let myTemplate := "DIE_TEMPLATE_ID_AUS_CARBONE_STUDIO";
do as server
let response := http("POST", "https://render.carbone.io/render/" + myTemplate, auth, {
data: {
id: 12345,
name: "Max Muster",
adresse: KUNDENADRESSE
},
convertTo: "pdf",
reportName: Produkt + "_EinlegerFront.pdf"
});
API := text(response.result);
renderID := text(response.result.data.renderId)
end;
let myBild := "https://render.carbone.io/render/" + renderID;
importFile(this, myBild, "carbone.pdf");
Ausdruck := file(this, "carbone.pdf");
Fertig. Das sollte es gewesen sein... Wir schicken also über die NINOX Rest API unsere Daten an das carbone Template, erhalten eine renderID zurück und holen uns das gerenderte Dokument über die importFile-Funktion der NINOX in unser Bildfeld. Die übermittelten Daten im obigen Script können dabei feste Werte (wie 12345 und "Max Muster") sein, oder Feldnamen der Ninox (KUNDENADRESSE).
Den Dateinamen können wir in der importFile-Funktion festlegen. Hier ist es jetzt "carbone.pdf" - er könnte aber auch aus NINOX Feldnamen zusammengesetzt werden: KUNDENNR + "_Rechnung_" + RGNUMMER + ".pdf". Die gleiche Formel muss dann aber auch in file() stehen
importFile(this, myBild, KUNDENNR + "_Rechnung_" + RGNUMMER + ".pdf");
Ausdruck := file(this, KUNDENNR + "_Rechnung_" + RGNUMMER + ".pdf");
Wenn dann alles im Layout passt, kann man auf den liveKey wechseln und erhält ein Wasserzeichen-freies PDF (welches aber dann Credits kostet)
Ich hoffe das Vorgehen ist einigermaßen verständlich, das Script habe ich aus einer laufenden Umgebung zusammenkopiert, dort ist es umfangreicher eingebettet mit dialog() und alert()-Funktionen, einem Schalter für Test-bzw.Livebetrieb usw.
Happy printing!
Gruß, Tobias
26 Antworten
-
let myBild := "https://render.carbone.io/render/" + renderID; importFile(this, myBild, "carbone.pdf"); Ausdruck := file(this, "carbone.pdf");
Dies liefert leider einen Fehler zurück bzw. es wird keine Datei zu Ninox importiert. Ich habe es per Make auch getestet und dort funktioniert es. Der Report wird ordnungsgemäß erstellt, aber von Ninox nicht korrekt abgeholt. Irgendeine Idee, woran es liegen könnte?
-
Wie löst du das Script aus?
Über einen Trigger wird es nicht funktionieren.
Auch wenn das Script innerhalb 'do as server' ausgeführt werden soll wird es nicht funktionieren.
importFile() funktioniert nur, wenn aktiv ausgelöst und ausserhalb von 'do as server'. -
Hallo Stefanie, kannst Du den link mit der renderID denn manuell im Browser öffnen? Also läuft carbone wie es soll...? Oder wird die renderID in Ninox gar nocht befüllt?
Vielleicht müssten man ein sleep(1000) dazwischen setzen, damit carbone noch eine sekunde länger zum generieren hat...
-
Ich habe meine ersten Gehversuche unternommen, was ja auch so weit mit der Anleitung von Torsten und der DB aus dem api forum klappt. Ich hab noch das Problem was Stefanie hier gepostet hat mit dem bildfeld wo das pdf dann liegen soll.
Wie schafft man es den Seitenumbruch bei tabellen, so zu gestalten, daß auf der 2. Seite wieder der Tabellenkopf erscheint? Also nicht nur die Tabelle weiter geführt wird. Fest darstellen kann man es ja nicht in der Vorlage. Man weiß ja nie wie groß das übergebenen array ist.
let testKey := first(select Ninox).text(CarbonetestAPI);
let liveKey := first(select Ninox).text(CarboneAPI);
let myKey := testKey;
let auth := {
Authorization: myKey,
'Content-Type': "application/json",
'carbone-version': "3"
};
let myTemplate := "121003b89f7df5fxxxxxxxxxxxxxxx";
let vArray := [];
let vArrayObj := [];
let vObj := {};
for i in Untertabelle order by Nummer do
vObj := {
Position: text(i.Nummer),
Name: i.Name,
irgendwas: i.irgendwas
};
vArrayObj := [vObj];
vArray := array(vArray, vArrayObj)
end;
let vBody := {
data: {
vVorname: Vorname,
vName: Name,
vDatum: format(Datum, "DD.MM.YYYY"),
vTabelle: vArray
},
convertTo: "pdf",
reportName: Name + ".pdf"
};
body_Daten := text(vBody);
do as server
let response := http("POST", "https://render.carbone.io/render/" + myTemplate, auth, vBody);
'Response Carbone' := text(response.result);
RenderID := text(response.result.data.renderId)
end;
sleep(1000);
let myBild := "https://render.carbone.io/render/" + RenderID;
importFile(this, myBild, "carbone.pdf");
PDF := file(this, "carbone.pdf") -
... ich habe mich jetzt eine Weile nicht beteiligt, da mir momentan die Arbeit über den Kopf wächst... Ich weiß nicht, ob das vielleicht relevant ist, aber in meinem (funktionierenden) Script heißt der reportName im Body der Anfrage genauso, wie später das PDF im importFile script.
Das sollte zwar eigentlich egal sein, da man beim import ja einen neuen/anderen Namen vergeben kann .... aber wer weiß :)
-
It would be a good idea to share a model for those of us who do not have experience in this.
-
Umbruch bei
\n im Array
Ich habe eine Printtabelle wo die Einträge von mehreren dmfa zusammengefasst werden.
Schema: 1 Record mit den Feldern Gruppe (ist die Bezeichnung des DMFA) und ein Feld Bezeichnung (ist die Auswahl des DMFA) Bezeichnung ist dabei als Join() abgelegt.
Kann mir einer helfen, wie ich den Umbruch hinbekommen??
{d.vTabelle[i].Name:convCRLF:html\n<br> } Das geht nicht.
So soll es wieder aussehen.... War mal mit Leo´s Hilfe entstanden:
Das ist die Printtabelle:
-
{d.vTabelle[i].Name:convCRLF} passt
-
Wie bekommt man das Template hin ??? Es ist ja nur eine Tabelle vorhanden, diese wird aber nach jeder kompletten Kategorie über einen Seitenumbruch im neuen Absatz weiter geführt. Nur wie?????
Was ist im Template der angesprochene Seitenumbruch, welchen man den Wert true übergibt ?? Oder wie muss ich das gestalten??
So wie bei mir soll es eben nicht aussehen, jede Gruppe soll eigenständig abgebildet werden.
Find einfach nichts in der Hilfe von Carbone. (ist aus dem API Team / Carbone Template Upload / 'Untertabelle/Untertabelle' )
"/ / Untertabelle2-Array mit JSON-Object für jeden einzelnen Record erstellen / /"; function Modelle2(Untertabelle1ID : number) do let vArray1 := []; let vArrayObj1 := []; let vObj1 := {}; for i in Untertabelle1.Untertabelle2[Untertabelle1 = Untertabelle1ID] do vObj1 := { ModellType: i.Automodelle.Modell, 'vStückzahl': i.'Stückzahl', vProduziertIn: i.'Produziert in'.'File Original' }; vArrayObj1 := [vObj1]; vArray1 := array(vArray1, vArrayObj1) end; vArray1 end; "/ / Untertabelle1-Array mit JSON-Object für jeden einzelnen Record erstellen / /"; let vArray := []; let vArrayObj := []; let vObj := {}; for i in Untertabelle1 do vObj := { vMarke: i.Automarke.Marke, Modelle: Modelle2(number(i.Nr)) }; vArrayObj := [vObj]; vArray := array(vArray, vArrayObj) end; "// HTTP-Call definieren //"; let vBody := { data: { vVorname: Vorname, vName: Name, vBild: "Bild", vSeitenumbruch: true, Marke: vArray },
-
Danke dir Stefanie, hab es so gelöst, das ich zwei Tabellen anlege, wo aber in der zweiten Tabelle dann [i+1]enthalten ist. Das bringt mir einzelne Tabellen.
Hast du aber vielleicht eine Ahnung wie oder was der seitenumbruch im Skript auf dem Template bewirkt? Finde in der Doku nichts
vSeitenumbruch: true
Content aside
-
9
„Gefällt mir“ Klicks
- vor 1 JahrZuletzt aktiv
- 26Antworten
- 1074Ansichten
-
13
Folge bereits