Pergunta

A função abaixo imprime uma imagem raster de cor para uma impressora PCL-5. A função foi adaptado de um colorido 2 (1bpp) função de impressão tivemos que funcionou perfeitamente, exceto para a impressão de 2 cores granuladas. O problema é que a imagem sai com uma grande barra preta que se estende desde o direito da imagem para a borda da página como esta:

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

A imagem em si parece perfeito, caso contrário.

Várias ferramentas PCL-to-PDF não mostram a imagem em tudo, o que me leva a acreditar que eu esqueci fazer alguma coisa. resets apropriadas (\ u001bE \ u001b% -12345X) foram enviados antes, e página alimentações depois.

Qualquer especialistas PCL lá fora? Eu tenho o Manual PCL 5 Color Technical Reference, e isso está me este ido longe. Esta última coisa que está me deixando embora louco.

* Edit: Agora eu sei o que o comando está causando o problema, mas eu não sei por que:

  stream("\u001b*r0F"); 

Isso deve manter a imagem girada junto com a página (retrato, paisagem). Se eu remover esse, o problema desaparece. I podem compensar pela rotação do bitmap de antemão, mas eu realmente quero saber o que causou isso!

   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)
    }
Foi útil?

Solução

Existem alguns problemas com o seu código. Primeiro o seu código de posição do cursor estiver incorreto, deve ler-se:

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

Isso equivale a:

<esc>*p1000x1000Y

você teve:

<esc>*p1000x*p1000Y

Ao aderir comandos PCL juntos, você igualar-se o mesmo valor parametrizado e de grupo e, em seguida, basta adicionar valor + caráter + valor de caracteres parametrizada parametrizada + etc. Certifique-se de que o personagem parametrizada final é uma letra maiúscula que significa o fim do comando PCL .

Além disso, quando a definição de uma imagem que eu recomendo que você também especificar a largura e altura em decipoints, isso deve ajudar com a escala da imagem (* R3A) na página para adicionar este (logo após o seu comando resolução deve ser um lugar bem para ele):

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));

A outra recomendação é para escrever tudo isso para arquivo (assista suas codificações) e uso um do punhado de espectadores PCL para ver o seu vs. dados sempre imprimi-lo. Deve poupar algum tempo e uma floresta ou dois! Eu tentei todos eles e Wold recomendo passar a US $ 89 e comprando PCLWorks . Eles também têm um SDK completo se você vai fazer um monte de PCL. Nós não usar isso como nós codificar todos PCL nós mesmos, mas isso parece bom.

Quanto a rotação, nós tivemos problemas em algum dispositivo, Você só pode girar a do jpg primeiro (original.RotateFlip) um, em seguida, escrevê-lo.

Eu não tenho muito tempo hoje, mas espero que meus comentários ajudar. Eu posso testar o seu código na segunda-feira ou terça-feira e trabalhar com ele e publicar quaisquer comentários adicionais.

Tenha em mente que mesmo que PCL é um padrão seu apoio de fabricante para fabricante e dispositivo para dispositivo pode ser um problema e muito diferente. Ao fazer coisas básicas a maioria dos dispositivos parecem bem; No entanto, se você entrar em macros ou gráficos complexos você vai encontrar diferença.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top