Seite 1 von 2
Genaues Drucken auf DIN A4
Verfasst: 19.08.2005 19:49
von Delle
Hallo,
irgendwie komm ich mit dem Druckbefehlen überhaupt nicht klar
Ich habe ein DIN A4 Blatt vorliegen auf das an x-beliebiger Stelle
ein 10x10 cm großes Bild gedruckt werden soll.
Das Bild wird vorher mit PB erstellt, aber was muss ich denn dann
überhaupt für eine Pixelgröße nehmen wenn es 10x10 cm (!) sein soll?
Die Drucker drucken ja mit unterschiedlicher Auflösung, mal 240 dpi,
mall 300 dpi, mal 600 dpi... bei 600 dpi müßte ich ja das Bild wesentlich
größer anlegen als bei 300 dpi... aber woher soll ich das vorher wissen? Und vor allem was für eine dpi-zahl der Drucker hat?
Das nächste Problem wäre dann die genau Positionierung des Bildes auf
dem DIN A4 Blatt bei z.b. links oben 10 cm vom Rand...
Verfasst: 19.08.2005 20:14
von DarkDragon
Hier sind 2 Prozeduren(Die im CodeArchiv stimmen nicht):
Code: Alles auswählen
Procedure xcm(x.f)
result = x * (PrinterPageWidth()/21) ; 21cm A4
ProcedureReturn result
EndProcedure
Procedure ycm(x.f)
result = x * (PrinterPageHeight()/29.7) ; 29,7cm A4
ProcedureReturn result
EndProcedure
Dann kannst du z.B. so Malen:
Code: Alles auswählen
StartDrawing(...)
Box(xcm(2), ycm(3), xcm(10), ycm(10), RGB(255, 0, 0)) ; Eine Box wird an der Stelle 2x3 cm in der Größe 10x10 cm gemalt(in Rot)
StopDrawing()
Allerdings muss dann die Drucker-Seite schon vorhanden sein.
Verfasst: 27.08.2005 18:35
von Delle
Code: Alles auswählen
If PrintRequester()
If StartPrinting("PureBasic Test")
If StartDrawing(PrinterOutput())
DrawingFont(LoadFont(0, "Arial", 30))
Locate(100, 100) : DrawText("PureBasic Printer Test")
DrawingFont(LoadFont(0, "Arial", 100))
Locate(100, 400) : DrawText("PureBasic Printer Test 2")
FrontColor(100,100,100)
Box(0, 0, 100, 100)
StopDrawing()
EndIf
StopPrinting()
EndIf
EndIf
Hm, die Box wird bei mir ca. 2 mm links/oben vom Rand gedruckt,
bei -5 (x+y) wird es zwar richtig an der Kante gedruckt, allerdings
oben hat es keinen Effekt.
Sind vermutlich die Werkseinstellungen an denen man
nichts ändern kann...
Wie kriegt man das nun hin, daß er egal auf welchem
Drucker ultragenau auf z.b. Etiketten gedruckt wird?
Man kann ja vom User nicht x-maliges Ausprobieren
und Justieren abverlangen...
Verfasst: 27.08.2005 18:46
von DarkDragon
Delle hat geschrieben:Code: Alles auswählen
If PrintRequester()
If StartPrinting("PureBasic Test")
If StartDrawing(PrinterOutput())
DrawingFont(LoadFont(0, "Arial", 30))
Locate(100, 100) : DrawText("PureBasic Printer Test")
DrawingFont(LoadFont(0, "Arial", 100))
Locate(100, 400) : DrawText("PureBasic Printer Test 2")
FrontColor(100,100,100)
Box(0, 0, 100, 100)
StopDrawing()
EndIf
StopPrinting()
EndIf
EndIf
Hm, die Box wird bei mir ca. 2 mm links/oben vom Rand gedruckt,
bei -5 (x+y) wird es zwar richtig an der Kante gedruckt, allerdings
oben hat es keinen Effekt.
Sind vermutlich die Werkseinstellungen an denen man
nichts ändern kann...
Wie kriegt man das nun hin, daß er egal auf welchem
Drucker ultragenau auf z.b. Etiketten gedruckt wird?
Man kann ja vom User nicht x-maliges Ausprobieren
und Justieren abverlangen...
Ja ähh, hast du meinen Code überhaupt mal ausprobiert? Oder werde ich einfach ignoriert?

Du hast keine meiner Prozeduren in deinem Code.
[EDIT]
Achso, du meinst, dass du den Papiereinzug so steuerst, dass das Papier garnicht verrutscht und etwas geneigt ist(nanometer genau)?
Verfasst: 27.08.2005 19:53
von Delle
Deinen Code brauch ich erstmal nicht, weil wenn es nicht 100% funzt, hakt ich die Sache he ab
Ich will z.B. einen 10x5 cm großes Etikett bedrucken, welches
auf dem an Position 5cm oben und 5 cm links soll.
Wenn nun bei jedem Drucker die Randeinstellung werksseitig
anders ist, landet das Gedruckte nicht genau auf dem Etikett.
Muss nich nanogenau sein, aber halbwegs millimetergenau
Übrigens würd mich mal interessieren, wie er die Box bei Dir ausdruckt...
Verfasst: 27.08.2005 20:28
von DarkDragon
Delle hat geschrieben:Übrigens würd mich mal interessieren, wie er die Box bei Dir ausdruckt...
Welche? Deine oder meine

?
Ich kanns grad nicht testen, da mein anderer Computer wo der Drucker dran hängt Ewigkeiten braucht zum hochfahren(bzw. um das WLAN Steuerprogram zu starten, das verzweifelt nach "?!?\C:\...\default.ini" sucht) und sich das heut nichtmehr rentiert(muss gleich ins Bett).
Verfasst: 19.10.2006 17:43
von hiltwin
Code: Alles auswählen
If PrintRequester()
If StartPrinting("PureBasic Test")
If StartDrawing(PrinterOutput())
DrawingFont(LoadFont(0, "Arial", 30))
Locate(100, 100) : DrawText("PureBasic Printer Test")
DrawingFont(LoadFont(0, "Arial", 100))
Locate(100, 400) : DrawText("PureBasic Printer Test 2")
FrontColor(100,100,100)
Box(0, 0, 100, 100)
StopDrawing()
EndIf
StopPrinting()
EndIf
EndIf
Ich weiss nicht, ob ich es hier her habe, das ....
... ist aber letztlich auch egal - jedenfalls bei meiner Umstellung von 3.93 auf 4.00 meckerts nun mit folgender Fehlermeldung:
Code: Alles auswählen
[ERROR] LoadFont() can´t be called inside a StartDrawing()/StopDrawing() block.
Ich meine, obiger Befehl war so schon in der Hilfe von 3.93 nicht aufgeführt, aber was der nicht so Kundige sieht und funktioniert, nimmt er ja erstmal. Nun gehts allerdings nicht mehr
Hat jemand eine Idee, damit ich nicht den ganzen Code neu schreiben muss?
Ansonsten, gibt es ein gutes Tutorial für das Kapitel Drucken?
Frdl. Gruss
Hiltwin
Verfasst: 19.10.2006 19:07
von Falko
Die Fehlermeldung sagt dir auch genau, welche Funktion nicht innerhalb
des StartDrawing-Blocks stehen darf. Also musst du das LoadFont()
wie hier separieren.
Du kannst auch die automatische Fontid erzeugen, wenn du #PbAny
benutzt.
Code: Alles auswählen
; Zu PB4.0
If PrintRequester()
If LoadFont(0, "Arial", 30) And LoadFont(1, "Verdana", 40)
If StartPrinting("PureBasic Test")
If StartDrawing(PrinterOutput())
DrawingFont(FontID(0))
DrawText(100,100,"PureBasic Printer Test")
DrawingFont(FontID(1))
DrawText(100,400,"PureBasic Printer Test 2")
FrontColor(RGB(100,100,100))
Box(0, 0, 100, 100)
StopDrawing()
EndIf
StopPrinting()
EndIf
EndIf
EndIf
Gruß Falko
Danke ...
Verfasst: 19.10.2006 19:34
von hiltwin
.... Falko für die schnelle Antwort!
Na, da hätt ich ja auch eigentlich doch selber auch über die neue Hilfe darauf kommen können!
Läuft jetzt auch wieder.
Nun hab ich festgestellt, dass ich meine Druckroutine so geschrieben habe, dass diese bei 144 dpi des Druckers die DIN-A4 Seite ganz füllt.
Ist der Code (nicht obiger!) irgendwie zu retten, aufzupeppen, damit das so an den Drucker geht, dass das allgemeingültig unabhängig der dpi-Zahl des Druckers permanent auf DIN A4 darstellbar ist?
Frdl. Gruss
Hiltwin
P.S.:
Folgendes fällt mir dabei auch auf:
Vorher konnte ich ja mit
Code: Alles auswählen
; DrawingFont(LoadFont(0, "Arial", 24, #PB_Font_Bold))
jeweils direkt die Grösse bestimmen und musste letztlich nur einmal Font 0 laden, nun muss ich aber
für jede Schriftgrösse einen eigenen Font laden. Ist das so gewollt, oder gehts auch anders?
Verfasst: 19.10.2006 21:46
von Thorsten1867
Habe mich für mein Programm damals viel mit genauen Ausdrucken beschäftigt und irgendwann frustriert aufgegeben. Das einzig wahre ist PDF (PurePDF), wenn es um Genauigkeit geht.