PDF an Drucker senden

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
kunstlust
Beiträge: 259
Registriert: 12.04.2012 23:47
Wohnort: Hannover
Kontaktdaten:

PDF an Drucker senden

Beitrag von kunstlust »

Ich möchte gerne eine PDF an einen Drucker direkt senden. Ich habe so etwas schon mit Autoit gemacht und damit bisher keine Problem gehabt. Im Prinzip wir einfach auf den 9100 Port in File gesendet. Bei PB geht das aber nur mit PRN Daten, also eine Druckdatei welche umgeleitet worden ist. Mir scheint sowas wir als BIN zu senden und nicht als Asci der Fehler zu sein? Die PRN kommt richtig raus, die PDF nur mit einen zwei komischen Zeichen, oder gibt es noch eine andere Weg?

Code: Alles auswählen


If InitNetwork() = 0
  MessageRequester("Plan.tec.Gruppe Send An "+Chr(169), "Der Plotter ist nicht erreichbar", 0)
  End
EndIf
 drucker= OpenNetworkConnection("192.168.100.1",9100,#PB_Network_TCP)
 Delay(1000)
 
  SendNetworkFile(drucker,"c:\temp\test.pdf")
 Delay(1000)
  CloseNetworkConnection(plotter)

Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: PDF an Drucker senden

Beitrag von Kiffi »

Soll es Crossplattform sein? Wenn es nur für Windows ist, dann
zeig mal Dein AutoIt-Script.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
kunstlust
Beiträge: 259
Registriert: 12.04.2012 23:47
Wohnort: Hannover
Kontaktdaten:

Re: PDF an Drucker senden

Beitrag von kunstlust »

So hier der Code und nur Windows :D

Code: Alles auswählen


#CSIDL_SENDTO = $09
Zahl.b = CountProgramParameters()
FilePath.s = ProgramParameter()
ptsendoto.s = ProgramFilename()
sendto.s = GetSpecialFolderLocation(#CSIDL_SENDTO)
link.s = sendto.s + RemoveString(GetFilePart(ptsendoto.s),".exe") +".lnk"
prefs.s = GetPathPart(ptsendoto.s)+RemoveString(GetFilePart(ptsendoto.s),".exe")+".ini"


If FileSize(link.s)=-1 
  CreateShortcut(ptsendoto.s,link.s,"","","",#SW_SHOWMAXIMIZED,ptsendoto.s,0)
  
  End
  
EndIf

If FileSize(prefs.s)=-1 
  If OpenWindow(0, 0, 0, 180, 150, "Tools", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    IPAddressGadget(0, 10, 15, 160, 20)
    TextGadget(1, 10, 55, 160, 50,"Bitte tragen Sie hier Ihre IPAdresse des Plotters ein und beednen Sie das Tool. Danke", #PB_String_BorderLess)
    SetGadgetState(0, MakeIPAddress(0, 0, 0, 0))   ; wir setzen eine gültige IP-Adresse
    ButtonGadget  (2, 10, 120,160, 20, "Konfig erzeugen")
    Repeat
      Event = WaitWindowEvent()
      
      Select Event
          
        Case #PB_Event_Gadget
          Select EventGadget()
            Case 2 : CreatePreferences(prefs.s)
              PreferenceGroup("Plotter")
              WritePreferenceString("ip",IPString(GetGadgetState(0)))
              ClosePreferences()
              End
          EndSelect
      EndSelect
    Until Event = #PB_Event_CloseWindow
  EndIf
  
EndIf          
OpenPreferences(prefs.s)
PreferenceGroup("Plotter")
ip.s = ReadPreferenceString("ip", "0.0.0.0")
ClosePreferences()

If InitNetwork() = 0
  MessageRequester("Send An ", "Der Plotter ist nicht erreichbar", 0)
  End
EndIf


Dim daten.s(Zahl.b) 

If OpenWindow(0, 100, 100, 500, 200, "Send An "+Chr(169), #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
 ListIconGadget(0, 5, 5, 490, 140, "Folgen Daten wurden an die IP-Aadresse: "+ip.s+" gesendet", 380, #PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection)
For t = 0 To Zahl.b -1

  plotter = OpenNetworkConnection(ip.s,9100,#PB_Network_TCP)
 Delay(1000)
 
  senden = SendNetworkFile(plotter,ProgramParameter(t))
 Delay(1000)
  CloseNetworkConnection(plotter)

  AddGadgetItem(0, -1,GetFilePart(ProgramParameter(t))+Chr(10))
Next t

ButtonGadget  (1, 5, 175,490, 20, "Send An beenden")
ButtonGadget  (2, 5, 150,245, 20, "www.google.de besuchen")
 ButtonGadget  (3, 250, 150,245, 20, "Senden An Odner öffnen")
  Repeat
    Event = WaitWindowEvent()
    Select Event
            Case #PB_Event_Gadget
        Select EventGadget()
          Case 1 
            End   
          Case 2
            RunProgram("http:\\www.google.de")
            End
            Case 3
            RunProgram(GetSpecialFolderLocation(#CSIDL_SENDTO))
            End
          Case   0
            RunProgram("http:\\"+ip.s)
            End
            
        EndSelect
   
    EndSelect
  Until Event = #PB_Event_CloseWindow
EndIf

End

Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: PDF an Drucker senden

Beitrag von Kiffi »

nee, das AutoIt-Script wollte ich sehen. ;-)

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
kunstlust
Beiträge: 259
Registriert: 12.04.2012 23:47
Wohnort: Hannover
Kontaktdaten:

Re: PDF an Drucker senden

Beitrag von kunstlust »

Achso, das ist der gern des Scripts:

Code: Alles auswählen

dim $daten
If IsArray($cmdline) Then
For $t = 2 To $cmdline[0]
	TCPStartup()
	$socket = TCPConnect($IPAddress, 9100)
	$sInput = FileRead($cmdline[$t])
	$sInput = StringToBinary($sInput)
	TCPSend($socket, $sInput)
	If @error Then
	MsgBox(0,"Fehler","Es ist ein Fehler aufgetretten "&@error)
	Exit
	EndIf
	TCPCloseSocket($socket)
	ToolTip("Druckdaten "&$cmdline[$t]&" wurde an die IP "&$IPAddress&" versendet.",0,0)
	Sleep(3000)
Next
EndIf
Benutzeravatar
kunstlust
Beiträge: 259
Registriert: 12.04.2012 23:47
Wohnort: Hannover
Kontaktdaten:

Re: PDF an Drucker senden

Beitrag von kunstlust »

Ich habe mal das " PureBasic - Network (Server) example file" auf 9100 gestellt und eine 50MB PDF gesendet, kein Problem. Also muss das was mit dem Port und den Drucker zu tun haben, aber was macht Autoit anders?
Benutzeravatar
kunstlust
Beiträge: 259
Registriert: 12.04.2012 23:47
Wohnort: Hannover
Kontaktdaten:

Re: PDF an Drucker senden

Beitrag von kunstlust »

jetzt ahbe ich den Unterschied schon gefunden, senden ich mit dem AutoIT Script an das PB Server Sample, treffen die Daten als #PB_NetworkEvent_Data ein und bei PB als #PB_NetworkEvent_File.
Somit muss ich das File per SendNetworkData() übertragen, oder? Wie ermittel ich die Größe, damit der Puffer stimmt, das habe ich noch nicht so ganz verstanden? Kann ich das mit FileSize auslesen und so den Puffer setzen?
Benutzeravatar
Deluxe0321
Beiträge: 336
Registriert: 19.05.2006 00:31
Kontaktdaten:

Re: PDF an Drucker senden

Beitrag von Deluxe0321 »

Servus,
SendNetwokFile() sollte nur Purebasic intern verwendet werden.

Versuche mal das hier in deinem Code statt des "senden = SendNetworkFile(plotter,ProgrammParamter(t))" //code schnell runter getippt, nicht getestet!

Code: Alles auswählen

If plotter
  FileID.i = OpenFile(#PB_Any,ProgramParameter(t))
  If FileID.i
    *memory = AllocateMemory(FileSize(ProgramParameter(t)))
    If *memory
      ReadData(FileID.i,*memory,FileSize(ProgramParameter(t)))
      CloseFile(FileID.i)
    Else
      End
    EndIf
  EndIf
  Delay(1000)
  
  SendComplete.i = SendNetworkData(plotter,*memory,MemorySize(*memory))
  While (SendComplete.i < MemorySize(*memory))
    SendComplete.i + SendNetworkData(plotter,*memory + SendComplete.i,MemorySize(*memory) - SendComplete.i)
    If SendComplete.i >= MemorySize(*memory)
      Break  
    EndIf
  Wend
  
 EndIf
Ich habe keine Lösung, aber ich bewundere das Problem.
Benutzeravatar
kunstlust
Beiträge: 259
Registriert: 12.04.2012 23:47
Wohnort: Hannover
Kontaktdaten:

Re: PDF an Drucker senden

Beitrag von kunstlust »

Danke Deluxe0321 das sieht sehr gut aus :bounce:
Benutzeravatar
dige
Beiträge: 1239
Registriert: 08.09.2004 08:53

Re: PDF an Drucker senden

Beitrag von dige »

Deluxe0321 hat geschrieben:

Code: Alles auswählen

  SendComplete.i = SendNetworkData(plotter,*memory,MemorySize(*memory))
  While (SendComplete.i < MemorySize(*memory))
    SendComplete.i + SendNetworkData(plotter,*memory + SendComplete.i,MemorySize(*memory) - SendComplete.i)
    If SendComplete.i >= MemorySize(*memory)
      Break  
    EndIf
  Wend
Oha! Das habe ich noch nicht gewusst. Dachte der Befehl SendNetworkData() muss nur einmal zum kompletten
Übertragen der Daten aufgerufen werden, im Gegensatz zu ReceiveNetworkData() ...
Gut zu wissen! Danke Deluxe0321 :D
"Papa, ich laufe schneller - dann ist es nicht so weit."
Antworten