在一行数据C#上打印多页WPF控件而不打破页面

时间:2014-08-18 13:20:56

标签: c# wpf printing page-break multipage

我制作了一张底部有列表视图的发票,列出了所有订单项。这可以在一页标记上运行,因此我重载了DocumentPaginator类以允许我打印多个页面。但是,有时它会在列表视图的一行中间剪切页面。我找到了一篇使用wpf控件位图的文章,然后检查一行的像素颜色,以确定是否有空格或数据(下面的代码)。当我控制到位图时,间距和行高与我将wpf控件作为xps或打印机打印时不同。关于如何智能地破解页面或使位图与xps匹配的任何其他想法?

 private void GetGoodCut()
    {
        int goodCut = _lastCut; 
        int lastNumber = 0;
        int numberCount = 1;
        // At most, it will take 32 pixel lines to find a white space
        for (int i = 0; i < 32; i++)
        {
            int number = rowPixelWhiteCount(_bitmap, goodCut);
            goodCut--;

            if (number == lastNumber)
            {
                numberCount++;
                // White space count between LV lines is 12 
                if (numberCount == 12)
                {
                    lastNumber = i - 6;
                    break;
                }
            }
            else
            {
                // If we started inside a white space, can break if starting before/at middle of the white space
                if (numberCount > 5)
                {
                    lastNumber = i - 6;
                    break;
                }
                numberCount = 1;
            }

            lastNumber = number;
        }

        _lastCut -= lastNumber;
    }

 private int rowPixelWhiteCount(System.Drawing.Bitmap bmp, int row)
    {
        int colorCount = 0;
        System.Drawing.Imaging.BitmapData bmpData = bmp.LockBits(new System.Drawing.Rectangle(0, 0, bmp.Width, bmp.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, bmp.PixelFormat);
        int stride = bmpData.Stride;
        IntPtr firstPixelInImage = bmpData.Scan0;

        unsafe
        {
            byte* p = (byte*)(void*)firstPixelInImage;
            p += stride * row;  // find starting pixel of the specified row
            for (int column = 0; column < bmp.Width; column++)
            {
                // Printing in black/white, look for non-black pixels
                byte blue = p[0];
                byte red = p[1];
                byte green = p[3];
                if (blue > 0 && red > 0 && green > 0)
                    colorCount++;

                // go to next pixel
                p += 3;
            }
        }
        bmp.UnlockBits(bmpData);
        count.Add(colorCount);

        return colorCount;
    }

1 个答案:

答案 0 :(得分:0)

我认为从WPF应用程序打印多个页面的秘诀是使用多个FixedDocument元素......您还可以在此过程中使用DocumentPaginator元素。由于这在网上有很好的记录,我在这里再也不会重复这一切。相反,请参阅NBD Tech网站上的WPF Printing Part 2 – The Fixed Document页面了解完整的故事。

作为其他帮助,您还可以参阅Abhishek Shukla网站上的Advanced WPF Part 2 of 5: Printing in Windows Presentation Foundation页面。

最后,如果所有其他方法都失败了,您可能会对使用代码项目中WPF Print Engine: Part I页面中的代码感兴趣。