Pergunta

Eu tenho um FlowDocument que varia em altura devido a um ItemsControl em um BlockUIContainer. Em alguns casos, o ItemsControl se estende além da altura da página. Existe uma maneira de escalar o FlowDocument para caber uma página (8,5" x 11" ) direito antes de imprimir, se necessário?

A partir de agora, o FlowDocument é nomeado 'doc' e o método para a impressão de que estou usando é:

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");
    }
Foi útil?

Solução

Eu sei que é um pouco tarde, mas aqui está a solução que eu vim acima com.

Primeiro, criamos uma interface que irá gerar as páginas do documento para nós. Cada página terá uma transformação de escala aplicada a ele antes de devolvê-lo.

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

Usá-lo é bastante simples:

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

Se você estiver interessado, aqui está como nós determinamos a escala. No nosso caso, o documento foi alargado passado a largura da página, mas pode ser facilmente modificado para acomodar a altura da página.

    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;
        }
    }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top