기록 , 그리고 습관
article thumbnail

 

DGVPrinter.cs
0.16MB

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를 이용하여 만들어낸 코드입니다. 코드도 깔끔해지고 매우 간결하게

기능을 구현하게 되었습니다. 

 

수정된 코드의 결과화면
Page2

 

비교가 많이 되십니까? 위 사진과 아래 사진의 결과가 매우 상반된 걸 볼 수 있습니다.

이처럼 처음에는 간단한 방법으로 하고자 하여 사진을 캡처한 후 pdf로 출력해 보자는 방법으로 접근해 보았으나 오히려

코드도 더 지저분해질뿐더러 만족스럽지 못한 결과를 도출하였습니다. 

 

이 기능을 구현하면서 코드를 간결하게 작성하는 법을 새롭게 배울 수 있었고 너무 라이브러리에 의지를 하면 안 되지만 

새롭게 만드는 것보다 검증된 기술을 학습하여 적용시키는 게 더 효율적인 코딩 법이라는 것을 깨닫게 되었습니다. 

 

https://www.youtube.com/watch?v=VuO1oY4EbFQ&t=322s

학습했던 유튜브이다. 

 

 

반응형

'MyDev' 카테고리의 다른 글

[C#]국내 증시 데이터 수집  (1) 2023.04.19
profile

기록 , 그리고 습관

@무노문호

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!