Ciao a tutti!
Praticamente vorrei fare in modo di stampare qualsiasi cosa in pdf proveniente da una stampante di tipo PostScript.
Quindi:
- Creo una stampante virtuale di tipo postscript in modo che compaia tra quelle presenti nel sistema operativo client
- Il mio programma server VB.NET si connette alla porta 515 (porta della stampante) e riceve i dati inviati
- ed infine una volta ricevuti i dati crea il file postscript .ps e da quello genere il file .pdf
Ho creato il programma e funziona!! l'unico problema è quando invio i dati da un pc con sistema operativo mac... in questo caso mi restituisce la seguente eccezione:
Impossibile leggere dati dalla connessione del trasporto: Connessione in corso interrotta forzatamente dall'host remoto.
Quale può essere il problema??
Vi posto il codice:
Imports System.Net.Sockets
Imports System.Text
Imports System.IO
Imports System.Threading
Imports System.Net
Imports System.Printing
Public Class Form1
Dim DatiStampa As String
Dim DatiIntestazione
Dim SwitchDati As Boolean
Public Listener As New TcpListener(515)
Dim Client As TcpClient
Dim NetStr As NetworkStream
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Try
Listener.Start()
Dim serverThread As New Thread(New ThreadStart(AddressOf StartListen))
Control.CheckForIllegalCrossThreadCalls = False
serverThread.Start()
Catch ex As Exception
ex.StackTrace.ToString()
End Try
End Sub
Private Sub StartListen()
While True
Try
Client = Listener.AcceptTcpClient()
Client.NoDelay = True
'Inizializza lo stream
NetStr = Client.GetStream
Dati()
Catch ex As Exception
ex.StackTrace.ToString()
'If Listener.Start Then
'clientSocket.Close()
' End If
End Try
End While
End Sub
Public Sub Dati()
Dim dati As String
'For Each pq In ps.GetPrintQueues
While True
System.Windows.Forms.Application.DoEvents()
Try
If NetStr.CanRead And NetStr.CanWrite Then
'Legge Client.ReceiveBufferSize bytes a partire dal primo
'dallo stream e li deposita In Bytes
'se ci sono bytes nulli, non verranno contati
'di Default, Client.ReceiveBufferSize = 8129
Dim Bytes(Client.ReceiveBufferSize) As Byte
NetStr.Read(Bytes, 0, Bytes.Length)
Dim AppoggioSwitch As String
Dim mess(0) As Byte
'Trasforma i bytes ricevuti In stringa
dati = System.Text.Encoding.ASCII.GetString(Bytes)
If SwitchDati = False Then
Client.NoDelay = True
AppoggioSwitch = dati.Substring(1)
mess(0) = CByte(0)
NetStr.Write(mess, 0, mess.Length)
End If
DatiStampa = DatiStampa & dati
If dati.Contains("%%EOF") Then
mess(0) = CByte(0)
NetStr.Write(mess, 0, mess.Length)
Client.Close()
Dim PsStart As Long
PsStart = DatiStampa.IndexOf("%!PS")
Dim DatiS As String
DatiS = DatiStampa.Substring(PsStart)
Dim fs As FileStream
fs = New FileStream("c:\test2.ps", IO.FileMode.Append)
Dim s As New StreamWriter(fs)
s.WriteLine(DatiS)
s.Close()
Dim nomefile As String
nomefile = NFile()
gsapi.ConvertFile(nomefile)
System.IO.File.Delete("c:\test2.ps")
dati = Nothing
DatiStampa = ""
DatiIntestazione = ""
SwitchDati = False
System.Threading.Thread.Sleep(2000)
Exit While
If AppoggioSwitch = Chr(3) Then
SwitchDati = True
End If
End If
End If
Catch ex As Exception
ex.StackTrace.ToString()
End Try
End While
' Next
End Sub
Public Function NFile() As String
Dim num As Integer
Dim num2 As Integer
Dim nome As String
Dim n1 As Integer
Dim n2 As Integer
Dim dt As String
Dim nomefile As String
num = DatiStampa.IndexOf("%%Title:") + 8
num2 = (DatiStampa.IndexOf("%%Creator:")) - num
nome = DatiStampa.Substring(num, num2)
If nome.IndexOf(".") Then
nome = nome.Replace(".", "")
End If
nome = nome.Trim
n1 = DatiStampa.IndexOf("%%CreationDate:") + 15
n2 = (DatiStampa.IndexOf("%%For:")) - n1
dt = DatiStampa.Substring(n1, n2)
If dt.IndexOf("/") Or dt.IndexOf(":") Then
dt = dt.Replace("/", "-")
dt = dt.Replace(":", "-")
End If
dt = dt.Trim
nomefile = nome & "_" & dt
Return nomefile
End Function
End Class