0
这段代码是用于生成XPS文档的一些代码的一部分。 XPS文件生成不是玩笑。如果可能的话,我希望避免粘贴任何XPS代码。相反,这段代码重点关注问题的WPF部分。如何识别固定页面的尺寸
我要求你帮忙的问题就在这里。我已经硬编码的尺寸为测试图像的工作:
double magicNumber_X = 3.5;//trial and error...3 too small 4 too big
fixedPage.Arrange(new Rect(new Point(magicNumber_X, 0), size));
相反,我怎么能解决这个代码来计算的坐标?
完整的方法:
private PageContent AddContentFromImage()
{
var pageContent = new PageContent();
var fixedPage = new FixedPage();
var bitmapImage = new BitmapImage(new Uri(hardCodedImageSampleFilePath, UriKind.RelativeOrAbsolute));
var image = new Image();
image.Source = bitmapImage;
fixedPage.Children.Add(image);
((IAddChild)pageContent).AddChild(fixedPage);
double pageWidth = 96 * 8.5;//XPS documents are 96 units per inch
double pageHeight = 96 * 11;
fixedPage.Width = pageWidth;
fixedPage.Height = pageHeight;
var size = new Size(8.5 * 96, 11 * 96);
fixedPage.Measure(size);
double magicNumber_X = 3.5;//trial and error...3 too small 4 too big
double magicNumber_Y = 0;
fixedPage.Arrange(new Rect(new Point(magicNumber_X, magicNumber_Y), size));
fixedPage.UpdateLayout();
return pageContent;
}
我有点惊讶FixedPage.Measure(size)
本身并不解决问题。我尝试不通过参数,例如fixedPage.Arrange(new Rect(), size))
仍然没有去。
FWIW,这个计算在我使用PrintDocument的时候工作得很好。
private void pd_PrintPage(object sender, PrintPageEventArgs e)
{
Graphics g = e.Graphics;
RectangleF marginBounds = e.MarginBounds;
RectangleF printableArea = e.PageSettings.PrintableArea;
int availableWidth = (int)Math.Floor(printDocument.OriginAtMargins ? marginBounds.Width : (e.PageSettings.Landscape ? printableArea.Height : printableArea.Width));
int availableHeight = (int)Math.Floor(printDocument.OriginAtMargins ? marginBounds.Height : (e.PageSettings.Landscape ? printableArea.Width : printableArea.Height));
Rectangle rectangle = new Rectangle(0,0, availableWidth -1, availableHeight - 1);
g.DrawImage(_image, rectangle);
如果您的magicNumber_X为0,会发生什么情况?如果它是4呢?您的图片是否被页面边缘剪辑? – Jon
@Jon是的,确切地说...裁剪发生在实体印刷品上。只有魔术“3.5”没有剪裁。要清楚XPS文件本身显示没有裁剪......只有物理印刷。 –
大多数打印机在页面边缘都有一个不可打印的区域。如果您查看PrintCapabilities.PageImageableArea属性,则应该找到适合您的图像的偏移和范围。这确实意味着您在创建XPS文档之前需要了解您的目标打印机。或者,您可以假定页面周围有半英寸的边距,这应该会覆盖大多数打印机。 – Jon