Question

La fonction ci-dessous imprime une image raster couleur sur une imprimante PCL-5. La fonction a été adaptée à partir d’une fonction d’impression bicolore (1 bpp) qui fonctionnait parfaitement, à l’exception de l’impression bicolore granuleuse. Le problème est que l’image sort avec une grande barre noire s’étendant de la droite de l’image jusqu’au bord de la page, comme suit:

  IMAGE#########################################
  IMAGE#########AREA COMPLETELY BLACK###########
  IMAGE#########################################

L’image elle-même est parfaite, sinon.

Divers outils PCL-to-PDF ne montrent pas l’image du tout, ce qui me porte à croire que j’ai oublié de faire quelque chose. Les réinitialisations appropriées (\ u001bE \ u001b% -12345X) ont été envoyées avant et les sauts de page après.

Des experts PCL sur le marché? J'ai le Manuel de référence technique PCL 5 Color et il m'a conduit jusque-là. Cette dernière chose me rend fou.

* Modifier: Je sais maintenant quelle commande est à l'origine du problème, mais je ne sais pas pourquoi:

  stream("\u001b*r0F"); 

Ceci devrait permettre de faire pivoter l'image avec la page (portrait, paysage). Si je supprime cela, le problème disparaît. Je peux compenser en faisant pivoter le bitmap au préalable, mais je veux vraiment savoir ce qui a causé cela!

   static void PrintImage()
    {
        // Get an image into memory
        Image original = Image.FromFile("c:\\temp\\test.jpg");
        Bitmap newBitmap = new Bitmap(original, original.Width, original.Height);

        stream(String.Format("\u001b*p{0:d}x*p{1:d}Y", 1000, 1000));// Set cursor.
        stream("\u001b*t300R");                                     // 300 DPI
        stream(String.Format("\u001b*r{0:d}T", original.Height));   // Height
        stream(String.Format("\u001b*r{0:d}S", original.Width));    // Width

        stream("\u001b*r3U");      // 8-bit color palette
        stream("\u001b*r0F");      // Follow logical page layout (landscape, portrait, etc..)
        // Set palette depth, 3 bytes per pixel RGB
        stream("\u001b*v6W\u0000\u0003\u0000\u0008\u0008\u0008");  
        stream("\u001b*r1A");      // Start raster graphics
        stream("\u001b*b0M");      // Compression 0 = None, 1 = Run Length Encoding

        // Not fast, but fast enough.  
        List<byte> colors = new List<byte>();
        for (int y2 = 0; y2 < original.Height; y2++)
        {
            colors.Clear();
            for (int x2 = 0; x2 < original.Width; x2++)
            {
                Color c = newBitmap.GetPixel(x2, y2);
                colors.Add(c.R);
                colors.Add(c.G);
                colors.Add(c.B);
            }

            stream(String.Format("\u001b*b{0}W", colors.Count));     // Length of data to send
            streamBytes(colors.ToArray());                           // Binary data
        }
        stream("\u001b*rB");   // End raster graphics  (also tried *rC -- no effect)
    }
Était-ce utile?

La solution

Votre code pose quelques problèmes. Tout d’abord, le code de position du curseur est incorrect, il faut lire:

"\u001b*p{0:d}x1:d}Y", 1000, 1000

Cela équivaut à:

<esc>*p1000x1000Y

vous aviez:

<esc>*p1000x*p1000Y

Lorsque vous associez des commandes PCL, vous faites correspondre les mêmes valeurs et groupes paramétrés, puis ajoutez simplement valeur + caractère paramétré + valeur + caractère paramétré, etc. Assurez-vous que le dernier caractère paramétré est une lettre majuscule signifiant la fin de la commande PCL. .

De même, lors de la définition d'une image, je vous recommande également de spécifier la largeur & amp; De haut en décipoints, cela devrait aider à la mise à l'échelle de l'image (* r3A) sur la page, alors ajoutez ceci (juste après que votre commande de résolution soit un bon endroit pour cela):

Int32 deciHeight = original.Height / (int)original.HorizontalResolution * 720;
Int32 deciWidth = original.Width / (int)original.VerticalResolution * 720;
stream("\u001b*t{0:d}h{1:d}V", deciHeight, deciWidth));

L’autre recommandation est d’écrire tout cela dans un fichier (surveillez vos encodages) et d’utiliser l’un des rares visualiseurs PCL pour afficher vos données plutôt que de les imprimer. Devrait vous faire gagner du temps et une forêt ou deux! Je les ai tous essayés et je recommanderais de dépenser 89 $ et d’acheter pclWorks . Ils ont également un SDK complet si vous allez faire beaucoup de PCL. Nous n'utilisons pas cela car nous codifions nous-mêmes tous les PCL, mais cela a l'air bien.

En ce qui concerne la rotation, nous avons eu des problèmes sur certains appareils. Vous pouvez simplement faire pivoter le jpg en premier (original.RotateFlip) puis l'écrire.

Je n'ai pas beaucoup de temps aujourd'hui, mais j'espère que mes commentaires seront utiles. Je peux tester votre code lundi ou mardi, travailler avec et poster d'autres commentaires.

N'oubliez pas que même si PCL est une norme, sa prise en charge d'un fabricant à l'autre et d'un périphérique à l'autre peut poser problème et être très différente. Lorsque vous faites des tâches de base, la plupart des appareils semblent bien; Toutefois, si vous entrez dans des macros ou des graphiques complexes, vous constaterez une différence.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top