рдХреБрдЫ рд╣рдлрд╝реНрддреЗ рдкрд╣рд▓реЗ, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рдПрдХ рдкреАрдбреАрдПрдл рдкреАрдврд╝реА рдХрд╛ рдХрд╛рд░реНрдп рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ред
рдмреЗрд╢рдХ, рдореИрдВ, WPF UI рдХреЗ рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рддреБрд░рдВрдд C # рдХреЛрдб рдореЗрдВ рд╕рднреА рдкреАрдбреАрдПрдл рдкреНрд░рд╛рдЗрдореЗрдЯрд┐рд╡ рдХреЗ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЛ рдХреЛрдб рдХрд░рдиреЗ рдХреЗ рдХрдареЛрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рд╡рд┐рд░реЛрдз рдХрд┐рдпрд╛ред
рдФрд░ рдЧреНрд░рд╛рд╣рдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, HTML рд╕реЗ рдкреАрдбреАрдПрдл рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рднреБрдЧрддрд╛рди рдХрдирд╡рд░реНрдЯрд░ рдЦрд░реАрджрдиреЗ рдХрд╛ рд╡рд┐рд░реЛрдз рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛ред
рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд▓рдЧрддрд╛ рд╣реИ - рд╣рдо HTML рдорд╛рд░реНрдХрдЕрдк рдХреЗ рд╕рд╛рде рдПрдХ рд▓рд╛рдЗрди рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ, рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреАрдврд╝реА рдХреЗ рд▓рд┐рдП рдбреЙрдЯрд▓рд╛рдЗрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдФрд░ рдХрдИ рднреБрдЧрддрд╛рди рдХрд┐рдП рдЧрдП рдХрдиреНрд╡рд░реНрдЯрд░реНрд╕ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдкреАрдбреАрдПрдл рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдПрдХ рдкреАрдбреАрдПрдл рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреА рдкреГрд╖реНрда рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рдПрдХрдорд╛рддреНрд░ рдШрд╛рдд рдЦрд░рд╛рдм рдПрдЪрдЯреАрдПрдордПрд▓ рд╕рдВрдЧрддрддрд╛ рд╣реИред
рдЬреИрд╕реЗ рд╣реА рдореИрдВрдиреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдЦреБрджрд╛рдИ рд╢реБрд░реВ рдХреА, рдПрдХ рд╕рд╣рдпреЛрдЧреА рдиреЗ
рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдПрдХ рд▓реЗрдЦ рдХрд╛ рд▓рд┐рдВрдХ рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ред
рдореИрдВрдиреЗ рд▓реЗрдЦ рд╕реЗ рд╕реАрдЦрд╛ рд╣реИ рдХрд┐ рдПрдХ рдПрдХреНрд╕рдкреАрдПрд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕реЗ рдкреАрдбреАрдПрдл рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ (рдпрд╣ рдкреНрд░рд╛рд░реВрдк рдбрдмреНрд▓реНрдпреВрдкреАрдПрдл рдлрд╝реНрд▓реЛрдбрдХреНрд╡рд╛рдореЗрдВрдЯ рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рд╣реИ)ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореБрдлреНрдд PDFSharp рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреАрдврд╝реА рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рд╕реВрддреНрд░реЛрдВ рдХреЛ
GitHub рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛
рд╣реИ ред
UPD : рдпрд╣
рдкрд╣рд▓реА рдмрд╛рд░ рдирд╣реАрдВ рд╣реИ рдЬрдм рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБ рдХрд┐ рдХрд┐рд╕реА рд▓реЗрдЦ рдХреЛ рдХреИрд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ (рдкрд╣рд▓реЗ рдиреБрдХрд╕рд╛рди рдкреНрд░рдХрд╛рд╢рди рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдереЗ рдФрд░ рдореБрдЦреНрдп рд╕рд╛рдордЧреНрд░реА рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ), рдЬрдмрдХрд┐ рдХрд░реНрдо рдХрд╛ рд╡рд┐рд▓рдпред рдореБрдЭреЗ рдкреНрд░реЗрд░рдгрд╛, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИред рдореБрд╢реНрдХрд┐рд▓ рди рд╣реЛрдиреЗ рдкрд░ рдЕрд╕рдВрддреБрд╖реНрдЯ рд╡реНрдпрдХреНрддрд┐ рдХрд┐рд╕ рдмрд╛рдд рд╕реЗ рдЕрд╕рдВрддреБрд╖реНрдЯ рд╣реЛрддрд╛ рд╣реИредрддреНрдпрд╛рдЧ
рдЖрдкрдХреЗ рдзреНрдпрд╛рди рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП рдЧрдП рд╕реНрд░реЛрдд рдХреЛрдб рдЕрдиреБрд╕рд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рдмрдирд╛рддреЗ рд╣реИрдВред рд▓реЗрдЦ рдХреЛ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдХрд┐рд╕реА рднреА рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рдХрд╛ рдкрд╛рд▓рди рдирд╣реАрдВ рдХрд┐рдпрд╛ред рд╕реНрд░реЛрдд рдХреЛрдб рдПрдХ рд╕рд░рд▓ "рдХреЛрдб рдмрд┐рд╣рд╛рдЗрдВрдб" рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИред рдпрд╣ рд╕рд╛рд░ рдХреА рдзрд╛рд░рдгрд╛ рдореЗрдВ рдЖрд╕рд╛рдиреА рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддред рдкреАрдбреАрдПрдл рдкреАрдврд╝реА рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реАред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдХреЛрдб рдХреЗ рдореБрдЦреНрдп рдЯреБрдХрдбрд╝реЛрдВ рдХреЛ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╕реНрд░реЛрдд рдореЗрдВ рдЖрдк DotLiquid рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдХреЗ рд░реВрдк рдореЗрдВ
рдЧрддрд┐рд╢реАрд▓ рдХреЗ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЖрдПрдВрдЧреЗред рдпрд╣ рднреА рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╕рд╛рджрдЧреА рдФрд░ рдЧрддрд┐ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
DotLiquid рд╡реЗрдмрд╕рд╛рдЗрдЯ рдореЗрдВ рдЖрдкрдХреА рдЕрдкрдиреА рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдХреИрд╕реЗ рдПрдиреЛрдЯреЗрдЯ рдХрд░рдирд╛ рд╣реИ, рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рд╣реИ рддрд╛рдХрд┐ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдпрд╣рд╛рдВ рдЖрдк рдЕрдкрдиреЗ рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдЕрдкрдиреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдкрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЦреИрд░, рдпрд╣ рднреА рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╣реИ рдХрд┐ PDFSharp рдиреЗ FlowDocument / XPS рдХреЗ рдЫрджреНрдо-рдлрд╝реЙрдиреНрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдПрдХреНрд╕рдкреАрдПрд╕ рдЕрдирд░реЗрдЯреЗрдб рд╕реВрдЪреА рдорд╛рд░реНрдХрд░реЛрдВ рдХреЛ рдЦрд╛рд▓реА рд╡рд░реНрдЧреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкреАрдбреАрдПрдл рдореЗрдВ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдбрд┐рдмрдЧ рдореЛрдб рдореЗрдВ, рдореБрдЭреЗ рдПрдХ рдбрд┐рдмреЗрдЯ рдЖрдпрд╛рдд / рдирд┐рд░реНрдпрд╛рдд рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдбреАрдмрдЧ.рдПрд╕рд░реНрд╕ (...) рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреА рдЕрднреА рддрдХ рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХреА рдЧрдИ рд╣реИред рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред
рдЯреНрд░реЗрдирд┐рдВрдЧ
рдиреАрдЪреЗ рдЖрд╡рд╢реНрдпрдХ рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ:
- рд╣рдо рд╕рдВрд╢реЛрдзрд┐рдд PDFSharp рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╛рдЗрдЯ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рд╡рд╣рд╛рдВ рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдЕрд╕реЗрдВрдмрд▓реА рдпрд╛ рд╕реНрд╡рдпрдВ рд╕реНрд░реЛрдд рдХреЛрдб рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рд╡рд┐рдХрд▓реНрдк PDFSharp рд╕рдВрд╕реНрдХрд░рдг 1.2 - 1.31, рд╕рдорд╛рд╡реЗрд╢реА рд╣реИред
- NuGet рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ DotLiquid рд▓рд╛рдЗрдмреНрд░реЗрд░реА (рд▓реЗрдЦрди рдХреЗ рд╕рдордп рд╕рдВрд╕реНрдХрд░рдг 1.7.0) рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ (рдпрджрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рддреЛ Nuget рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ)
- System.Printing рдФрд░ ReachFramework рд╡рд┐рдзрд╛рдирд╕рднрд╛рдУрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдЙрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ рдЬрд┐рд╕рдореЗрдВ рдкреАрдбреАрдПрдл рдЬреЗрдирд░реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛
рдореБрдЦреНрдп рдЦрд┐рдбрд╝рдХреА
рдиреАрдЪреЗ рдореБрдЦреНрдп рд╡рд┐рдВрдбреЛ рдХрд╛ рд▓реЗрдЖрдЙрдЯ рд╣реИред
<Window x:Class="Solution.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="480" Width="640"> <Grid> <Grid.RowDefinitions> <RowDefinition></RowDefinition> <RowDefinition Height="Auto"></RowDefinition> </Grid.RowDefinitions> <FlowDocumentReader x:Name="DocViewer"> <FlowDocument> <FlowDocument.Resources> <Style TargetType="TextBlock"> <Setter Property="FontSize" Value="14"/> <Setter Property="Margin" Value="5"/> </Style> </FlowDocument.Resources> <BlockUIContainer> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/> <ColumnDefinition /> </Grid.ColumnDefinitions> <Ellipse Fill="#003481" Width="5" Height="5" Margin="5"/> <TextBlock Text="Title" FontWeight="Bold" Grid.Column="1"/> <TextBlock Text="Description" Grid.Column="2"/> </Grid> </BlockUIContainer> </FlowDocument> </FlowDocumentReader> <StackPanel Grid.Row="1" Orientation="Horizontal"> <Button Click="ParseButton_OnClick">Parse</Button> <Button Click="ButtonBase_OnClick">Print</Button> </StackPanel> </Grid> </Window>
рдпрд╣рд╛рдБ рд╣рдо рдПрдХ
FlowDocumentReader рджреЗрдЦрддреЗ рд╣реИрдВ рдЬреЛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП FlowDocument рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ред рдорд╛рд░реНрдХрдЕрдк рдореЗрдВ, рдЖрдк рд╣рд╛рд░реНрдб-рдХреЛрдбреЗрдб рдлрд╝реНрд▓реЛрдбрдХреНрд╡рд╛рдореЗрдВрдЯ рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореИрдВ рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ рдбрд┐рдЬрд╝рд╛рдЗрдирд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реВрдБред
рдЖрдк рдпрд╣ рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдореИрдВ рд╕рд╛рдорд╛рдиреНрдп рдирд┐рдпрдВрддреНрд░рдг рдФрд░ WPF рд╢реИрд▓рд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдпрд╣ PDFs рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП FlowDocument рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рд╢рд╛рд▓ рдмреЛрдирд╕ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдореИрдВ рдЕрдкрдиреЗ WPF рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдФрд░ рд╢реИрд▓реА рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдПрдХ рдордзреНрдпрд╕реНрде рдХреЗ рд░реВрдк рдореЗрдВ HTML рдХреЗ рд╕рд╛рде рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП, рд╕реАрдПрд╕рдПрд╕ рд╢реИрд▓рд┐рдпреЛрдВ рдФрд░ HTML рдХреЗ рдЯреБрдХрдбрд╝реЛрдВ рдХреА рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХрд╛ рдЕрд▓рдЧ рд╕реЗ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛, рдЬрд┐рд╕реЗ рдЕрднреА рднреА рдХрд┐рд╕реА рднреА рддрд░рд╣ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд╕рдВрджрд░реНрдн
рдПрдХ рдбреЗрдЯрд╛ рд╕рдВрджрд░реНрдн рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдореБрдЦреНрдп рд╡рд┐рдВрдбреЛ рдХреЗ рдХреЛрдб рдХреЗ рдкреАрдЫреЗ рдПрдХ рдирд┐рдЬреА рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реА, рдЬрд┐рд╕рдореЗрдВ DotLiquid рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдПрдХ рдЧрддрд┐рд╢реАрд▓ рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рд╣рд╛рд░реНрдб рдХреЛрдХреЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
private DotLiquid.Hash CreateDocumentContext() { var context = new { Title = "Hello, Habrahabr!", Subtitle = "Experimenting with dotLiquid, FlowDocument and PDFSharp", Steps = new List<dynamic>{ new { Title = "Document Context", Description = "Create data source for dotLiquid Template"}, new { Title = "Rendering", Description = "Load template string and render it into FlowDocument markup with Document Context given"}, new { Title = "Parse markup", Description = "Use XAML Parser to prepare FlowDocument instance"}, new { Title = "Save to XPS", Description = "Save prepared FlowDocument into XPS format"}, new { Title = "Convert XPS to PDF", Description = "Convert XPS to WPF using PDFSharp"}, } }; return DotLiquid.Hash.FromAnonymousObject(context); }
рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдЕрд╕реНрд╡реАрдХрд░рдг рдореЗрдВ рд▓рд┐рдЦрд╛ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдЖрдкрдХреЗ рдкрд╛рд╕ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбреАрдЯреАрдУ рдпрд╛ рд╡реНрдпреВрдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХрдирд╡рд░реНрдЯрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдбреЙрдЯрд▓реАрдХрд╛рдЗрдб рдкреЗрдЬ рдкрд░ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рдореИрдиреБрдЕрд▓ рдореЗрдВ
, рдпрд╣ рд▓рд┐рдЦрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХрд┐рд╕реА рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рди рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдордирдорд╛рдиреЗ рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдпрджрд┐ рдЖрдк рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдПрдХ рдбреЗрдЯрдЯрд╛рдЗрдо рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдмрд┐рдирд╛ ToString () рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдорд┐рд▓ рдЬрд╛рдПрдЧрд╛ред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рд╡рд╕реНрддреБ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреБрдЫ
BlaBlaUser рдХреЛ
рдЪрд╛рд▓реВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ , рддреЛ DotLiquid рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХ рддреНрд░реБрдЯрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ред рдФрд░ рдпрд╣, рд╡реИрд╕реЗ, рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рддреБрд░рдВрдд рдЙрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрдерд╛рди рдХреЛ рджреЗрдЦреЗрдВрдЧреЗ рдЬрд╣рд╛рдВ рдЖрдкрдиреЗ рдЧрд▓рддреА рдХреА рдереА, рдЬрдмрдХрд┐ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЕрднреА рднреА рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЯреЗрдореНрдкрд▓реЗрдЯ
<FlowDocument xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <FlowDocument.Resources> <Style TargetType="TextBlock"> <Setter Property="FontSize" Value="14"/> <Setter Property="Margin" Value="5"/> <Setter Property="TextWrapping" Value="Wrap"/> </Style> </FlowDocument.Resources> <Paragraph FontSize="24"> <Bold>{{ Title }}</Bold> </Paragraph> <Paragraph FontSize="16"> {{ Subtitle }} </Paragraph> <Paragraph FontSize="16"> <Bold>Steps to generate PDF:</Bold> </Paragraph> {% for step in Steps -%} <BlockUIContainer> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/> <ColumnDefinition /> </Grid.ColumnDefinitions> <Ellipse Fill="#003481" Width="5" Height="5" Margin="5"/> <TextBlock Text="{{ step.Title }}" Foreground="#003481" FontWeight="Bold" Grid.Column="1"/> <TextBlock Text="{{ step.Description }}" Grid.Column="2"/> </Grid> </BlockUIContainer> {% endfor -%} </FlowDocument>
рдзреНрдпрд╛рди рд░рдЦреЗрдВ, рдЯреЗрдХреНрд╕реНрдЯрдмреНрд▓реЙрдХред рдЯреЗрдХреНрд╕реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рд╕реАрдзреЗ DotLiquid рд╕рдВрджрд░реНрдн рдореЗрдВ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдпрд╣ рдиреЗрд╕реНрдЯреЗрдб CDATA рдмреНрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрдЧрд╛:
<TextBlock Foreground="#003481" FontWeight="Bold" Grid.Column="1"> <![CDATA[ {{ step.Title }} ]]> </TextBlock>
рдпрд╣ рдЖрдкрдХреЛ XML рдкреНрд░рд╛рд░реВрдк рдХреЗ рд╕рд╛рде рдЕрд╕рдВрдЧрдд рдкрд╛рддреНрд░реЛрдВ рд╕реЗ рдмрдЪрд╛рдПрдЧрд╛ред
рд░реЗрдВрдбрд░рд┐рдВрдЧ рдФрд░ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдлрд╝реНрд▓реЛрдбрдХреНрд▓реЛрдореЗрдВрдЯ
private void ParseButton_OnClick(object sender, RoutedEventArgs e) { using (var stream = new FileStream("Templates\\report1.lqd", FileMode.Open)) { using (var reader = new StreamReader(stream)) { var templateString = reader.ReadToEnd(); var template = dotTemplate.Parse(templateString); var docContext = CreateDocumentContext(); var docString = template.Render(docContext); DocViewer.Document = (FlowDocument) XamlReader.Parse(docString); } } }
рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИред рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд╕рд╛рде рдлрд╛рдЗрд▓ рд╕реНрдЯреНрд░реАрдо рдЦреЛрд▓реЗрдВ, рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╕рдВрджрд░реНрдн рдмрдирд╛рдПрдВ рдФрд░ рдлрд╝реНрд▓реЛрдбрдХреНрд╡рд╛рдореЗрдВрдЯрдореЗрдВрдЯ рдорд╛рд░реНрдХрдЕрдк рд░реЗрдВрдбрд░ рдХрд░реЗрдВред XamlReader рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдкрд░рд┐рдгрд╛рдореА рдорд╛рд░реНрдХрдЕрдк рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдмрдирд╛рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╣рдорд╛рд░реЗ FlowDocumentReader рдореЗрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВред рдпрджрд┐ рд╕рдм рдХреБрдЫ рд╣рдореЗрдВ рд╕реВрдЯ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рдкреАрдбреАрдПрдл рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред
рдкреАрдбреАрдПрдл рдЬрдирд░реЗрд╢рди
private void ButtonBase_OnClick(object sender, RoutedEventArgs e) { using (var stream = new FileStream("doc.xps", FileMode.Create)) { using (var package = Package.Open(stream, FileMode.Create, FileAccess.ReadWrite)) { using (var xpsDoc = new XpsDocument(package, CompressionOption.Maximum)) { var rsm = new XpsSerializationManager(new XpsPackagingPolicy(xpsDoc), false); var paginator = ((IDocumentPaginatorSource)DocViewer.Document).DocumentPaginator; rsm.SaveAsXaml(paginator); rsm.Commit(); } } stream.Position = 0; var pdfXpsDoc = PdfSharp.Xps.XpsModel.XpsDocument.Open(stream); PdfSharp.Xps.XpsConverter.Convert(pdfXpsDoc, "doc.pdf", 0); } }
рдФрд░ рдпрд╣рд╛рдБ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИред рдПрдХ XPS рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкреИрдХреЗрдЬ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, XPS рдмрд╣реБрдд рд╕рд╛рд░реЗ XML рдФрд░ рдЕрдиреНрдп рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЬрд╝рд┐рдк рд╕рдВрдЧреНрд░рд╣ рд╣реИ)ред рдкрд╣рд▓реЗ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ FlowDocument XPS рдкреИрдХреЗрдЬ рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЧрдпрд╛ рд╣реИред (рдмрдВрдж рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ!) XPS рдкреИрдХреЗрдЬ рдХреА рд╕реНрдЯреНрд░реАрдо PDFSharp рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ XPS рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд░рд╣рд╛ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдП рдЧрдП рдПрдХреНрд╕рдкреАрдПрд╕ рдХреЛ рдкреАрдбреАрдПрдл рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдирд┐рд╖реНрдХрд░реНрд╖
рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдЙрди рд▓рд╛рднреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рджреЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВрдиреЗ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдЦреБрдж рдХреЗ рд▓рд┐рдП рдкрд╣рдЪрд╛рдирд╛ рд╣реИред
- рдирд┐: рд╢реБрд▓реНрдХ - рд╣рдо рдореБрдХреНрдд рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ (рдПрдордЖрдИрдЯреА) рдХреА рдорджрдж рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗ
- рдПрдХ рдордзреНрдпрд╕реНрде рдХреЗ рд░реВрдк рдореЗрдВ FlowDocument - рдпрд╣ рдкреГрд╖реНрда рд╕рдВрд░рдЪрдирд╛ рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рднреАрддрд░ WPF рдирд┐рдпрдВрддреНрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ рдореВрд▓ рд╕рдорд░реНрдерди рд╣реИ
- рд╕реНрдЯрд╛рдЗрд▓рд┐рдВрдЧ - рдлрд╝реНрд▓реЛрдбреАрдХреЗрдВрдбрдореЗрдВрдЯ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╢реИрд▓рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдбрдмреНрд▓реНрдпреВрдкреАрдПрдл рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рд╕реНрдЯрд╛рдЗрд▓ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ
- рдЕрдиреНрддрд░рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛ - рдХреНрдпреЛрдВрдХрд┐ рдЖрдк WPF рдирд┐рдпрдВрддреНрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд┐рд░ рдкреАрдбреАрдПрдл рдореЗрдВ "рдкреНрд░рд┐рдВрдЯрдЖрдЙрдЯ" рд╕реЗ рдкрд╣рд▓реЗ, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдХреБрдЫ рдмрджрд▓рд╛рд╡ рдФрд░ рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдмрд╛рдзреНрдпрдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрднрд╡ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ - рдЖрдкрдХреЛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рд╕реНрдкреИрдЪрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд┐рдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)ред
- рд╡рд┐рдЬрд╝реБрдЕрд▓ рдбрд┐рдЬрд╝рд╛рдЗрдирд░ - рдореИрдВ рдЯреЗрдореНрдкрд▓реЗрдЯ рддреИрдпрд╛рд░ рдХрд░рддреЗ рд╕рдордп рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдбрд┐рдЬрд╝рд╛рдЗрдирд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдБред рдПрдХрдорд╛рддреНрд░ рд╢рд┐рдХрд╛рдпрдд рдпрд╣ рд╣реИ рдХрд┐ DotLiquid рдлреЙрд░реНрдо "{{someProp}}" рдХреЗ рдмрд╛рдЗрдВрдбрд░реНрд╕ XAML рдорд╛рд░реНрдХрдЕрдк рдХреЗ рд╕рд╛рде рдЕрд╕рдВрдЧрдд рд╣реИрдВред рдЖрдк "{}" рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: <TextBlock рдкрд╛рда = " {} {{step.Title}}" ... />
рдЖрдкрдХреЗ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!