using PdfSharp; using PdfSharp.Drawing; using System; using System.Collections.Generic; using System.IO; using System.IO.Packaging; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Windows.Threading; using System.Windows.Xps; using System.Windows.Xps.Packaging; namespace Tango.PDF { public class PdfWpfWriter { private List _elements; public PdfWpfWriter() { _elements = new List(); } public void AddElement(FrameworkElement element) { _elements.Add(element); } public void RemoveElement(FrameworkElement element) { _elements.Remove(element); } public Size GetA4Size() { XSize a4Size = PageSizeConverter.ToSize(PageSize.A4); return new Size(a4Size.Width, a4Size.Height); } public void Save(String filePath) { using (MemoryStream lMemoryStream = new MemoryStream()) { Package package = Package.Open(lMemoryStream, FileMode.Create); XpsDocument doc = new XpsDocument(package); XpsDocumentWriter writer = XpsDocument.CreateXpsDocumentWriter(doc); List stacks = new List(); StackPanel currentStack = new StackPanel(); stacks.Add(currentStack); XSize a4Size = PageSizeConverter.ToSize(PageSize.A4); foreach (var element in _elements.ToList()) { //element.Width = a4Size.Width * 0.80; currentStack.Children.Add(element); currentStack.Measure(new Size(Double.MaxValue, Double.MaxValue)); Size visualSize = currentStack.DesiredSize; currentStack.Arrange(new Rect(new Point(0, 0), visualSize)); currentStack.UpdateLayout(); if (visualSize.Height > a4Size.Height) { currentStack.Children.Remove(element); currentStack.UpdateLayout(); currentStack.InvalidateVisual(); currentStack = new StackPanel(); currentStack.Children.Add(element); stacks.Add(currentStack); } } Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, new Action(() => { })).Wait(); Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Render, new Action(() => { })).Wait(); FixedDocument fixedDoc = new FixedDocument(); foreach (var stack in stacks) { PageContent pageContent = new PageContent(); FixedPage fixedPage = new FixedPage(); fixedPage.Height = a4Size.Height; fixedPage.Width = a4Size.Width; fixedPage.Children.Add(stack); ((System.Windows.Markup.IAddChild)pageContent).AddChild(fixedPage); fixedDoc.Pages.Add(pageContent); } writer.Write(fixedDoc); doc.Close(); package.Close(); MemoryStream outStream = new MemoryStream(); PdfSharp.Xps.XpsConverter.Convert(lMemoryStream, outStream, true); File.WriteAllBytes(filePath, outStream.ToArray()); lMemoryStream.Dispose(); outStream.Dispose(); } } } }