elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: Deseas probar algunas mejoras a la interfaz del foro? Prueba cake! acerca de


  Mostrar Mensajes
Páginas: 1 2 3 4 5 6 7 8 9 [10] 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 ... 1083
91  Programación / .NET / [SOURCE-CODE] FHM Crawler - freehardmusic.com en: 2 Abril 2018, 17:24
FHM Crawler

Este tipo de programa se suele conocer como web-crawler o web-spider.

FHM Crawler es un simple programa para recolectar los enlaces de descarga del sitio web http://freehardmusic.com/,
el cual posee una base de datos gigantesca de álbumes de Rock y subgéneros.



Antes de seguir, me gustaría aclarar una cosa para los criticones y usuarios interesados en analizar el código fuente:

Si ven las imágenes del programa aquí abajo, se puede apreciar a simple vista que no me he esmerado más que lo justo y necesario en el diseño de la interfaz gráfica,
la disposición de los controles en la interfaz de usuario es fea, varias funcionalidades se podrían integrar a través de un menú contextual en el control ListView,
esto es como es, por que la intención fue crear una interfaz muy simple con el único objetivo de demostrar el uso del algoritmo-crawler que he desarrollado para esta página web. Esto lo hice para ustedes, no para mi, así que no me esmeré en la UI; y por ese mismo motivo también, esta será la única release que publicaré de este programa.

Además, a diferencia de como siempre hago cuando comparto un código fuente, en esta ocasión el código fuente lo comparto sin documentar (excepto la parte de mi librería comercial ElektroKit), esto tiene una sencilla razón, y es que solo desarrollé este algoritmo para utilizarlo una única vez y olvidarme de él para siempre (aun así, es un algoritmo robusto al menos en principio), así que no invertí esfuerzo en escribir documentación XML, pero creo que el código es lo suficientemente sencillo como para entenderlo por si mismo.

Por último, cabría mencionar que la aplicación hace uso de la conocida librería de terceros HtmlagilityPack para simplificar el parsing/análisis de datos del código fuente de la página web.



Imágenes









Vídeo




Descarga


Saludos!
92  Foros Generales / Foro Libre / Re: ¿Estoy echo un hacha o no? jeje en: 29 Marzo 2018, 12:27
+1 a todo lo que sea NFS de la vieja escuela. Lo cierto es que los NFS de ahora (los de los últimos 10 años hasta ahora) apestan. El último que jugué fue el NFS Payback hace poquito y... ñeh, es que a mi un NFS con "checkpoints" no me acaba de convencer, así que dos horas de vida le di hasta que lo tiré a la papelera de reciclaje. El NFS de la PS4 parece ser de los más realistas y, aunque ese juego no lo he catado pero también tiene una especie de checkpoints, así que... en fin.

Por ponerle alguna pega a los videos: estaría bien que fuesen comentados.

Saludos!
93  Programación / .NET / Re: Cifrar variables o textos de forma sencilla. en: 29 Marzo 2018, 09:25
Puedes usar la clase SecureString para asignar un string mediante el cifrado en un bloque de memoria no administrada, pero no se si esa solución se ajustará a las necesidades que tengas:

+

no se muy bien lo que quieres conseguir, y tampoco soy un experto en cifrado ni obfuscación avanzada, pero no veo que quieres conseguir mediante XOR para ocultar un string en el código IL...

Yo creo que el compañero @KuBoX debe tener buena idea sobre estos temas, a ver si se deja ver por aquí...

Saludos
94  Programación / .NET / Re: SevenZip Acceso Denegado en: 29 Marzo 2018, 08:27
el unico detalle es q no crea un subdirectorio y complica un poco las cosas por que esparece los archivos por donde esta, este detalle si seria bueno que me indicaras por que ni idea y eso que busque...

disculpa pero no comprendo muy bien esto a que te refieres con: "esparece los archivos por donde esta"

Antes de iniciar la operación de compresión, siempre puedes crear tú el subdirectorio de destino con el método que te indiqué: Directory.CreateDirectory(), ¿eso no te sirve para solucionar el problema que tengas?.

95  Programación / .NET / Re: SevenZip Acceso Denegado en: 29 Marzo 2018, 07:57
eh estado trabajando con la libreria SevenZip

No existe ninguna librería para .NET que se llame así, el nombre al que te refieres en realidad es SevenZipSharp, un wrapper de la librería de SevenZip (C/C++).

y me ah resultado tremenda

Bueno, a modo de advertencia te digo: deberías tener en cuenta que estás utilizando una librería obsoleta, siendo la última actualización del año 2012, y aparte, por experiencia en su utilización durante varios años (dejé de usarla hace ya tiempo) te puedo decir que esa librería está llena de bugs conocidos que nunca fueron corregidos por el autor, y limitaciones/características que no son del todo soportadas.

De todas formas siempre es mucho mejor recurrir a la libreria de SevenZipSharp que ponerse a desarrollar un algoritmo de compresión basado en la ejecución de 7zip.exe, pero mejor todavía sería que implementases tu propio wrapper de la librería 7zip.dll para cumplir tus necesidades (puedes tomar como ejemplo todo el P/Invoking de la librería de SevenZipSharp ).

Para operaciones de compresión muy puntuales siempre viene bien SevenZipSharp, cumple su función, al igual que lo hace la librería DotNetZip, pero si buscas algo más actualizado y desarrollado por grandes programadores (los mismos que desarrollaron la IDE 'SharpDevelop') entonces quizás quieras plantearte olvidar esas librerías y empezar a utilizar SharpZipLib en su lugar: https://github.com/icsharpcode/SharpZipLib



Con respecto al error que tienes, si por el nombre de la propiedad "directorioComprimidos" debemos asumir que a dicha propiedad le estás asignando la ruta de un directorio (ej. "C:\") entonces creo que es algo evidente donde, cual, y por qué motivo estás teniendo un error...

Citar
Código
  1. File.Create(Settings.Default.directorioComprimidos)

El método File.Create(), como su propio nombre indica por si mismo tiene el propósito de crear archivos, no directorios; para eso utiliza el método Directory.Create(). Cuando le pasas la ruta de un directorio existente al método File.Create(), salta la misma excepción que ya has mencionado.

Aparte de eso, en el código original que has mostrado, el método CompressDirectory() tiene especificado como segundo argumento un nombre de archivo, un argumento de tipo string:
Citar
Código
  1. tmp.CompressDirectory(folderToZip, @"test.7z");

sin embargo, tú le estás intentando pasar un stream como argumento:
Citar
Código
  1. tmp.CompressDirectory(folderToZip, File.Create(Settings.Default.directorioComprimidos));
(y además, aparte de eso, como ya habiamos explicado, aparentemente intentas pasarle la ruta de un directorio al método File.Create)

Si eso que estás intentando hacer no te genera un error en tiempo de compilación entonces perfecto, significará que existe una sobrecarga del método CompressDirectory la cual si acepta un stream como argumento, yo hace mucho que no utilizo SevenZipSharp así que ahora mismo no recuerdo ese detalle, pero sin embargo sigue habiendo un problema de todas formas, y es que no te estás asegurando de liberar el stream, y eso es malo, muy malo, por que te estarías dejando abierto el controlador del archivo que creases, y con ello te estarías auto-impidiendo el acceso de lectura y escritura a ese archivo en tu propia aplicación... ya que no te guardas la referencia en ningún lado para poder manipular el stream.

para evitar que eso suceda, debes utilizar la directiva using:
Código
  1. // ...
  2. using (FileStream fs = File.Create(@"C:\File.7z")) {
  3.    tmp.CompressDirectory(folderToZip, fs);
  4. }
  5. // ...

...o en su defecto llamar al método FileStream.Close() en la referencia del objeto devuelto:
Código
  1. FileStream fs = File.Create(@"C:\File.bin");
  2. tmp.CompressDirectory(folderToZip, fs);
  3. fs.Close();

Por último déjame darte un consejo general: cuando trabajes con clases que no hayas usado antes, o clases con las que no tengas mucha experiencia, comprueba siempre si expone un método con nombre 'Close' o 'Dispose', y si lo tiene entonces sigue el ejemplo de uso que te acabo de indicar, ya que se trata de una clase que implementa la interfáz IDisposable, y esto significa que la instancia de dicha clase genera recursos no administrados que deben liberarse (aunque no todas las clases que implementan IDisposable requieren estrictamente que llames al méttodo Dispose, pero mejor hacerlo), de lo contrario ocurren problemas, en algunas ocasiones son problemas graves (como este, no liberar el handle/controlador de un archivo), y en otras ocasiones causan "simples" fugas de memoria...

Saludos!
96  Programación / .NET / Re: Librería de Snippets para VB.Net !! (Compartan aquí sus snippets) en: 29 Marzo 2018, 04:27
¿Cómo determinar el porcentaje de escala de grises (a.k.a Grayscale ) en una imagen?

El siguiente algoritmo sirve para determinar el porcentaje de presencia de escala de grises en una imagen, y con ese pocertaje el programador puede tener la libertad de considerar si la imagen es en escala de grises o no lo es; por ejemplo si una imagen de 256x256px de compone de un 80% de píxeles con color en escala de grises (es decir ROJO = VERDE = AZUL), quizás queramos tratar ese tipo de imagen como una imagen en escala de grises, aunque solo lo sea parcialmente.

La necesidad de usar esta metodología basada en porcentajes tiene un buen motivo, y es que cualquier imagen desaturada probablemente la querramos considerar como una imagen en escala de grises, aunque por definición no lo sea, como por ejemplo estas imagenes de aquí abajo las cuales NO son en escala de grises (la paleta entera de colores)...





son imágenes desaturadas pero probablemente ese tipo de imágenes las querramos considerar como escala de grises en muchos escenarios para diferenciarlas del resto de imágenes...¿verdad?, es por ello que este tipo de metodología me pareció más útil y versatil para necesidades generales, aunque obviamente es un procedmiento más lento que otros al tener que analizar pixel por pixel para calcular un porcentaje de presencia de píxeles en escala de grises...

En fin, aquí abajo os dejo el código, pero debo avisar de que todavía NO está del todo acabado ni perfeccionado, me falta refactorizarlo y arreglar algunas pequeñas cosas, como por ejemplo aumentar la compatibilidad de formatos, analizar los píxeles del padding del stride ( https://msdn.microsoft.com/en-us/library/windows/desktop/aa473780(v=vs.85).aspx ), y tener en cuenta imágenes GIF con múltiples dimensiones (que no frames). Pero por el momento este código es algo que funciona bien para obtener los resultados esperados dentro de un margen de error aceptable, así que es una solución más que suficiente para los escenarios más simples y comunes.

EDITO: código mejorado
Código
  1. ''' ----------------------------------------------------------------------------------------------------
  2. ''' <summary>
  3. ''' Analyzes each pixel of the spcified image, counts all the pixels that are within the grayscale RGB range,
  4. ''' then calculates a percentage of the total grayscale presence in the image.
  5. ''' </summary>
  6. ''' ----------------------------------------------------------------------------------------------------
  7. ''' <example> This is a code example.
  8. ''' <code>
  9. ''' For Each file As FileInfo In New DirectoryInfo("C:\Images").EnumerateFiles("*.gif", SearchOption.TopDirectoryOnly)
  10. '''
  11. '''     Using img As Image = Image.FromFile(file.FullName)
  12. '''         Dim percent As Double = GetGrayScalePixelPercentOfImage(img)
  13. '''         Dim strFormat As String = String.Format("[{0,6:F2} %]: {1}", percent, file.Name)
  14. '''
  15. '''         Console.WriteLine(strFormat)
  16. '''     End Using
  17. '''
  18. ''' Next file
  19. ''' </code>
  20. ''' </example>
  21. ''' ----------------------------------------------------------------------------------------------------
  22. ''' <param name="img">
  23. ''' The source image.
  24. ''' </param>
  25. ''' ----------------------------------------------------------------------------------------------------
  26. ''' <returns>
  27. ''' The resulting percentage of grayscale pixels in the source image.
  28. ''' </returns>
  29. ''' ----------------------------------------------------------------------------------------------------
  30. <DebuggerStepThrough>
  31. Public Shared Function GetGrayScalePixelPercentOfImage(ByVal img As Image) As Double
  32.    Return GetGrayScalePixelPercentOfImage(img, dimensionIndex:=0)
  33. End Function
  34.  
  35. ''' ----------------------------------------------------------------------------------------------------
  36. ''' <summary>
  37. ''' Analyzes each pixel of the spcified image, counts all the pixels that are within the grayscale RGB range,
  38. ''' then calculates a percentage of the total grayscale presence in the image.
  39. ''' </summary>
  40. ''' ----------------------------------------------------------------------------------------------------
  41. ''' <example> This is a code example.
  42. ''' <code>
  43. ''' For Each file As FileInfo In New DirectoryInfo("C:\Images").EnumerateFiles("*.gif", SearchOption.TopDirectoryOnly)
  44. '''
  45. '''     Using img As Image = Image.FromFile(file.FullName)
  46. '''         Dim percent As Double = GetGrayScalePixelPercentOfImage(img, dimensionIndex:=0)
  47. '''         Dim strFormat As String = String.Format("[{0,6:F2} %]: {1}", percent, file.Name)
  48. '''
  49. '''         Console.WriteLine(strFormat)
  50. '''     End Using
  51. '''
  52. ''' Next file
  53. ''' </code>
  54. ''' </example>
  55. ''' ----------------------------------------------------------------------------------------------------
  56. ''' <param name="img">
  57. ''' The source image.
  58. ''' </param>
  59. ''' ----------------------------------------------------------------------------------------------------
  60. ''' <returns>
  61. ''' The resulting percentage of grayscale pixels in the source image.
  62. ''' </returns>
  63. ''' ----------------------------------------------------------------------------------------------------
  64. <DebuggerStepThrough>
  65. Public Shared Function GetGrayScalePixelPercentOfImage(ByVal img As Image, ByVal dimensionIndex As Integer) As Double
  66.  
  67.    Select Case img.PixelFormat
  68.  
  69.        Case Imaging.PixelFormat.Format16bppGrayScale
  70.            Return 100.0R
  71.  
  72.        Case Else
  73.            Dim bmp As Bitmap = DirectCast(img, Bitmap)
  74.  
  75.            Dim pixelFormat As Imaging.PixelFormat = Imaging.PixelFormat.Format32bppArgb
  76.            Dim bytesPerPixel As Integer = 4 ' PixelFormat.Format32bppArgb
  77.            Dim pixelCount As Integer = (bmp.Width * bmp.Height)
  78.  
  79.            Dim framesGrayscalePercents As New List(Of Double)
  80.  
  81.            Dim dimensionCount As Integer = bmp.FrameDimensionsList.Count
  82.            If (dimensionIndex > (dimensionCount - 1))Then
  83.                Throw New IndexOutOfRangeException("The specified 'dimensionIndex' value is greater than the dimension count in the source image.")
  84.            End If
  85.  
  86.            Dim frameDimension As New FrameDimension(bmp.FrameDimensionsList(dimensionIndex))
  87.            Dim frameCount As Integer = bmp.GetFrameCount(frameDimension)
  88.  
  89.            For frameIndex As Integer = 0 To (frameCount - 1)
  90.  
  91.                bmp.SelectActiveFrame(frameDimension, frameIndex)
  92.  
  93.                ' Lock the bitmap bits.
  94.                Dim rect As New Rectangle(Point.Empty, bmp.Size)
  95.                Dim bmpData As BitmapData = bmp.LockBits(rect, ImageLockMode.ReadOnly, pixelFormat)
  96.  
  97.                ' Get the address of the first row.
  98.                Dim address As IntPtr = bmpData.Scan0
  99.  
  100.                ' Declare an array to hold the bytes of the bitmap.
  101.                Dim numBytes As Integer = (Math.Abs(bmpData.Stride) * rect.Height)
  102.                Dim rawImageData As Byte() = New Byte(numBytes - 1) {}
  103.  
  104.                ' Copy the RGB values into the array.
  105.                Marshal.Copy(address, rawImageData, 0, numBytes)
  106.  
  107.                ' Unlock the bitmap bits.
  108.                bmp.UnlockBits(bmpData)
  109.  
  110.                ' Iterate the pixels.
  111.                Dim grayscalePixelCount As Long ' of current frame.
  112.                For i As Integer = 0 To (rawImageData.Length - bytesPerPixel) Step bytesPerPixel
  113.  
  114.                    ' Dim alpha As Byte = rawImageData(i + 3)
  115.                    Dim red As Byte = rawImageData(i + 2)
  116.                    Dim green As Byte = rawImageData(i + 1)
  117.                    Dim blue As Byte = rawImageData(i)
  118.  
  119.                    If (red = green) AndAlso (green = blue) AndAlso (blue = red) Then
  120.                        grayscalePixelCount += 1
  121.                    End If
  122.  
  123.                Next i
  124.  
  125.                Dim frameGrayscalePercent As Double = ((grayscalePixelCount / pixelCount) * 100)
  126.                framesGrayscalePercents.Add(frameGrayscalePercent)
  127.  
  128.                grayscalePixelCount = 0
  129.            Next frameIndex
  130.  
  131.            Return (framesGrayscalePercents.Sum() / frameCount)
  132.  
  133.    End Select
  134.  
  135. End Function

Ejemplo de uso:
Código
  1. For Each file As FileInfo In New DirectoryInfo("C:\Images").EnumerateFiles("*.gif", SearchOption.TopDirectoryOnly)
  2.  
  3.    Using img As Image = Image.FromFile(file.FullName)
  4.        Dim percent As Double = GetGrayScalePixelPercentOfImage(img)
  5.        Dim strFormat As String = String.Format("[{0,6:F2} %]: {1}", percent, file.Name)
  6.  
  7.        Console.WriteLine(strFormat)
  8.    End Using
  9.  
  10. Next file

Salida de ejecución:
Cita de: Visual Studio
Código:
...
[100.00%]: 3066279034_22e5cf9106_o.gif
[  0.00%]: 32.gif
[  3.30%]: 3680650203a3998289_f47a.gif
[  8.11%]: 3Gg9L8.gif
[100.00%]: 3mp3z4riv4.gif
[  1.14%]: 4291d5bb0f6574cdd24dfbf8962f2f28-p1.gif
[  2.22%]: 4e3149ff0114b_af0234434ffb9e48ce1edc3af6ce1a2c.gif
[ 13.42%]: 4e4d24314abf8_d4acae20ee9fe20f019927b098a8e8e6.gif
[ 28.13%]: 4e7b20c8d03fc_e93059b97d764b1681534f714c318ba7.gif
[  4.43%]: 4e92c46d124de_aa5135da3b32b8eee8a80aa2a2550f5d.gif
[  0.68%]: 5055.gif
[100.00%]: 506c602fd749e_a2c439e67bf77d03ba94a914d8927f4a.gif
[100.00%]: 511d0b2580b20_abd567e0d431dd00bb7bc162eb4d171c.gif
[  2.34%]: 520374123e3d3_285a501b39852024a053090a304647ca.gif
[  2.74%]: 543ea44def8f2_a3e09112b3710ce306ddf167991604e1.gif
...





¿Cómo determinar si una imagen está en escala de grises?

Si buscan una solución más sofisticada que la mia hecha en WinForms, recomiendo encarecidamente usar este código en WPF:


Su solución y la mia tienen distintos objetivos aunque a priori parezcan "lo mismo", su solución tiene como propósito determinar si una imagen es en escala de grises por definición, mientras que la mia lo que hace es determinar el porcentaje de presencia de píxeles en escala de grises de una imagen, y por ello su solución devolverá resultados "inesperados" según el tipo de imagen (imagen en blanco y negro, en colores vivos, escala de grises, o simples imagenes desaturadas), pero eso no quita que su solución sea EXCELENTE, de hecho, es mucho mejor que mi solución en el caso de que no deseamos considerar imágenes desaturadas como escala de grises sino que solo queramos trabajar con imágenes en escala de grises por definición técnica.

Saludos!
97  Programación / .NET / Re: Imprimir una hoja con C# en: 28 Marzo 2018, 16:41
¿Es posible hacer en modo consola o tiene que ser si o si con Windows Form?

Tanto en tu código como en el del ejemplo de MSDN faltaría por declarar el método 'pd_PrintPage' que controla el evento 'PrintDocument.PrintPage' para poder controlar la impresión de la página (la fuente de texto, tamaño, color, márgenes, etcétera):
Citar
Código
  1. pd.PrintPage += new PrintPageEventHandler(pd_PrintPage);
...de lo contrario no haces nada.

Aquí tienes una solución reusable, adaptable, y muy sencilla de usar:

para saber como usar la clase, mira el ejemplo del 'modo de empleo' que escribí debajo de la clase PrintDocumentBasic en ese mmismo post.
no hace falta mencionar que puedes usar cualquier conversor de código VB.NET a C# para convertir la clase PrintDocumentBasic.

PD: recuerda que también puedes imprimir documentos con la librería de clases de WPF, lo cual sería mucho más sofisticado que usar los miembros de GDI+.

Saludos.
98  Programación / .NET / Re: Librería de Snippets para VB.Net !! (Compartan aquí sus snippets) en: 28 Marzo 2018, 16:31
¿Cómo imprimir documentos de texto de forma sencilla?.

He hecho dos versiones, una básica, y la otra avanzada.

PrintDocumentBasic
Código
  1. ''' ----------------------------------------------------------------------------------------------------
  2. ''' <summary>
  3. ''' Prints a text document.
  4. ''' </summary>
  5. ''' ----------------------------------------------------------------------------------------------------
  6. ''' <seealso cref="IDisposable" />
  7. ''' ----------------------------------------------------------------------------------------------------
  8. Public Class PrintDocumentBasic : Implements IDisposable
  9.  
  10. #Region " Private Fields "
  11.  
  12.    ''' ----------------------------------------------------------------------------------------------------
  13.    ''' <summary>
  14.    ''' A <see cref="StreamReader"/> instance that encapsulates the document data to be read and printed.
  15.    ''' </summary>
  16.    ''' ----------------------------------------------------------------------------------------------------
  17.    Protected documentStream As StreamReader
  18.  
  19.    ''' ----------------------------------------------------------------------------------------------------
  20.    ''' <summary>
  21.    ''' The <see cref="System.Drawing.Printing.PrintDocument"/> component to print the document.
  22.    ''' </summary>
  23.    ''' ----------------------------------------------------------------------------------------------------
  24.    Protected WithEvents PrintDocument As PrintDocument
  25.  
  26.    ''' ----------------------------------------------------------------------------------------------------
  27.    ''' <summary>
  28.    ''' The <see cref="System.Drawing.Printing.PrinterSettings"/> instance that specifies
  29.    ''' information about how a document is printed, including the printer that prints it.
  30.    ''' </summary>
  31.    ''' ----------------------------------------------------------------------------------------------------
  32.    Protected PrinterSettings As PrinterSettings
  33.  
  34. #End Region
  35.  
  36. #Region " Properties "
  37.  
  38.    ''' ----------------------------------------------------------------------------------------------------
  39.    ''' <summary>
  40.    ''' Gets the document file path.
  41.    ''' </summary>
  42.    ''' ----------------------------------------------------------------------------------------------------
  43.    ''' <value>
  44.    ''' The document file path.
  45.    ''' </value>
  46.    ''' ----------------------------------------------------------------------------------------------------
  47.    Public ReadOnly Property Filepath As String
  48.  
  49.    ''' ----------------------------------------------------------------------------------------------------
  50.    ''' <summary>
  51.    ''' Gets or sets the text encoding.
  52.    ''' <para></para>
  53.    ''' If no encoding is specified, the default system encoding will be used.
  54.    ''' </summary>
  55.    ''' ----------------------------------------------------------------------------------------------------
  56.    ''' <value>
  57.    ''' The text encoding.
  58.    ''' </value>
  59.    ''' ----------------------------------------------------------------------------------------------------
  60.    Public Property Encoding As Encoding
  61.  
  62.    ''' ----------------------------------------------------------------------------------------------------
  63.    ''' <summary>
  64.    ''' Gets or sets the name of the printer device.
  65.    ''' <para></para>
  66.    ''' If no printer name is specified, the default printer device will be used.
  67.    ''' </summary>
  68.    ''' ----------------------------------------------------------------------------------------------------
  69.    ''' <value>
  70.    ''' The name of the printer device.
  71.    ''' </value>
  72.    ''' ----------------------------------------------------------------------------------------------------
  73.    Public Property PrinterName As String
  74.        Get
  75.            Return Me.printerNameB
  76.        End Get
  77.        Set(ByVal value As String)
  78.            If Not String.IsNullOrEmpty(value) Then
  79.                Me.PrinterSettings.PrinterName = Me.PrinterName
  80.            Else
  81.                ' Reset the 'PrinterSettings.PrinterName' property to avoid 'PrinterSettings.IsValid' return False.
  82.                Me.PrinterSettings = New PrinterSettings()
  83.            End If
  84.        End Set
  85.    End Property
  86.    ''' ----------------------------------------------------------------------------------------------------
  87.    ''' <summary>
  88.    ''' ( Backing Field )
  89.    ''' <para></para>
  90.    ''' The name of the printer device.
  91.    ''' </summary>
  92.    ''' ----------------------------------------------------------------------------------------------------
  93.    Private printerNameB As String
  94.  
  95.    ''' ----------------------------------------------------------------------------------------------------
  96.    ''' <summary>
  97.    ''' Gets or sets the text font.
  98.    ''' <para></para>
  99.    ''' Default font is: [Font: Name=Arial, Size=10, Units=3, GdiCharSet=1, GdiVerticalFont=False]
  100.    ''' </summary>
  101.    ''' ----------------------------------------------------------------------------------------------------
  102.    ''' <value>
  103.    ''' The text font.
  104.    ''' </value>
  105.    ''' ----------------------------------------------------------------------------------------------------
  106.    Public Property Font As Font
  107.  
  108.    ''' ----------------------------------------------------------------------------------------------------
  109.    ''' <summary>
  110.    ''' Gets or sets the text color.
  111.    ''' <para></para>
  112.    ''' Default color is: <see cref="System.Drawing.Color.Black"/>
  113.    ''' </summary>
  114.    ''' ----------------------------------------------------------------------------------------------------
  115.    ''' <value>
  116.    ''' The text color.
  117.    ''' </value>
  118.    ''' ----------------------------------------------------------------------------------------------------
  119.    Public Property Color As Color
  120.  
  121. #End Region
  122.  
  123. #Region " Constructors "
  124.  
  125.    ''' ----------------------------------------------------------------------------------------------------
  126.    ''' <summary>
  127.    ''' Prevents a default instance of the <see cref="PrintDocumentBasic"/> class from being created.
  128.    ''' </summary>
  129.    ''' ----------------------------------------------------------------------------------------------------
  130.    <DebuggerNonUserCode>
  131.    Private Sub New()
  132.    End Sub
  133.  
  134.    ''' ----------------------------------------------------------------------------------------------------
  135.    ''' <summary>
  136.    ''' Initializes a new instance of the <see cref="PrintDocumentBasic"/> class.
  137.    ''' </summary>
  138.    ''' ----------------------------------------------------------------------------------------------------
  139.    ''' <param name="filepath">
  140.    ''' The document file path.
  141.    ''' </param>
  142.    ''' ----------------------------------------------------------------------------------------------------
  143.    ''' <exception cref="FileNotFoundException">
  144.    ''' </exception>
  145.    ''' ----------------------------------------------------------------------------------------------------
  146.    <DebuggerStepThrough>
  147.    Public Sub New(ByVal filepath As String)
  148.        Me.New(filepath, encoding:=Nothing)
  149.    End Sub
  150.  
  151.    ''' ----------------------------------------------------------------------------------------------------
  152.    ''' <summary>
  153.    ''' Initializes a new instance of the <see cref="PrintDocumentBasic"/> class.
  154.    ''' </summary>
  155.    ''' ----------------------------------------------------------------------------------------------------
  156.    ''' <param name="filepath">
  157.    ''' The document file path.
  158.    ''' </param>
  159.    '''
  160.    ''' <param name="encoding">
  161.    ''' The text encoding.
  162.    ''' </param>
  163.    ''' ----------------------------------------------------------------------------------------------------
  164.    ''' <exception cref="FileNotFoundException">
  165.    ''' </exception>
  166.    ''' ----------------------------------------------------------------------------------------------------
  167.    <DebuggerStepThrough>
  168.    Public Sub New(ByVal filepath As String, ByVal encoding As Encoding)
  169.        Me.PrintDocument = New PrintDocument() With {
  170.            .DocumentName = filepath
  171.        }
  172.  
  173.        Me.Filepath = filepath
  174.        Me.Color = Color.Black
  175.  
  176.        Me.PrinterName = ""
  177.  
  178.        If (encoding Is Nothing) Then
  179.            Me.documentStream = New StreamReader(filepath, detectEncodingFromByteOrderMarks:=True)
  180.            Me.Encoding = Me.documentStream.CurrentEncoding
  181.        Else
  182.            Me.Encoding = encoding
  183.            Me.documentStream = New StreamReader(filepath, encoding, detectEncodingFromByteOrderMarks:=False)
  184.        End If
  185.    End Sub
  186.  
  187. #End Region
  188.  
  189. #Region " Public Methods "
  190.  
  191.    ''' ----------------------------------------------------------------------------------------------------
  192.    ''' <summary>
  193.    ''' Prints the current document.
  194.    ''' </summary>
  195.    ''' ----------------------------------------------------------------------------------------------------
  196.    ''' <exception cref="IOException">
  197.    ''' No printer device is installed.
  198.    ''' </exception>
  199.    '''
  200.    ''' <exception cref="ArgumentException">
  201.    ''' Printer name is not valid.
  202.    ''' </exception>
  203.    ''' ----------------------------------------------------------------------------------------------------
  204.    <DebuggerStepThrough>
  205.    Public Overridable Sub Print()
  206.  
  207.        If (PrinterSettings.InstalledPrinters.Count = 0) Then
  208.            Throw New IOException("No printer device is installed.")
  209.        End If
  210.  
  211.        If Not String.IsNullOrEmpty(Me.PrinterSettings.PrinterName) AndAlso Not (Me.PrinterSettings.IsValid) Then
  212.            Throw New Exception("Printer name is not valid.")
  213.        End If
  214.  
  215.        Me.PrintDocument.PrinterSettings = Me.PrinterSettings
  216.        Me.PrintDocument.Print()
  217.  
  218.    End Sub
  219.  
  220.    ''' ----------------------------------------------------------------------------------------------------
  221.    ''' <summary>
  222.    ''' Cancels the print job for the current document.
  223.    ''' </summary>
  224.    ''' ----------------------------------------------------------------------------------------------------
  225.    ''' <exception cref="Exception">
  226.    ''' Print job not found.
  227.    ''' </exception>
  228.    ''' ----------------------------------------------------------------------------------------------------
  229.    <DebuggerStepThrough>
  230.    Public Overridable Sub CancelPrint()
  231.  
  232.        Dim scope As New ManagementScope("root\CIMV2")
  233.        Dim query As New SelectQuery(String.Format("SELECT * FROM Win32_PrintJob WHERE Document = '{0}'", Me.PrintDocument.DocumentName))
  234.        Dim options As New EnumerationOptions With {
  235.                .ReturnImmediately = True,
  236.                .Rewindable = False,
  237.                .DirectRead = True,
  238.                .EnumerateDeep = False
  239.            }
  240.  
  241.        Using mos As New ManagementObjectSearcher(scope, query, options),
  242.              moc As ManagementObjectCollection = mos.Get()
  243.  
  244.            If (moc.Count = 0) Then
  245.                Throw New Exception("Print job not found.")
  246.            End If
  247.  
  248.            For Each mo As ManagementObject In moc
  249.                mo.Delete()
  250.            Next mo
  251.  
  252.        End Using
  253.  
  254.    End Sub
  255.  
  256. #End Region
  257.  
  258. #Region " Event-Handlers "
  259.  
  260.    ''' ----------------------------------------------------------------------------------------------------
  261.    ''' <summary>
  262.    ''' Handles the <see cref="System.Drawing.Printing.PrintDocument.BeginPrint"/> event
  263.    ''' of the <see cref="PrintDocumentBasic.PrintDocument"/> component.
  264.    ''' </summary>
  265.    ''' ----------------------------------------------------------------------------------------------------
  266.    ''' <param name="sender">
  267.    ''' The source of the event.
  268.    ''' </param>
  269.    '''
  270.    ''' <param name="e">
  271.    ''' The <see cref="PrintEventArgs"/> instance containing the event data.
  272.    ''' </param>
  273.    ''' ----------------------------------------------------------------------------------------------------
  274.    <DebuggerStepperBoundary>
  275.    Protected Overridable Sub PrintDocument_BeginPrint(ByVal sender As Object, ByVal e As PrintEventArgs) Handles PrintDocument.BeginPrint
  276.        If (Me.Font Is Nothing) Then
  277.            Me.Font = New Font("Arial", 10.0F, FontStyle.Regular)
  278.        End If
  279.    End Sub
  280.  
  281.    ''' ----------------------------------------------------------------------------------------------------
  282.    ''' <summary>
  283.    ''' Handles the <see cref="System.Drawing.Printing.PrintDocument.QueryPageSettings"/> event
  284.    ''' of the <see cref="PrintDocumentBasic.PrintDocument"/> component.
  285.    ''' </summary>
  286.    ''' ----------------------------------------------------------------------------------------------------
  287.    ''' <param name="sender">
  288.    ''' The source of the event.
  289.    ''' </param>
  290.    '''
  291.    ''' <param name="e">
  292.    ''' The <see cref="QueryPageSettingsEventArgs"/> instance containing the event data.
  293.    ''' </param>
  294.    ''' ----------------------------------------------------------------------------------------------------
  295.    <DebuggerStepperBoundary>
  296.    Protected Overridable Sub PrintDocument_QueryPageSettings(ByVal sender As Object, ByVal e As QueryPageSettingsEventArgs) Handles PrintDocument.QueryPageSettings
  297.  
  298.    End Sub
  299.  
  300.    ''' ----------------------------------------------------------------------------------------------------
  301.    ''' <summary>
  302.    ''' Handles the <see cref="System.Drawing.Printing.PrintDocument.PrintPage"/> event
  303.    ''' of the <see cref="PrintDocumentBasic.PrintDocument"/> component.
  304.    ''' </summary>
  305.    ''' ----------------------------------------------------------------------------------------------------
  306.    ''' <param name="sender">
  307.    ''' The source of the event.
  308.    ''' </param>
  309.    '''
  310.    ''' <param name="e">
  311.    ''' The <see cref="PrintPageEventArgs"/> instance containing the event data.
  312.    ''' </param>
  313.    ''' ----------------------------------------------------------------------------------------------------
  314.    <DebuggerStepperBoundary>
  315.    Protected Overridable Sub PrintDocument_PrintPage(ByVal sender As Object, ByVal e As PrintPageEventArgs) Handles PrintDocument.PrintPage
  316.  
  317.        ' Page settings.
  318.        Dim brush As New SolidBrush(Me.Color)
  319.        Dim stringFormat As New StringFormat()
  320.        Dim leftMargin As Single = e.MarginBounds.Left
  321.        Dim topMargin As Single = e.MarginBounds.Top
  322.  
  323.        ' Calculate the number of lines per page.
  324.        Dim linesPerPage As Single = (e.MarginBounds.Height / Me.Font.GetHeight(e.Graphics))
  325.  
  326.        ' Iterate over the file, printing each line.
  327.        Dim line As String = Nothing
  328.        Dim count As Integer
  329.        While (count < linesPerPage)
  330.            line = Me.documentStream.ReadLine()
  331.            If (line Is Nothing) Then
  332.                Exit While
  333.            End If
  334.            Dim yPos As Single = (topMargin + count * Me.Font.GetHeight(e.Graphics))
  335.            e.Graphics.DrawString(line, Me.Font, brush, leftMargin, yPos, stringFormat)
  336.            count += 1
  337.        End While
  338.  
  339.        brush.Dispose()
  340.        stringFormat.Dispose()
  341.  
  342.        ' If more lines exist, print another page.
  343.        e.HasMorePages = (line IsNot Nothing)
  344.  
  345.    End Sub
  346.  
  347.    ''' ----------------------------------------------------------------------------------------------------
  348.    ''' <summary>
  349.    ''' Handles the <see cref="System.Drawing.Printing.PrintDocument.EndPrint"/> event
  350.    ''' of the <see cref="PrintDocumentBasic.PrintDocument"/> component.
  351.    ''' </summary>
  352.    ''' ----------------------------------------------------------------------------------------------------
  353.    ''' <param name="sender">
  354.    ''' The source of the event.
  355.    ''' </param>
  356.    '''
  357.    ''' <param name="e">
  358.    ''' The <see cref="PrintEventArgs"/> instance containing the event data.
  359.    ''' </param>
  360.    ''' ----------------------------------------------------------------------------------------------------
  361.    <DebuggerStepperBoundary>
  362.    Protected Overridable Sub PrintDocument_EndPrint(ByVal sender As Object, ByVal e As PrintEventArgs) Handles PrintDocument.EndPrint
  363.  
  364.    End Sub
  365.  
  366. #End Region
  367.  
  368. #Region " IDisposable Implementation "
  369.  
  370.    ''' ----------------------------------------------------------------------------------------------------
  371.    ''' <summary>
  372.    ''' Flag to detect redundant calls when disposing.
  373.    ''' </summary>
  374.    ''' ----------------------------------------------------------------------------------------------------
  375.    Private isDisposed As Boolean = False
  376.  
  377.    ''' ----------------------------------------------------------------------------------------------------
  378.    ''' <summary>
  379.    ''' Releases all the resources used by this <see cref="PrintDocumentBasic"/> instance.
  380.    ''' </summary>
  381.    ''' ----------------------------------------------------------------------------------------------------
  382.    <DebuggerStepThrough>
  383.    Public Sub Dispose() Implements IDisposable.Dispose
  384.        Me.Dispose(isDisposing:=True)
  385.        GC.SuppressFinalize(obj:=Me)
  386.    End Sub
  387.  
  388.    ''' ----------------------------------------------------------------------------------------------------
  389.    ''' <summary>
  390.    ''' Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
  391.    ''' </summary>
  392.    ''' ----------------------------------------------------------------------------------------------------
  393.    ''' <param name="isDisposing">
  394.    ''' <see langword="True"/>  to release both managed and unmanaged resources;
  395.    ''' <see langword="False"/> to release only unmanaged resources.
  396.    ''' </param>
  397.    ''' ----------------------------------------------------------------------------------------------------
  398.    <DebuggerStepThrough>
  399.    Protected Overridable Sub Dispose(ByVal isDisposing As Boolean)
  400.  
  401.        If (Not Me.isDisposed) AndAlso (isDisposing) Then
  402.            If (Me.PrintDocument IsNot Nothing) Then
  403.                Me.PrintDocument.Dispose()
  404.                Me.PrintDocument = Nothing
  405.            End If
  406.  
  407.            If (Me.documentStream IsNot Nothing) Then
  408.                Me.documentStream.Close()
  409.                Me.documentStream = Nothing
  410.            End If
  411.  
  412.            If (Me.Font IsNot Nothing) Then
  413.                Me.Font.Dispose()
  414.                Me.Font = Nothing
  415.            End If
  416.  
  417.        End If
  418.  
  419.        Me.isDisposed = True
  420.  
  421.    End Sub
  422.  
  423. #End Region
  424.  
  425. End Class

MODO DE EMPLEO:
Código
  1. Using printBasic As New PrintDocumentBasic("C:\Document.txt", Encoding.Default)
  2.    printBasic.PrinterName = ""
  3.    printBasic.Font = New Font("Arial", 10.0F, FontStyle.Regular)
  4.    printBasic.Color = Color.Black
  5.  
  6.    printBasic.Print()
  7.    ' printBasic.CancelPrint()
  8. End Using



PrintDocumentExpert
Código
  1. ''' ----------------------------------------------------------------------------------------------------
  2. ''' <summary>
  3. ''' Prints a text document.
  4. ''' </summary>
  5. ''' ----------------------------------------------------------------------------------------------------
  6. ''' <seealso cref="IDisposable" />
  7. ''' ----------------------------------------------------------------------------------------------------
  8. Public Class PrintDocumentExpert : Implements IDisposable
  9.  
  10. #Region " Private Fields "
  11.  
  12.    ''' ----------------------------------------------------------------------------------------------------
  13.    ''' <summary>
  14.    ''' The <see cref="System.Drawing.Printing.PrintDocument"/> component to print the document.
  15.    ''' </summary>
  16.    ''' ----------------------------------------------------------------------------------------------------
  17.    Protected WithEvents PrintDocument As PrintDocument
  18.  
  19. #End Region
  20.  
  21. #Region " Properties "
  22.  
  23.    ''' ----------------------------------------------------------------------------------------------------
  24.    ''' <summary>
  25.    ''' Gets the document file path.
  26.    ''' </summary>
  27.    ''' ----------------------------------------------------------------------------------------------------
  28.    ''' <value>
  29.    ''' The document file path.
  30.    ''' </value>
  31.    ''' ----------------------------------------------------------------------------------------------------
  32.    Public ReadOnly Property Filepath As String
  33.  
  34.    ''' ----------------------------------------------------------------------------------------------------
  35.    ''' <summary>
  36.    ''' Gets or sets the text encoding.
  37.    ''' <para></para>
  38.    ''' If no encoding is specified, the default system encoding will be used.
  39.    ''' </summary>
  40.    ''' ----------------------------------------------------------------------------------------------------
  41.    ''' <value>
  42.    ''' The text encoding.
  43.    ''' </value>
  44.    ''' ----------------------------------------------------------------------------------------------------
  45.    Public Property Encoding As Encoding
  46.  
  47.    ''' ----------------------------------------------------------------------------------------------------
  48.    ''' <summary>
  49.    ''' Gets or sets the <see cref="StreamReader"/> instance that encapsulates the document data to be read and printed.
  50.    ''' </summary>
  51.    ''' ----------------------------------------------------------------------------------------------------
  52.    ''' <value>
  53.    ''' The <see cref="StreamReader"/> instance that encapsulates the document data to be read and printed.
  54.    ''' </value>
  55.    ''' ----------------------------------------------------------------------------------------------------
  56.    Public ReadOnly Property DocumentStream As StreamReader
  57.  
  58.    ''' ----------------------------------------------------------------------------------------------------
  59.    ''' <summary>
  60.    ''' Gets or sets the <see cref="System.Drawing.Printing.PrinterSettings"/> instance that specifies
  61.    ''' information about how a document is printed, including the printer that prints it.
  62.    ''' </summary>
  63.    ''' ----------------------------------------------------------------------------------------------------
  64.    ''' <value>
  65.    ''' The <see cref="System.Drawing.Printing.PrinterSettings"/> instance that specifies
  66.    ''' information about how a document is printed, including the printer that prints it.
  67.    ''' </value>
  68.    ''' ----------------------------------------------------------------------------------------------------
  69.    Public Property PrinterSettings As PrinterSettings
  70.  
  71.    ''' ----------------------------------------------------------------------------------------------------
  72.    ''' <summary>
  73.    ''' Gets or sets the <see cref="System.Drawing.Printing.PrintEventHandler"/> delegate method to handle the
  74.    ''' <see cref="System.Drawing.Printing.PrintDocument.BeginPrint"/> event.
  75.    ''' </summary>
  76.    ''' ----------------------------------------------------------------------------------------------------
  77.    ''' <value>
  78.    ''' The <see cref="System.Drawing.Printing.PrintEventHandler"/> delegate method to handle the
  79.    ''' <see cref="System.Drawing.Printing.PrintDocument.BeginPrint"/> event.
  80.    ''' </value>
  81.    ''' ----------------------------------------------------------------------------------------------------
  82.    Public Property BeginPrintEventHandler As PrintEventHandler
  83.  
  84.    ''' ----------------------------------------------------------------------------------------------------
  85.    ''' <summary>
  86.    ''' Gets or sets the <see cref="System.Drawing.Printing.QueryPageSettingsEventHandler"/> delegate method to handle the
  87.    ''' <see cref="System.Drawing.Printing.PrintDocument.BeginPrint"/> event.
  88.    ''' </summary>
  89.    ''' ----------------------------------------------------------------------------------------------------
  90.    ''' <value>
  91.    ''' The <see cref="System.Drawing.Printing.PrintEventHandler"/> delegate method to handle the
  92.    ''' <see cref="System.Drawing.Printing.PrintDocument.QueryPageSettings"/> event.
  93.    ''' </value>
  94.    ''' ----------------------------------------------------------------------------------------------------
  95.    Public Property QueryPageSettingsEventHandler As QueryPageSettingsEventHandler
  96.  
  97.    ''' ----------------------------------------------------------------------------------------------------
  98.    ''' <summary>
  99.    ''' Gets or sets the <see cref="System.Drawing.Printing.PrintPageEventHandler"/> delegate method to handle the
  100.    ''' <see cref="System.Drawing.Printing.PrintDocument.PrintPage"/> event.
  101.    ''' </summary>
  102.    ''' ----------------------------------------------------------------------------------------------------
  103.    ''' <value>
  104.    ''' The <see cref="System.Drawing.Printing.PrintPageEventHandler"/> delegate method to handle the
  105.    ''' <see cref="System.Drawing.Printing.PrintDocument.PrintPage"/> event.
  106.    ''' </value>
  107.    ''' ----------------------------------------------------------------------------------------------------
  108.    Public Property PrintPageEventHandler As PrintPageEventHandler
  109.  
  110.    ''' ----------------------------------------------------------------------------------------------------
  111.    ''' <summary>
  112.    ''' Gets or sets the <see cref="System.Drawing.Printing.PrintEventHandler"/> delegate method to handle the
  113.    ''' <see cref="System.Drawing.Printing.PrintDocument.BeginPrint"/> event.
  114.    ''' </summary>
  115.    ''' ----------------------------------------------------------------------------------------------------
  116.    ''' <value>
  117.    ''' The <see cref="System.Drawing.Printing.PrintEventHandler"/> delegate method to handle the
  118.    ''' <see cref="System.Drawing.Printing.PrintDocument.EndPrint"/> event.
  119.    ''' </value>
  120.    ''' ----------------------------------------------------------------------------------------------------
  121.    Public Property EndPrintEventHandler As PrintEventHandler
  122.  
  123. #End Region
  124.  
  125. #Region " Constructors "
  126.  
  127.    ''' ----------------------------------------------------------------------------------------------------
  128.    ''' <summary>
  129.    ''' Prevents a default instance of the <see cref="PrintDocumentExpert"/> class from being created.
  130.    ''' </summary>
  131.    ''' ----------------------------------------------------------------------------------------------------
  132.    <DebuggerNonUserCode>
  133.    Private Sub New()
  134.    End Sub
  135.  
  136.    ''' ----------------------------------------------------------------------------------------------------
  137.    ''' <summary>
  138.    ''' Initializes a new instance of the <see cref="PrintDocumentExpert"/> class.
  139.    ''' </summary>
  140.    ''' ----------------------------------------------------------------------------------------------------
  141.    ''' <param name="filepath">
  142.    ''' The document file path.
  143.    ''' </param>
  144.    ''' ----------------------------------------------------------------------------------------------------
  145.    ''' <exception cref="FileNotFoundException">
  146.    ''' </exception>
  147.    ''' ----------------------------------------------------------------------------------------------------
  148.    <DebuggerStepThrough>
  149.    Public Sub New(ByVal filepath As String)
  150.        Me.New(filepath, encoding:=Nothing)
  151.    End Sub
  152.  
  153.    ''' ----------------------------------------------------------------------------------------------------
  154.    ''' <summary>
  155.    ''' Initializes a new instance of the <see cref="PrintDocumentExpert"/> class.
  156.    ''' </summary>
  157.    ''' ----------------------------------------------------------------------------------------------------
  158.    ''' <param name="filepath">
  159.    ''' The document file path.
  160.    ''' </param>
  161.    '''
  162.    ''' <param name="encoding">
  163.    ''' The text encoding.
  164.    ''' </param>
  165.    ''' ----------------------------------------------------------------------------------------------------
  166.    ''' <exception cref="FileNotFoundException">
  167.    ''' </exception>
  168.    ''' ----------------------------------------------------------------------------------------------------
  169.    <DebuggerStepThrough>
  170.    Public Sub New(ByVal filepath As String, ByVal encoding As Encoding)
  171.        Me.PrintDocument = New PrintDocument() With {
  172.            .DocumentName = filepath
  173.        }
  174.  
  175.        Me.Filepath = filepath
  176.  
  177.        If (encoding Is Nothing) Then
  178.            Me.DocumentStream = New StreamReader(filepath, detectEncodingFromByteOrderMarks:=True)
  179.            Me.Encoding = Me.DocumentStream.CurrentEncoding
  180.        Else
  181.            Me.Encoding = encoding
  182.            Me.DocumentStream = New StreamReader(filepath, encoding, detectEncodingFromByteOrderMarks:=False)
  183.        End If
  184.    End Sub
  185.  
  186. #End Region
  187.  
  188. #Region " Public Methods "
  189.  
  190.    ''' ----------------------------------------------------------------------------------------------------
  191.    ''' <summary>
  192.    ''' Prints the current document.
  193.    ''' </summary>
  194.    ''' ----------------------------------------------------------------------------------------------------
  195.    ''' <exception cref="IOException">
  196.    ''' No printer device is installed.
  197.    ''' </exception>
  198.    '''
  199.    ''' <exception cref="Exception">
  200.    ''' Printer name is not valid.
  201.    ''' </exception>
  202.    '''
  203.    ''' <exception cref="Exception">
  204.    ''' The 'PrintDocumentExpert.PrintPageEventHandler' property must be set before calling the 'PrintDocumentExpert.Print()' method.
  205.    ''' </exception>
  206.    ''' ----------------------------------------------------------------------------------------------------
  207.    <DebuggerStepThrough>
  208.    Public Overridable Sub Print()
  209.  
  210.        If (PrinterSettings.InstalledPrinters.Count = 0) Then
  211.            Throw New IOException("No printer device is installed.")
  212.        End If
  213.  
  214.        If Not String.IsNullOrEmpty(Me.PrinterSettings.PrinterName) AndAlso Not (Me.PrinterSettings.IsValid) Then
  215.            Throw New Exception("Printer name is not valid.")
  216.        End If
  217.  
  218.        If (Me.PrintPageEventHandler Is Nothing) Then
  219.            Throw New Exception("The 'PrintDocumentExpert.PrintPageEventHandler' property must be set before calling the 'PrintDocumentExpert.Print()' method.")
  220.        End If
  221.  
  222.        AddHandler Me.PrintDocument.BeginPrint, Me.BeginPrintEventHandler
  223.        AddHandler Me.PrintDocument.QueryPageSettings, Me.QueryPageSettingsEventHandler
  224.        AddHandler Me.PrintDocument.PrintPage, Me.PrintPageEventHandler
  225.        AddHandler Me.PrintDocument.EndPrint, Me.EndPrintEventHandler
  226.  
  227.        Me.PrintDocument.PrinterSettings = Me.PrinterSettings
  228.        Me.PrintDocument.Print()
  229.  
  230.        RemoveHandler Me.PrintDocument.BeginPrint, Me.BeginPrintEventHandler
  231.        RemoveHandler Me.PrintDocument.QueryPageSettings, Me.QueryPageSettingsEventHandler
  232.        RemoveHandler Me.PrintDocument.PrintPage, Me.PrintPageEventHandler
  233.        RemoveHandler Me.PrintDocument.EndPrint, Me.EndPrintEventHandler
  234.  
  235.    End Sub
  236.  
  237.    ''' ----------------------------------------------------------------------------------------------------
  238.    ''' <summary>
  239.    ''' Cancels the print job for the current document.
  240.    ''' </summary>
  241.    ''' ----------------------------------------------------------------------------------------------------
  242.    ''' <exception cref="Exception">
  243.    ''' Print job not found.
  244.    ''' </exception>
  245.    ''' ----------------------------------------------------------------------------------------------------
  246.    <DebuggerStepThrough>
  247.    Public Overridable Sub CancelPrint()
  248.  
  249.        Dim scope As New ManagementScope("root\CIMV2")
  250.        Dim query As New SelectQuery(String.Format("SELECT * FROM Win32_PrintJob WHERE Document = '{0}'", Me.PrintDocument.DocumentName))
  251.        Dim options As New EnumerationOptions With {
  252.                .ReturnImmediately = True,
  253.                .Rewindable = False,
  254.                .DirectRead = True,
  255.                .EnumerateDeep = False
  256.            }
  257.  
  258.        Using mos As New ManagementObjectSearcher(scope, query, options),
  259.              moc As ManagementObjectCollection = mos.Get()
  260.  
  261.            If (moc.Count = 0) Then
  262.                Throw New Exception("Print job not found.")
  263.            End If
  264.  
  265.            For Each mo As ManagementObject In moc
  266.                mo.Delete()
  267.            Next mo
  268.  
  269.        End Using
  270.  
  271.    End Sub
  272.  
  273. #End Region
  274.  
  275. #Region " IDisposable Implementation "
  276.  
  277.    ''' ----------------------------------------------------------------------------------------------------
  278.    ''' <summary>
  279.    ''' Flag to detect redundant calls when disposing.
  280.    ''' </summary>
  281.    ''' ----------------------------------------------------------------------------------------------------
  282.    Private isDisposed As Boolean = False
  283.  
  284.    ''' ----------------------------------------------------------------------------------------------------
  285.    ''' <summary>
  286.    ''' Releases all the resources used by this <see cref="PrintDocumentBasic"/> instance.
  287.    ''' </summary>
  288.    ''' ----------------------------------------------------------------------------------------------------
  289.    <DebuggerStepThrough>
  290.    Public Sub Dispose() Implements IDisposable.Dispose
  291.        Me.Dispose(isDisposing:=True)
  292.        GC.SuppressFinalize(obj:=Me)
  293.    End Sub
  294.  
  295.    ''' ----------------------------------------------------------------------------------------------------
  296.    ''' <summary>
  297.    ''' Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
  298.    ''' </summary>
  299.    ''' ----------------------------------------------------------------------------------------------------
  300.    ''' <param name="isDisposing">
  301.    ''' <see langword="True"/>  to release both managed and unmanaged resources;
  302.    ''' <see langword="False"/> to release only unmanaged resources.
  303.    ''' </param>
  304.    ''' ----------------------------------------------------------------------------------------------------
  305.    <DebuggerStepThrough>
  306.    Protected Overridable Sub Dispose(ByVal isDisposing As Boolean)
  307.  
  308.        If (Not Me.isDisposed) AndAlso (isDisposing) Then
  309.  
  310.            If (Me.PrintDocument IsNot Nothing) Then
  311.                Me.PrintDocument.Dispose()
  312.                Me.PrintDocument = Nothing
  313.            End If
  314.  
  315.            If (Me.DocumentStream IsNot Nothing) Then
  316.                Me.DocumentStream.Close()
  317.            End If
  318.  
  319.        End If
  320.  
  321.        Me.isDisposed = True
  322.  
  323.    End Sub
  324.  
  325. #End Region
  326.  
  327. End Class

MODO DE EMPLEO:
Código
  1. Public Module Module1
  2.  
  3.    Private printExpert As PrintDocumentExpert
  4.  
  5.    Public Sub Main()
  6.  
  7.        printExpert = New PrintDocumentExpert("C:\Document.txt", Encoding.Default)
  8.  
  9.        Using printExpert
  10.            printExpert.PrinterSettings = New PrinterSettings With {
  11.                    .PrinterName = "My Printer Name"
  12.                }
  13.  
  14.            printExpert.BeginPrintEventHandler = AddressOf PrintDocument_BeginPrint
  15.            printExpert.QueryPageSettingsEventHandler = AddressOf PrintDocument_QueryPageSettings
  16.            printExpert.PrintPageEventHandler = AddressOf PrintDocument_PrintPage
  17.            printExpert.EndPrintEventHandler = AddressOf PrintDocument_EndPrint
  18.  
  19.            printExpert.Print()
  20.        End Using
  21.  
  22.    End Sub
  23.  
  24.    Public Sub PrintDocument_BeginPrint(ByVal sender As Object, ByVal e As PrintEventArgs)
  25.    End Sub
  26.  
  27.    Public Sub PrintDocument_QueryPageSettings(ByVal sender As Object, ByVal e As QueryPageSettingsEventArgs)
  28.    End Sub
  29.  
  30.    Public Sub PrintDocument_PrintPage(ByVal sender As Object, ByVal e As PrintPageEventArgs)
  31.        ' Page settings.
  32.        Dim font As New Font("Arial", 10.0F, FontStyle.Regular)
  33.        Dim brush As New SolidBrush(Color.Green)
  34.        Dim stringFormat As New StringFormat()
  35.        Dim leftMargin As Single = e.MarginBounds.Left
  36.        Dim topMargin As Single = e.MarginBounds.Top
  37.  
  38.        ' Calculate the number of lines per page.
  39.        Dim linesPerPage As Single = (e.MarginBounds.Height / font.GetHeight(e.Graphics))
  40.  
  41.        ' Iterate over the file, printing each line.
  42.        Dim line As String = Nothing
  43.        Dim count As Integer
  44.        While (count < linesPerPage)
  45.            line = printExpert.DocumentStream.ReadLine()
  46.            If (line Is Nothing) Then
  47.                Exit While
  48.            End If
  49.            Dim yPos As Single = (topMargin + count * font.GetHeight(e.Graphics))
  50.            e.Graphics.DrawString(line, font, brush, leftMargin, yPos, stringFormat)
  51.            count += 1
  52.        End While
  53.  
  54.        font.Dispose()
  55.        brush.Dispose()
  56.        stringFormat.Dispose()
  57.  
  58.        ' If more lines exist, print another page.
  59.        e.HasMorePages = (line IsNot Nothing)
  60.    End Sub
  61.  
  62.    Public Sub PrintDocument_EndPrint(ByVal sender As Object, ByVal e As PrintEventArgs)
  63.    End Sub
  64.  
  65. End Module

MODO DE EMPLEO ALTERNATIVO:
Código
  1. Public Sub Main()
  2.  
  3.    Dim printExpert As PrintDocumentExpert = Nothing
  4.  
  5.    Dim beginPrintEventHandler As PrintEventHandler =
  6.        Sub(ByVal sender As Object, ByVal e As PrintEventArgs)
  7.        End Sub
  8.  
  9.    Dim queryPageSettingsEventHandler As QueryPageSettingsEventHandler =
  10.        Sub(ByVal sender As Object, ByVal e As QueryPageSettingsEventArgs)
  11.        End Sub
  12.  
  13.    Dim printPageEventHandler As PrintPageEventHandler =
  14.    Sub(ByVal sender As Object, ByVal e As PrintPageEventArgs)
  15.        ' Page settings.
  16.        Dim font As New Font("Arial", 10.0F, FontStyle.Regular)
  17.        Dim brush As New SolidBrush(Color.Green)
  18.        Dim stringFormat As New StringFormat()
  19.        Dim leftMargin As Single = e.MarginBounds.Left
  20.        Dim topMargin As Single = e.MarginBounds.Top
  21.  
  22.        ' Calculate the number of lines per page.
  23.        Dim linesPerPage As Single = (e.MarginBounds.Height / font.GetHeight(e.Graphics))
  24.  
  25.        ' Iterate over the file, printing each line.
  26.        Dim line As String = Nothing
  27.        Dim count As Integer
  28.        While (count < linesPerPage)
  29.            line = printExpert.DocumentStream.ReadLine()
  30.            If (line Is Nothing) Then
  31.                Exit While
  32.            End If
  33.            Dim yPos As Single = (topMargin + count * font.GetHeight(e.Graphics))
  34.            e.Graphics.DrawString(line, font, brush, leftMargin, yPos, stringFormat)
  35.            count += 1
  36.        End While
  37.  
  38.        font.Dispose()
  39.        brush.Dispose()
  40.        stringFormat.Dispose()
  41.  
  42.        ' If more lines exist, print another page.
  43.        e.HasMorePages = (line IsNot Nothing)
  44.    End Sub
  45.  
  46.    Dim endPrintEventHandler As PrintEventHandler =
  47.        Sub(ByVal sender As Object, ByVal e As PrintEventArgs)
  48.        End Sub
  49.  
  50.    printExpert = New PrintDocumentExpert("C:\Document.txt", Encoding.Default)
  51.    Using printExpert
  52.        printExpert.PrinterSettings = New PrinterSettings With {
  53.            .PrinterName = "My Printer Name"
  54.        }
  55.  
  56.        printExpert.BeginPrintEventHandler = beginPrintEventHandler
  57.        printExpert.QueryPageSettingsEventHandler = queryPageSettingsEventHandler
  58.        printExpert.PrintPageEventHandler = printPageEventHandler
  59.        printExpert.EndPrintEventHandler = endPrintEventHandler
  60.  
  61.        printExpert.Print()
  62.    End Using
  63.  
  64. End Sub
99  Foros Generales / Noticias / Re: Cuidado si ves este captcha: va a minar criptomonedas con tu PC en: 28 Marzo 2018, 14:28
No es necesario seguir discutiendo entre nosotros, el enemigo está ahí fuera... camuflado en un captcha, detrás de un enlace, escondido en el código fuente de una página en la World Wide Web.

Yo lo único que opino es que se acontece un futuro muy negro para todo lo que concierne a las criptomonedas, ya que día si y día también no dejan de salir noticias y nuevas formas de llevar a cabo acciones perjudiciales contra los usuarios debido a la existencia de las criptomonedas y la codicia de las personas con su falta de moralidad. Yo considero que hoy por hoy y para las personas que no son millonarias, la existencia de las criptomonedas generan más males que bienes en general, más problemas que beneficios, más dolores de cabeza que comodidades, y algo así es dificil que prospere hacia un buen rumbo... más con las espectativas que suele tener la gente, ya sabeis, que las criptomonedas reemplacen a la moneda física y tal... eso no va a ocurrir mientras no dejen de salir noticias como esta, hasta que el sistema de minado y las criptomonedas sea más organizado, algo mejor para todos, que no sea considerado un peligro solo por existir como lo es ahora mismo para mucha gente, para muchas víctimas.

Saludos
100  Foros Generales / Noticias / Re: Cuidado si ves este captcha: va a minar criptomonedas con tu PC en: 27 Marzo 2018, 21:07
esto es falso... es trabajo de todos... es decir, es facil quejarse y decir "no quiero que me hagan eso" y no hacer nada para evitarlo... durante los años aquí vi eso en su escala más pura y extrema, donde la gente dice "[x grupo social] debe salir a la calle!, cuando salgan verán como cae el regimen" y todos siempre echan la culpa a los demás y los unicos que activamente están actuando a su favor, son los que joden...

Tengo la sensación de que a lo mejor tu forma de analizar mis palabras podría estar acondicionada por la situación del país en el que vives (por que tú lo has puesto como ejemplo para compararme), pero Engel, creo que no se puede comparar a la gente que se sienta en el sofá y solo saben hacer que quejarse de su gobierno sin hacer nada, compararlo con las víctimas-internautas inocentes que sufren por la incompetente implementación de las criptomonedas, por la explotación maligna que existe a través de su modo más común de obtención: el software de minado. Me refiero, el ejemplo que tu has expuesto es un problema de MUCHA mayor gravedad que el problema de los inconvenientes que genera el sistema de las criptomonedas.

No creo que nadie tenga la obligación moral de intentar arreglar ni mejorar nada con respecto a este tema, a menos que esa persona sea responsable directo de dirigir el rumbo de de las criptomonedas, de lo contrario a menos que exista un beneficio personal o económico para ello...no tenemos la obligación moral.
Yo creo que por pensar así el mundo no se va a joder, aunque todos pensasemos de la misma manera en que yo lo pienso, por que NO estamos hablando de como podría afectar nuestro modo de pensar ni nuestra "pasividad" a la situación de un país ni a su economia, sino a la estabilidad de las criptomonedas y ya está, es algo incomparable en cuanto a la gravedad del asunto... por supuesto no discrepo en lo que has dicho, la gente debe hacer algo si quiere arreglar su país, con quejarse no es suficiente, pero es que eso es un tema de mayor gravedad y responsabilidad moral que las criptomonedas (siendo un simple usuario o un espectador).

Yo no he pedido que se inventen las criptomonedas, yo no he pedido que se invente el software de minado, yo no he participado en la decisión de nada de eso, así que democraticamente tengo el derecho a quejarme (y limitarme solo a quejarme) para que los responsables de su invención, implementación y de su difusión hagan algo por mejorar la seguridad en el sentido que sea, y que así deje de afectarnos mediante códigos maliciosos y etc.

Además, lo que dices es muy facil decirlo... lo de hacer algo al respecto y no solo quejarse, pero es muy dificil hacer algo o proponer una idea innovadora cuando para empezar la probabilidad de que la persona adecuada te escuche es del 0,000001% (igual que la probabilidad de que tu idea se acepte y al final se lleve a cabo), al final solo puedes acabar limitándote al derecho de quejarte, por que no vale la pena intentar proponer ideas cuando no hay nadie que pueda escucharte, o que quiera escucharte.

Saludos!
Páginas: 1 2 3 4 5 6 7 8 9 [10] 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 ... 1083
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines