Genaues Drucken auf DIN A4

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

Genaues Drucken auf DIN A4

Beitrag 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...
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

Beitrag 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...
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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? :freak: 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)?
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

Beitrag 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...
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Delle hat geschrieben:Übrigens würd mich mal interessieren, wie er die Box bei Dir ausdruckt...
Welche? Deine oder meine :lol: ?

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).
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
hiltwin
Beiträge: 311
Registriert: 06.10.2005 11:08
Wohnort: D-31177 Harsum
Kontaktdaten:

Beitrag 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 ....

Code: Alles auswählen

      DrawingFont(LoadFont(0, "Arial", 30))
... 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 :freak:

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
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag 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
Bild
Win11 Pro 64-Bit, PB_6.11b1
hiltwin
Beiträge: 311
Registriert: 06.10.2005 11:08
Wohnort: D-31177 Harsum
Kontaktdaten:

Danke ...

Beitrag 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

Code: Alles auswählen

      LoadFont(0, "Arial", 14)      
      LoadFont(1, "Arial", 24)      
für jede Schriftgrösse einen eigenen Font laden. Ist das so gewollt, oder gehts auch anders?
Benutzeravatar
Thorsten1867
Beiträge: 1360
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Beitrag 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.
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Antworten