Как сохранить шрифт rdlc при публикации? - PullRequest
0 голосов
/ 20 марта 2019

У меня есть форма Windows (C #, .NET 4.6.1), которая печатает отчет rdlc без средства просмотра отчетов. В Visual Studio отчет выглядит хорошо; шрифт и поля точно такие же, как в дизайнере отчетов. Когда я публикую свое приложение и попробую его на другом компьютере, оно меняет шрифт и обрезает левое боковое поле. Я попытался изменить шрифты и поля в конструкторе отчетов и изменить поля, которые я передаю принтеру (см. Код ниже), но на опубликованном компьютере он всегда печатает другим шрифтом и вырезами на левой стороне. Как я могу это исправить?

На данный момент я предполагаю, что (1.) Мне нужно добавить какой-то другой файл при публикации. Я включил rdlc, поэтому я не уверен, что еще включить. Может быть, некоторые ссылки на DLL для отчетности? (2.) Мне нужно передать имя шрифта чему-либо в классе PrintRDLCReport. Опять же, не уверены, как это будет выглядеть. (3.) Мне нужен другой тип действия по сборке, а не содержимое. Хотя я не знаю, что еще выбрать.

Любые идеи будут оценены. Я опубликовал это вчера после того, как он работал на моей машине; Мне просто нужно, чтобы он работал на компьютере клиента.

Вот отсканированное изображение распечатанного отчета. Верхняя строка - из отчета, когда я запускаю приложение через Visual Studio (именно так я и хочу, чтобы оно выглядело). Суть в том, что я опубликовал и установил приложение с другого компьютера.

enter image description here

Вот код для прямой печати моего отчета:

            LocalReport report = new LocalReport();
            report.ReportPath = @".\Reports\TrayLabels.rdlc";
            report.DataSources.Add(
                new Microsoft.Reporting.WinForms.ReportDataSource("ReportDataSource",
                    filtersToBuild));
            PrintRDLCReport.PrintToPrinter(report);

Вот код для класса PrintRDLCReport:

открытый статический класс PrintRDLCReport { private static Logger logger = LogManager.GetCurrentClassLogger ();

    private static int m_currentPageIndex;
    private static IList<Stream> m_streams;
    private static PageSettings m_pageSettings;

    public static Stream CreateStream(string name,
      string fileNameExtension, Encoding encoding,
      string mimeType, bool willSeek)
    {
        Stream stream = new MemoryStream();
        m_streams.Add(stream);
        return stream;
    }

    public static void Export(LocalReport report, bool print = true)
    {
        PaperSize paperSize = m_pageSettings.PaperSize;
        Margins margins = m_pageSettings.Margins;

        // The device info string defines the page range to print as well as the size of the page.
        // A start and end page of 0 means generate all pages.
        string deviceInfo = string.Format(
            CultureInfo.InvariantCulture,
            "<DeviceInfo>" +
                "<OutputFormat>EMF</OutputFormat>" +
                "<PageWidth>{0}</PageWidth>" +
                "<PageHeight>{1}</PageHeight>" +
                "<MarginTop>{2}</MarginTop>" +
                "<MarginLeft>{3}</MarginLeft>" +
                "<MarginRight>{4}</MarginRight>" +
                "<MarginBottom>{5}</MarginBottom>" +
                "<DeviceOrientation>{6}</DeviceOrientation>" +
            "</DeviceInfo>",
            1100,
            850,
            0,
            0,
            0,
            0,
            "LANDSCAPE"
            );

        Warning[] warnings;
        m_streams = new List<Stream>();
        report.Render("Image", deviceInfo, CreateStream,
           out warnings);
        foreach (Stream stream in m_streams)
            stream.Position = 0;

        if (print)
        {
            Print();
        }
    }


    // Handler for PrintPageEvents
    public static void PrintPage(object sender, PrintPageEventArgs e)
    {
        Stream pageToPrint = m_streams[m_currentPageIndex];
        pageToPrint.Position = 0;

        // Load each page into a Metafile to draw it.
        using (Metafile pageMetaFile = new Metafile(pageToPrint))
        {
            Rectangle adjustedRect = new Rectangle(
                    e.PageBounds.Left - (int)e.PageSettings.HardMarginX,
                    e.PageBounds.Top - (int)e.PageSettings.HardMarginY,
                    e.PageBounds.Width,
                    e.PageBounds.Height);

            // Draw a white background for the report
            e.Graphics.FillRectangle(Brushes.White, adjustedRect);

            // Draw the report content
            e.Graphics.DrawImage(pageMetaFile, adjustedRect);

            // Prepare for next page.  Make sure we haven't hit the end.
            m_currentPageIndex++;
            e.HasMorePages = m_currentPageIndex < m_streams.Count;
        }
    }

    public static void Print()
    {
        if (m_streams == null || m_streams.Count == 0)
            throw new Exception("Error: no stream to print.");
        PrintDocument printDoc = new PrintDocument();
        if (!printDoc.PrinterSettings.IsValid)
        {
            throw new Exception("Error: cannot find the default printer.");
        }
        else
        {
            printDoc.PrintPage += new PrintPageEventHandler(PrintPage);
            m_currentPageIndex = 0;
            printDoc.DefaultPageSettings.Landscape = true;
            printDoc.DefaultPageSettings.Margins.Left = 0;
            printDoc.DefaultPageSettings.Margins.Right = 0;
            printDoc.DefaultPageSettings.Margins.Top = 0;
            printDoc.DefaultPageSettings.Margins.Bottom = 0;
            printDoc.Print();
        }
    }

    public static void PrintToPrinter(this LocalReport report)
    {
        m_pageSettings = new PageSettings();
        ReportPageSettings reportPageSettings = report.GetDefaultPageSettings();

        m_pageSettings.PaperSize = reportPageSettings.PaperSize;
        m_pageSettings.Margins = reportPageSettings.Margins;

        Export(report);
    }

    public static void DisposePrint()
    {
        if (m_streams != null)
        {
            foreach (Stream stream in m_streams)
                stream.Close();
            m_streams = null;
        }
    }

    private static string ToInches(int hundrethsOfInch)
    {
        double inches = hundrethsOfInch / 100.0;
        return inches.ToString(CultureInfo.InvariantCulture) + "in";
    }
}

Вот свойства для отчета rdlc (мне изначально приходилось менять его на Content and Copy всегда, чтобы отчет даже публиковался).

enter image description here

Вот настройки публикации, где я включил rdlc: enter image description here

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