3

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

問題は、このコードから取得している 1122 の PageSize Height を宣言していることです。

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

しかし物件を調べてみると

d.DocumentPaginator.PageSize.Height

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

最初の using ブロックで作成されたファイルを調べたところ、1.fpage ファイルの出力であるページの高さが 1056 であることがわかります。

<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">

編集2:

私の問題の解決策を見つけました。私の DocumentPaginator では、GetPage メソッドをオーバーライドする必要があり、そこで新しい DocumentPage(visual) を返します。このコンストラクターには、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);
}

次に、2 番目のコンストラクターを使用します。

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());
}
4

1 に答える 1

1

xpsDocument問題は、作成したファイルと同じサイズを期待していることです。

を作成するXpsDocumentと、デフォルトの が作成されますFixedDocumentSequence。XpsDocument を作成していて、開いていないため、デフォルトの固定ドキュメント シーケンスを取得しています。これが1056、高さとして表示されている理由です。

ただし、 FixedDocumentSequenceの下部にあるコード例を見るLoadDocumentViewerと、古いものXpsDocumentが新しいものに置き換えられていることがわかります。

呼び出すと、指定した を使用して指定したファイルにwriter.Write(paginator, printTicket);が書き込まれます。次に、そのファイル パスを使用してを作成する必要があります。それを開くと、そのドキュメントの とプロパティに一致するサイズを取得できます。したがって、疑似コードでは、次のようにする必要があります。XpsDocumentPrintTicketXpsDocumentFixedDocumentSequencePrintTicket

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

編集:

あなたの最後の編集で良い発見。A4 サイズの設定で MS Word を使用して XPS ドキュメントを印刷すると、すべてのページが 1056 x 816 として表示されます。次に、A3 サイズを使用して XPS ドキュメントを作成すると、1587.36 x 1122.56 になります。目に見えない何かが内部で進行していることは明らかです。私の推測では、ページ サイズの寸法は似ているため、1056 x 816 の寸法を使用しているだけでしょうか? 誰が本当に知っているのか...マイクロソフトにバグレポートを提出することをお勧めします。

それまでの間、オブジェクトを変更しd.DocumentPaginator.PageSizeたりd.PrintTicket、ページ サイズを変更したりしてみてください。を列挙する方法がある場合は、FixedPage手動で設定を変更することもできます。

于 2014-07-17T18:14:05.293 に答える