У меня есть форма Windows (C #, .NET 4.6.1), которая печатает отчет rdlc без средства просмотра отчетов. В Visual Studio отчет выглядит хорошо; шрифт и поля точно такие же, как в дизайнере отчетов. Когда я публикую свое приложение и попробую его на другом компьютере, оно меняет шрифт и обрезает левое боковое поле. Я попытался изменить шрифты и поля в конструкторе отчетов и изменить поля, которые я передаю принтеру (см. Код ниже), но на опубликованном компьютере он всегда печатает другим шрифтом и вырезами на левой стороне. Как я могу это исправить?
На данный момент я предполагаю, что (1.) Мне нужно добавить какой-то другой файл при публикации. Я включил rdlc, поэтому я не уверен, что еще включить. Может быть, некоторые ссылки на DLL для отчетности? (2.) Мне нужно передать имя шрифта чему-либо в классе PrintRDLCReport. Опять же, не уверены, как это будет выглядеть. (3.) Мне нужен другой тип действия по сборке, а не содержимое. Хотя я не знаю, что еще выбрать.
Любые идеи будут оценены. Я опубликовал это вчера после того, как он работал на моей машине; Мне просто нужно, чтобы он работал на компьютере клиента.
Вот отсканированное изображение распечатанного отчета. Верхняя строка - из отчета, когда я запускаю приложение через Visual Studio (именно так я и хочу, чтобы оно выглядело). Суть в том, что я опубликовал и установил приложение с другого компьютера.
Вот код для прямой печати моего отчета:
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 всегда, чтобы отчет даже публиковался).
Вот настройки публикации, где я включил rdlc: