C# WInform 데이터 그리드 뷰의 내용들을 PDF로 출력해보고 싶은 사람들이 있을 거라고 생각이 들어 포스팅을 합니다.
물품 주문서, 인사발령 대장, 가계부 등 여러 가지 데이터들이 존재할 때 PDF로 출력하고자 할 때 필요한 소스입니다.
우선 이 문제를 해결하면서 처음에는 데이터 그리드 뷰의 X 좌표 0부터 Y좌표 0까지의 화면을 캡처 후 PDF로 넘겨주는 방법으로 처음에 구현을 하였으나 A4용지의 크기보다 길이가 길어지게 될 시 이슈가 생겨 대응하고자 하여 새로운 방법을 구글 검색을 통해 배우게 되었습니다.
Bitmap bitmap;
private void pDFToolStripMenuItem_Click_1(object sender, EventArgs e)
{
int width = dataGridView1.Size.Width;
int height = dataGridView1.Size.Height;
DataGridView panel = new DataGridView();
this.Controls.Add(panel);
Graphics graphics = panel.CreateGraphics();
Size size = dataGridView1.Size;
bitmap = new Bitmap(size.Width, size.Height, graphics);
dataGridView1.DrawToBitmap(bitmap, new System.Drawing.Rectangle(0, 0, width, height));
printPreviewDialog1.Document = printDocument1;
printPreviewDialog1.ShowDialog();
}
private void printDocument1_PrintPage_1(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
if (curPageNumber == 0)
{
e.HasMorePages = false;
}
else
{
e.HasMorePages = true;
curPageNumber--;
}
label3.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
e.Graphics.DrawString("인사발령대장" , new System.Drawing.Font("Arial", 25, FontStyle.Regular), Brushes.Black, new Point(300, 20));
e.Graphics.DrawImage(bitmap, 0, 80);
e.Graphics.DrawString("출력: " + label3.Text, new System.Drawing.Font("Arial", 8, FontStyle.Regular), Brushes.Black, new Point(1, 30));
}
위 코드가 이슈를 대응하기 전 코드입니다. 위 코드는 비트맵 함수에 dataGridView1 내용을 캡처한 이미지를 저장 후
printDocument에 그려주는 식의 방법으로 기능을 구현하였습니다.
그후 curPageNumber에 현재 페이지를 카운터 후 페이징 처리를 할 수 있게 하였으나 작동되지 않아 묻어두고 있었지만 대응을 해야겠다는 생각에 다른 라이브러리를 이용해 보고자 검색을 하였는데 DGVPrinter라는 라이브러리가 있어서 해당 레퍼런스를 유튜브를 통해 학습 후 바로 프로젝트에 적용해 보았습니다.
언뜻 봐도 깔끔하지 못한 출력물이죠..?
private void pDFToolStripMenuItem_Click_1(object sender, EventArgs e)
{
label3.Text = DateTime.Now.ToString();
DGVPrinter printer = new DGVPrinter();
printer.Title = "인사발령대장";
printer.SubTitle = "출력 : " + label3.Text;
printer.SubTitleFormatFlags = StringFormatFlags.LineLimit | StringFormatFlags.NoClip;
printer.PageNumbers = true;
printer.PageNumberInHeader = false;
printer.PorportionalColumns = true;
printer.HeaderCellAlignment = StringAlignment.Near;
printer.Footer = "대표이사 : OOO";
printer.FooterSpacing = 15;
printer.PrintDataGridView(dataGridView1);
}
위 코드가 DGVPrinter를 이용하여 만들어낸 코드입니다. 코드도 깔끔해지고 매우 간결하게
기능을 구현하게 되었습니다.
비교가 많이 되십니까? 위 사진과 아래 사진의 결과가 매우 상반된 걸 볼 수 있습니다.
이처럼 처음에는 간단한 방법으로 하고자 하여 사진을 캡처한 후 pdf로 출력해 보자는 방법으로 접근해 보았으나 오히려
코드도 더 지저분해질뿐더러 만족스럽지 못한 결과를 도출하였습니다.
이 기능을 구현하면서 코드를 간결하게 작성하는 법을 새롭게 배울 수 있었고 너무 라이브러리에 의지를 하면 안 되지만
새롭게 만드는 것보다 검증된 기술을 학습하여 적용시키는 게 더 효율적인 코딩 법이라는 것을 깨닫게 되었습니다.
https://www.youtube.com/watch?v=VuO1oY4EbFQ&t=322s
학습했던 유튜브이다.
'MyDev' 카테고리의 다른 글
[C#]국내 증시 데이터 수집 (1) | 2023.04.19 |
---|