XpsDocument忽略我的高度设置

时间:2014-07-17 16:04:13

标签: c# wpf printing preview xpsdocument

当我尝试在XPS文档上声明PageHeight时,我遇到了问题。

到目前为止我的代码看起来像这样:

private FixedDocumentSequence GetDocument(DocumentPaginator paginator)
{
    FixedDocumentSequence document = null;

    string tempFileName = System.IO.Path.GetTempFileName();
    File.Delete(tempFileName);

    using (var xpsDocument = new XpsDocument(tempFileName, FileAccess.ReadWrite, CompressionOption.NotCompressed))
    {
        var writer = XpsDocument.CreateXpsDocumentWriter(xpsDocument);

        var printTicket = new PrintTicket
        {
            PageMediaSize = new PageMediaSize(PageMediaSizeName.ISOA4, paginator.PageSize.Width, paginator.PageSize.Height),
            PageBorderless = PageBorderless.Borderless,
            PageMediaType = PageMediaType.None,
        };

        writer.Write(paginator, printTicket);

        //paginator.PageSize.Height = 1122
        var d = xpsDocument.GetFixedDocumentSequence();

        //d.DocumentPaginator.PageSize.Height = 1056
        document = d;
    }

    return document;
}

问题是我正在宣布我从这段代码中获得的PageSize Height为1122:

var pd = new PrintDialog();
var sz = new Size(pd.PrintableAreaWidth, pd.PrintableAreaHeight);

但是当我查看房产时

d.DocumentPaginator.PageSize.Height

我可以看到高度 1056 ,这个高度恰好是NorthAmericanLetter Page格式高度的高度,我已经指定了一个具有显式PageMediaSize的特定printTicket还有什么可能是错的?

修改

这是我编辑过的代码,但结果相同:

private FixedDocumentSequence GetDocument(DocumentPaginator paginator)
{
    FixedDocumentSequence document = null;

    string oldTempFileName = System.IO.Path.GetTempFileName();
    File.Delete(oldTempFileName);

    XpsDocument oldXpsDocument;
    using (oldXpsDocument = new XpsDocument(oldTempFileName, FileAccess.ReadWrite, CompressionOption.NotCompressed))
    {
        var writer = XpsDocument.CreateXpsDocumentWriter(oldXpsDocument);

        var printTicket = new PrintTicket
        {
            PageMediaSize = new PageMediaSize(PageMediaSizeName.ISOA4, paginator.PageSize.Width, paginator.PageSize.Height),
            PageBorderless = PageBorderless.Borderless,
            PageMediaType = PageMediaType.None,
        };

        writer.Write(paginator, printTicket);
    }

    //string newTempFileName = System.IO.Path.GetTempFileName();
    //File.Delete(newTempFileName);

    using (var newXpsDocument = new XpsDocument(oldTempFileName, FileAccess.Read, CompressionOption.NotCompressed))
    {
        var d = newXpsDocument.GetFixedDocumentSequence();
        document = d;
    }


    return document;
}

我查看了使用第一个使用块创建的文件,我仍然可以看到页面的高度是1056,输出1.fpage文件:

<FixedPage 
xmlns="http://schemas.microsoft.com/xps/2005/06" xmlns:x="http://schemas.microsoft.com/xps/2005/06/resourcedictionary-key"
xml:lang="und" 
Width="816" Height="1056">
<FixedPage.Resources>
<ResourceDictionary>
<LinearGradientBrush x:Key="b0" StartPoint="33,0" EndPoint="33,23" ColorInterpolationMode="SRgbLinearInterpolation" MappingMode="Absolute" SpreadMethod="Pad">

EDIT2:

找到解决我问题的方法。 在我的DocumentPaginator中,我不得不重写GetPage方法,在那里我返回一个新的DocumentPage(可视化),这个构造函数有一个重载,只有当我在那里设置PageSize时才能正确设置PageSize。

http://msdn.microsoft.com/en-us/library/system.windows.documents.documentpage(v=vs.110).aspx http://msdn.microsoft.com/en-us/library/ms597306(v=vs.110).aspx

我之前的代码:

public override DocumentPage GetPage(int pageNumber)
{
    // create page element (PageTemplate is a custom usercontrol that can hold content)
    var page = new PageTemplate(this, pageNumber + 1);

    // arrange the elements on the page
    page.Arrange(new Rect(0, 0, PageSize.Width, PageSize.Height));

    // return new document page
    return new DocumentPage(page);
}

现在使用第二个构造函数:

public override DocumentPage GetPage(int pageNumber)
{
    // create page element (PageTemplate is a custom usercontrol that can hold content)
    var page = new PageTemplate(this, pageNumber + 1);

    // arrange the elements on the page
    page.Arrange(new Rect(0, 0, PageSize.Width, PageSize.Height));

    // return new document page
    return new DocumentPage(page, PageSize, new Rect(0, 0, 10, 10), new Rect());
}

1 个答案:

答案 0 :(得分:1)

问题是您期望xpsDocument具有与您创建的文件相同的尺寸。

创建XpsDocument时,它将具有默认FixedDocumentSequence。由于您正在创建XpsDocument,而不是打开一个XpsDocument,因此您将获得默认的固定文档序列,这就是您将1056视为高度的原因 - 默认值是默认值。

但是,如果您查看FixedDocumentSequence底部的代码示例,您会看到LoadDocumentViewer,其中旧的XpsDocument替换为新的writer.Write(paginator, printTicket);

当您致电XpsDocument时,它会使用您提供的PrintTicket向您指定的文件写XpsDocument。现在,您需要使用该文件路径创建FixedDocumentSequence,然后在打开它时,您可以获取该文档的PrintTicket以及与string fileName = ... using Create XpsDocument at fileName Create XpsDocumentWriter Create and setup PrintTicket Write to the file using your DocumentPaginator and PrintTicket using Create XpsDocument reading from fileName document = opened XpsDocument GetFixedDocumentSequence() 属性匹配的大小。所以在伪代码中,你应该这样做:

d.DocumentPaginator.PageSize

修改

在上一次编辑中找到了。我使用带有A4大小设置的MS Word打印了一张XPS文档,所有页面也显示为1056 x 816。然后我使用A3尺寸创建了一个XPS文档,其格式为1587.36 x 1122.56。内部显然有一些我们看不到的东西;我的猜测是,由于页面尺寸在尺寸上相似,它只使用1056 x 816尺寸?谁真的知道......我建议向微软提交一份错误报告。

与此同时,可能会尝试更改d.PrintTicket甚至FixedPage个对象,并尝试让页面大小改变这种方式。如果有办法枚举{{1}},您也可以手动更改其设置。