provençal le breton
provençal le breton

Reputation: 1438

Print a letter on many pages

I have a print button, that must print two documents : -A letter written by this person Secondly, in the second print, I must take care of a possibly multiPage letter. How can I do this?

The letter is inside a textbox, on my page.

Here is my code :

void btPrint_Click(object sender, RoutedEventArgs e)
        {

            if (itmCandidatSelect.LettreMotiv != null || itmCandidatSelect.LettreMotiv != "")
            {
                _lineIndex = 0;
                _documentBodyLines = new List<string>();
                string[] lines = tbLettreMotiv.Text.Split(new char[] { '\r' }, StringSplitOptions.None);
                _documentBodyLines.AddRange(lines);

                PrintDocument maLettreMotiv = new PrintDocument();
                //maLettreMotiv.BeginPrint += new EventHandler<BeginPrintEventArgs>(maLettreMotiv_BeginPrint);
                //maLettreMotiv.EndPrint += new EventHandler<EndPrintEventArgs>(maLettreMotiv_EndPrint);
                maLettreMotiv.PrintPage += new EventHandler<PrintPageEventArgs>(maLettreMotiv_PrintPage);

                maLettreMotiv.Print("LettreMotivation_" + itmCandidatSelect.NomCandidat + "_" + itmCandidatSelect.PrenomCandidat);

            }

}

    int _lineIndex;
        List<string> _documentBodyLines;

void maLettreMotiv_PrintPage(object sender, PrintPageEventArgs e)
        {
            PrintLettreMotivTemplate page = new PrintLettreMotivTemplate();
            page.SetHeaderAndFooterText("Lettre de motivation", "");
            int numberOfLinesAdded = 0;
            while (_lineIndex < _documentBodyLines.Count)
            {
                page.AddLine(_documentBodyLines[_lineIndex]);
                page.Measure(new Size(e.PrintableArea.Width, double.PositiveInfinity));
                if (page.DesiredSize.Height > e.PrintableArea.Height && numberOfLinesAdded > 1)
                {
                    page.RemoveLastLine();
                    e.HasMorePages = true;
                    break;
                }
                _lineIndex++;
                numberOfLinesAdded++;

            }
             e.PageVisual = page;
        }

My template :

<UserControl x:Class="erecrutement_procclass.Views.PrintLettreMotivTemplate"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             Width="815" 
             Height="1024"
             mc:Ignorable="d"    
             d:DesignHeight="300" 
             d:DesignWidth="400">
<Grid x:Name="documentRoot">
    <Grid.RowDefinitions>
        <RowDefinition Height="25"/>
        <RowDefinition />
        <RowDefinition Height="25"/>
    </Grid.RowDefinitions>
    <TextBlock x:Name="headerTextBlock" HorizontalAlignment="Center" />
    <TextBlock x:Name="bodyTextBlock" Grid.Row="1" TextWrapping="Wrap" Margin="5,5,5,5"/>
    <TextBlock x:Name="footerTextBlock" HorizontalAlignment="Center" Grid.Row="2"/>
</Grid>


 public partial class PrintLettreMotivTemplate : UserControl
    {
        public PrintLettreMotivTemplate()
        {
            InitializeComponent();
        }

        public void SetHeaderAndFooterText(string header, string footer)
        {
            headerTextBlock.Text = header;
            footerTextBlock.Text = footer;
        }


        public void AddLine(string line)
        {
            bodyTextBlock.Inlines.Add(line);
            bodyTextBlock.Inlines.Add(new LineBreak());
        }



        public void RemoveLastLine()
        {
            for (int index = 0; index < 2; index++)
            {
                bodyTextBlock.Inlines.RemoveAt(bodyTextBlock.Inlines.Count - 1);
            }
        }
    }

But, When it should go over one page, it stopped, and I only have one pages, and a piece of the letter is missing.

How can I fix this?

Thank you.

Upvotes: 2

Views: 397

Answers (2)

Chui Tey
Chui Tey

Reputation: 5584

The reason is this. In PrintLettreMotivTemplate.xaml

<UserControl x:Class="DelmePrint.PrintLettreMotivTemplate"
             Width="815" 
             Height="1024"
             >
    <Grid x:Name="documentRoot">
        ...
    </Grid>
</UserControl>

You've set the height of the printable area to 1024. When I stepped through the code,

/* DesiredSize always (793, 1024)
   PrintableArea always (793, 1122) */
if (page.DesiredSize.Height > e.PrintableArea.Height)

So the code keeps adding lines to the middle section of the page.

To solve the problem, you need to change the Height in PrintLettreMotivTemplate to MinHeight. This way, the letter will overflow when there are too many lines.

<UserControl x:Class="DelmePrint.PrintLettreMotivTemplate"
             Width="815" 
             MinHeight="1024"
             >
    <Grid x:Name="documentRoot">
        ...
    </Grid>
</UserControl>

Upvotes: 3

scetiner
scetiner

Reputation: 361

Try with below property;

maLettreMotiv.PrintPage += (s, args) =>
            {
                Candidat monCandidat = this.itmCandidatSelect;

                PrintLettreMotivTemplate monTemplatePrint = PrintableAreaLettreMotiv.printTemplateLettreMotiv(monCandidat);
                monTemplatePrint.Width = args.PrintableArea.Width;
                monTemplatePrint.Height = args.PrintableArea.Height;
                args.HasMorePages = true;
                args.PageVisual = monTemplatePrint;
            };

Upvotes: 2

Related Questions