Сохранить `Window` как pdf - PullRequest
0 голосов
/ 10 мая 2018

У меня есть класс ReportViewerView, который наследует класс Window . Я хочу сохранить содержимое этого класса в файл PDF.

Я уже могу открыть этот класс как окно с ShowDialog(), и после открытия у этого окна есть возможность сохранить файл в формате Acrobat (pdf), который работает правильно. Однако я хочу сохранить содержимое этого окна без , прежде всего открыв диалоговое окно. У меня есть все данные, необходимые для открытия этого окна, и я хочу сохранить его немедленно, в заранее определенном месте файла, без необходимости ввода данных пользователем. Как я могу это сделать?

public void SaveReport(MyClass report, string title)
{
    ReportViewerView reportViewer = new ReportViewerView(report, title);
    //reportViewer.ShowDialog();

    // is it even possible to make this a byte[] ?
    byte[] reportBytes = Convert.FromBase64String(reportViewer.ToString());
    System.IO.File.WriteAllBytes("C:\\Temp\\Test_Save.pdf", reportBytes);

    //Maybe a FileStream?
    using (FileStream fs = new FileStream("C:\\Temp\\Test_Save.pdf", FileMode.Open))
    {  // Maybe not a TextReader... what would a 'Window' use?
        using (System.Xml.XmlTextReader xmlReader = new System.Xml.XmlTextReader(fs))
        {
            reportViewer.Serialize(xmlReader); // cannot serialize anyway
        }
    }
}

Класс ReportViewerView - это устаревший код на моем конце, который связан с классом Telerik ReportViewer. Класс MyClass является устаревшим кодом, унаследованным от Telerik.Reporting.Report. Я подозреваю, что класс Windows содержит мой ответ, но если это поможет, то это ReportViewerView.xaml.cs:

public partial class ReportViewerView : Window
{
    public ReportViewerView(MyClass reportDoc, string title)
    {
        InitializeComponent();

        InstanceReportSource rs = new InstanceReportSource();
        rs.ReportDocument = reportDoc;
        this.reportViewer1.ReportSource = rs;
        this.Title = title;
    }
}

Класс MyClass немного громоздок для полного копирования / вставки, но он должен делать все, что может его родительский Telerik.Reporting.Report. Вот короткая версия:

partial class MyClass
{
    private void InitializeComponent()
    {
        // lot of stuff
    }

    private Telerik.Reporting.PageHeaderSection pageHeaderSection1;
    private Telerik.Reporting.DetailSection detail;
    private Telerik.Reporting.PageFooterSection pageFooterSection1;
    private Telerik.Reporting.TextBox textBox1;
    private Telerik.Reporting.TextBox TitleTB;
    private Telerik.Reporting.TextBox CustomerNameTB;
    private Telerik.Reporting.TextBox ReportDateTB;
    private string dateString
    {
        get { return DateTime.Now.ToString("g", CultureInfo.CreateSpecificCulture("en-us")); }
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...