German PDF auf A4-Format

StephanP82

Member
Licensed User
Longtime User
Hallo zusammen,

ich poste im deutschen Forum, weil ich vermute, dass das A4-Format hauptsächlich im deutschsprachigen bzw. europäischem Raum verwendet wird.

Ich möchte ein im Webview angezeigtes Formular (per HTML geschrieben) als PDF-Datei speichern und drucken. In B4A war dazu nur "Webview.PrintHTML" nötig und das Formular landete im A4-Format auf dem Papier und passte sogar genau auf das Blatt.

Jetzt geht es um die Umsetzung in B4i, wo ich nun nicht einfach den HTML-Code zum drucken freigeben kann, sondern erst eine PDF-Datei erzeugen und dann per DocumentInteraction drucken kann. Nun entspricht die Bildschirmanzeige auf dem iPhone natürlich nicht dem A4-Format, weshalb ein Screenshot total verzerrt wird:
B4X:
Dim Snapshot As B4XView = WW_Webview
Dim BMP As Bitmap = Snapshot.Snapshot

Rect.Initialize(5, 20, 612, 792)
oCanvas.InitializePDF(File.DirDocuments, FileName, 612, 792) '<-- Sind diese Werte für A4 korrekt?
oCanvas.DrawBitmap(BMP, Rect)
oCanvas.Release
        
DocInteraction.Initialize("DocInteraction", File.DirDocuments, FileName)
DocInteraction.PreviewFile(Page1)

Das angezeigte Vorschaubild ist total verzerrt und nicht brauchbar. Weiß jemand Rat?
 

pucki

Active Member
Licensed User
Ich hab das zwar noch nie gemacht. Aber ich denke mal so als Ansatz wäre diese Vorgehensweise nicht schlecht.

https://www.b4x.com/android/forum/threads/printing-and-pdf-creation.76712/#content

Und da stehen im Code sogar die vermutlich richtigen Werte für A4 drin.

Einfach mal testen. Ist aber nur ein Hinweis. Ich selbst habe es noch nie gemacht. Aber immerhin sorgt dieser Text dafür das ich irgendwann erfahre wie es richtig geht.

Gruß

Pucki
 

StephanP82

Member
Licensed User
Longtime User
Hi pucki,

danke für deine Antwort. Leider ist der Link für B4A und lässt sich für B4i nicht anwenden. In B4A war das ganze auch wirklich einfach, da das Webview dort eine "eingebaute" Funktion namens PrintHTML hat, bei iOS ist es leider wesentlich komplizierter. Ich hab mir zwischenzeitlich so beholfen, dass ich die Anzeige im Webview auszoome und dann den Screenshot mache, doch war das leider auch nicht optimal, da man für verschiedene Bildschirmauflösungen auch jeweils andere Zoom-Stufen bräuchte. Der nächste Versuch war dann, einfach das dahinterliegende HTML zur Druckansicht etwas anzupassen, also die darin enthaltene Tabelle auf 100% Höhe zu setzen. Dies funktioniert grundsätzlich, aber die Schriftgröße bleibt dabei so klein wie vorher, weshalb ich da wahrscheinlich auch mit Prozent versuchen werde weiterzukommen. Wie du siehst, es ist leider sehr kompliziert, aber trotzdem bin ich froh, dass mir zumindest jemand geantwortet hat, deshalb nochmal danke :)
 

pucki

Active Member
Licensed User
hm.

Also ich ärgere mich nicht mehr mit so Sachen herum. Ich baue alle Seiten in einer bestimmten Größe auf, die mir gefällt. Dann berechne ich einen Faktor und lasse die Seite danach aufbauen. https://www.b4x.com/android/forum/threads/werte-im-designer-auslesen.105100/#post-658747 . In den Link habe ich gefragt, wie ich denn diese Routine (in VB für PC habe ich die mal entwickelt) hier umsetzen kann.

OK. Die ist für den Bildschirm. Aber ich denke man kann sie Problemlos für ALLE Arten von Ausgaben umschreiben. Da die Logik immer die selbe ist. Wenn du diese Routine in deine Bildschirm-Anzeige einbringst, dann bist du vor jeder Auflösung sicher.

Mann baut die Seite auf. Dieser Faktor ist immer 1. Nun fragt man die Größe der Ausgabe an. Bei ein Display halt wie viele Pixel das Teil kann. Bei einen Ausdruck das selbe.
Nun den Faktor (Das Verhältnis Design zu Ausdruck) errechnen, und ALLES = Höhe / Breite / Schriftgrösse etc. mit den Faktor mal nehmen.

Bei Schriften gibt es nur 2 Dinge zu beachten.
1. ) Man muss Truetype-Schriften nehmen, also skalierbare Schriften.
2.) Man muss die Neue Schriftgröße mit INTEGEN berechnen. Also z.b. alte_Schriftgrösse = 12 // Neue_schriftgrösse = int(alte_schriftgrösse * faktor)
Das ist dann zwar mathematisch nicht 100 % Design skaliert, aber viele Systeme mögen keine Schriftgrösse mit kommastelle.

Was nun deinen Ausdruck angeht. Erstelle eine Temporäre Druck-Datei (wie auch immer) , frag oder lege die Seitengrösse fest, berechne mit obriger Lösung die richtigen Daten und das war es.

Bei einen Ausdruck in VB brauche ich folgende Werte dafür.
1.) Standart-Zeilenhöhe = Bekomme ich wenn ich die Pixel abfrage die die vorher berechnete Font an Höhe braucht. = zh
2.) Y = Y- position des 1. Pixel das gedruckt werden soll. (bedruckbare Länge des Blattes = max-y)
3.) x = X - Position des 1. Pixel das gedruckt werden soll. (bedruckbare Breite des Blattes = max-x)
4.) Bei rechtsbündigen Druck muss ich vorher die Textbreite in Pixel abfragen und von Standart-x abziehen.

Ich denke das man das in B4* genauso macht. Danach übergibt man die Seite an das Ausgabe-Modul. Wobei das Ausgabe-modul der Druckertreiber ist, oder der PDF-Creator. Ich habe z.b. auf meine PAD für Canon extra ein Wlan-Druckertreiber (via APP-Store) installieren müssen, damit mein Tablett überhaupt mich drucken lässt.

Und ich kann mir bei besten Willen nicht vorstellen, das das andere anders ist. Sonst musst du ja wie zu DOS-Zeiten (das ist vor Windows) für jeden Drucker ein eigene Ansteuerung schreiben. Mit anderen Worten, such ein "Ausdruck-Seiten-Beschreibungscodierung". Die MUSS es geben. Selbst für so ein zickiges Fehlerhafte System wie I-OS.

Pucki ist froh das, das Ei-fon 3gs + sein Ei-pad 1 seine letzten Teile von den Eierei ist.:) 👿 :)

Wichtiger Hinweis : Um ein Absturz zu vermeiden, prüfe ob das Ausgabe-Objekt eine gewisse Mindestgröße kann. Sonst kommt noch einer auf die Idee und druckt eine a4-Seite auf einen Etikettendrucker. Beim PC ist die Mindestgröße der Bildschirmausgabe 640 * 480. Und die kleinste Schriftgrösse muss 6 sein. Ansonsten fange ich die Skalierung ab.

Gruß

Pucki

ps.: Ich hoffe ich konnte dir mit mein Vortrag ein paar Anregungen geben.
 

StephanP82

Member
Licensed User
Longtime User
Hi Pucki,

danke dir. Das Prinzip das du beschreibst verstehe ich. In meinem Fall muss ich dieses jetzt nur noch irgendwie in HTML/CSS umsetzen, weil es ja um die Skalierung der Seite auf die Größe des Webviews geht. In iOS habe ich keine Möglichkeit direkt zu sagen, "druck das HTML aus", wie es bei Android der Fall ist und muss deshalb versuchen, den Code der Seite so anzupassen, dass diese sich immer ihrer aktuellen Browsergröße anpasst. Dann mache ich sozusagen einen Screenshot vom Webview und übergebe diesen der Vorschau. Das Problem ist jetzt, dass ich von CSS ungefähr soviel Ahnung wie die Kuh vom Sonntag habe und die Seite deshalb bewusst in reinem HTML geschrieben hatte. Naja, nun werde ich mich wohl doch noch mit CSS auseinandersetzen müssen und versuchen, die Tabelle (Inhalt der Seite) so anzupassen, dass diese sich immer der Bildschirmgröße anpasst. Auf jeden Fall danke für deine Mühe.
 
Top