我制作了一张底部有列表视图的发票,列出了所有订单项。这可以在一页标记上运行,因此我重载了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;
}
答案 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页面中的代码感兴趣。