5

BlockUIContainerのItemsControlが原因で高さが異なるFlowDocumentがあります。場合によっては、ItemsControlがページの高さを超えて拡張されます。必要に応じて、印刷の直前にFlowDocumentをページ(8.5 "X 11")に合わせて拡大縮小する方法はありますか?

現在のところ、FlowDocumentの名前は「doc」で、使用している印刷方法は次のとおりです。

private void Print_Click(object sender, RoutedEventArgs e)
    {

        PrintDialog pd = new PrintDialog();
        doc.PageHeight = pd.PrintableAreaHeight;
        doc.PageWidth = pd.PrintableAreaWidth;
        doc.ColumnGap = 0;
        doc.ColumnWidth = pd.PrintableAreaWidth;
        IDocumentPaginatorSource dps = doc;
        pd.PrintDocument(dps.DocumentPaginator, "Sheet");
    }
4

1 に答える 1

3

少し遅れていることは承知していますが、これが私が思いついた解決策です。

まず、ドキュメントページを生成するラッパーを作成します。各ページには、ページを返す前にスケール変換が適用されます。

public class FittedDocumentPaginator : DocumentPaginator
{
    public DocumentPaginator Base { get; private set; }
    public double Scale { get; private set; }
    private readonly ScaleTransform _sTransform;

    public FittedDocumentPaginator( DocumentPaginator baseDp, double scale )
    {
        if ( baseDp == null )
            throw new ArgumentNullException( "baseDp" );

        Base = baseDp;
        Scale = scale;
        _sTransform = new ScaleTransform( scale, scale );
    }

    public override DocumentPage GetPage( int pageNumber )
    {
        var page = Base.GetPage( pageNumber );
        ( (ContainerVisual)page.Visual ).Transform = _sTransform;

        return page;
    }

    public override bool IsPageCountValid
    {
        get { return Base.IsPageCountValid; }
    }

    public override int PageCount
    {
        get { return Base.PageCount; }
    }

    public override Size PageSize
    {
        get { return Base.PageSize; }
        set { Base.PageSize = value; }
    }

    public override IDocumentPaginatorSource Source
    {
        get { return Base.Source; }
    }
}

それを使用することはかなり簡単です:

    private void PrintDocument( PrintDialog pd, FlowDocument document, double scale, string title )
    {
        DocumentPaginator dp = ( (IDocumentPaginatorSource)document ).DocumentPaginator;
        FittedDocumentPaginator fdp = new FittedDocumentPaginator( dp, scale );

        pd.PrintDocument( fdp, title );
    }

興味のある方は、こちらがスケールの決定方法です。この場合、ドキュメントはページ幅を超えて拡張されましたが、ページの高さに合わせて簡単に変更できます。

    private void Print( FlowDocument document, string title, double documentWidth )
    {
        var pd = new PrintDialog();

        if ( pd.ShowDialog() == true )
        {
            // Set the printing margins.
            Thickness pageMargins = document.PagePadding;
            document.PagePadding = new Thickness( 15.0 );

            // In our case, the document's width is NaN so we have to navigate the visual tree to get the ActualWidth, which is represented by 'documentWidth'.
            double scale = documentWidth / pd.PrintableAreaWidth;

            if ( scale < 1.0 )
            {
                // The report fits on the page just fine. Don't scale.
                scale = 1.0;
            }

            double invScale = 1 / scale;

            document.PageHeight = pd.PrintableAreaHeight * scale;
            document.PageWidth = pd.PrintableAreaWidth * scale;

            DocumentPaginator dp = ( (IDocumentPaginatorSource)document ).DocumentPaginator;
            FittedDocumentPaginator fdp = new FittedDocumentPaginator( dp, invScale );

            pd.PrintDocument( fdp, title );

            // Restore the original values so the GUI isn't altered.
            document.PageHeight = Double.NaN;
            document.PageWidth = Double.NaN;
            document.PagePadding = pageMargins;
        }
    }
于 2011-04-13T22:27:52.080 に答える