Program Tip

WPF에서 인쇄 /보고하는 가장 좋은 방법은 무엇입니까?

programtip 2020. 11. 5. 18:52
반응형

WPF에서 인쇄 /보고하는 가장 좋은 방법은 무엇입니까?


데이터에서 간단한 보고서를 인쇄 할 수 있어야하는 향후 프로젝트가 있습니다. WPF 기반이며 어떤 방법으로 가야할지 궁금합니다.

WPF는 사용하기 매우 쉬운 자체 인쇄 기술 (XPS 기반)을 도입한다는 것을 알고 있습니다. 그러나 내 일부는 ReportViewer 컨트롤을 사용하고이를 Windows Forms 호스트 컨트롤에 포함하는 것이 더 쉬운 지 궁금합니다. 그러면 사용자가 다양한 형식으로 내보내고 인쇄 할 수 있기 때문입니다.

누구든지 WPF에서 인쇄 /보고에 대한 경험이 있습니까? 어떤 방향을 추천 하시겠습니까?


우리는 이와 동일한 문제가 있었고 지금은 RDLC / ReportViewer를 사용했습니다. 기본 WPF보고 도구 (내가 알고있는)가 없으며 RDLC는 사용하기 매우 간단하며 무료입니다. 이에 대한 런타임 오버 헤드는 작지만 (약 2Mb) .NET Framework의 일부가 아니므로 배포해야합니다.


RDL의 한계

원래 WPF로 인쇄하기 위해 RDLC / ReportViewer를 사용했지만 매우 제한적이었습니다. 내가 찾은 제한 사항 중 일부는 다음과 같습니다.

  • RDL은 가장 지루한 보고서 만 만들 수 있습니다.
  • 일반 WPF보다 RDL을 사용하여 보고서를 만드는 것이 훨씬 더 많은 작업이었습니다. 디자인 도구는 Expression Blend 및 테이블에서만 RDL을 처리하는 것에 비해 매우 원시적입니다.
  • ControlTemplates, DataTemplates, Styles 등을 사용할 능력이 없었습니다.
  • 내 보고서 필드와 열이 데이터 크기에 따라 효과적으로 크기를 조정하고 재정렬하지 못했습니다.
  • 그래픽은 이미지로 가져와야했습니다. 벡터로 그리거나 편집 할 수 없었습니다.
  • 데이터 바인딩이 아닌 코드 숨김이 필요한 항목 위치 지정
  • 변형 부족
  • 매우 원시적 인 데이터 바인딩

WPF에서 직접 인쇄하는 것은 매우 쉽습니다.

이러한 제한으로 인해 순수 WPF를 사용하여 보고서를 만드는 방법을 살펴 보았고 실제로 매우 사소한 작업이라는 것을 알게되었습니다. WPF를 사용하면 DocumentPaginator페이지를 생성 할 수있는 고유 한 하위 클래스 를 구현할 수 있습니다.

모든 Visual을 가져 와서 시각적 트리를 분석하고 각 페이지를 만들기 위해 선택한 요소를 숨기는 간단한 DocumentPaginator 하위 클래스를 개발했습니다.

DocumentPaginator 세부 정보

다음은 초기화하는 동안 내 DocumentPaginator 하위 클래스가 수행하는 작업입니다 (첫 번째 PageCount를 가져올 때 또는 첫 번째 GetPage () 호출 중에 호출 됨).

  1. 시각적 트리를 스캔하고 ItemsControls 내에서 스크롤 된 모든 패널의 맵을 만듭니다.
  2. 가장 바깥 쪽부터 시작하여 Visual이 스크롤 할 필요없이 단일 페이지에 맞을 때까지 ItemsControls의 항목을 마지막부터 처음까지 보이지 않게합니다. 가장 바깥 쪽을 충분히 줄일 수없는 경우 성공할 때까지 내부 패널을 줄이거 나 각 수준에서 항목이 하나만 있습니다. 보이는 항목 세트를 첫 페이지로 기록합니다.
  3. 첫 페이지에 이미 표시된 최하위 항목을 숨긴 다음 페이지에 더 이상 맞지 않을 때까지 후속 항목을 표시합니다. 마지막으로 추가 된 항목을 제외한 모든 항목을 두 번째 페이지로 기록합니다.
  4. 모든 페이지에 대해이 과정을 반복하여 결과를 데이터 구조에 저장합니다.

My DocumentPaginator의 GetPage 메서드는 다음과 같습니다.

  1. 초기화 중에 생성 된 데이터 구조에서 주어진 페이지 번호를 찾습니다.
  2. 데이터 구조에 표시된대로 시각적 트리에서 항목 숨기기 및 표시
  3. 보고서에서 페이지 번호 매기기를 표시 할 수 있도록 PageNumber 및 NumberOfPages 연결된 속성 설정
  4. Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, new Action(() => {} ));백그라운드 렌더링 작업을 완료 하려면 Dispatcher ( )를 플러시합니다.
  5. VisualBrush가 인쇄되는 시각적 개체 인 페이지 크기의 Rectangle을 만듭니다.
  6. 사각형을 측정, 정렬 및 업데이트 한 다음 반환합니다.

이것은 매우 간단한 코드로 밝혀졌고 WPF로 만들 수있는 거의 모든 것을 페이지로 변환하고 인쇄 할 수있었습니다.

추가보고 지원

이제 제 페이지 네이터가 작동하므로 화면 용 또는 종 이용 WPF 콘텐츠를 만드는지 더 이상 크게 걱정할 필요가 없습니다. 실제로 데이터 입력 및 편집을 위해 만든 UI도 인쇄에 매우 적합합니다.

거기에서 간단한 도구 모음과 일부 코드를 추가하여 RDL보다 훨씬 뛰어난 WPF를 기반으로 구축 된 완전한보고 시스템을 만들었습니다. 내보고 코드는 파일로 내보내기, 프린터로 인쇄, 페이지 이미지 잘라 내기 / 붙여 넣기 및 Excel 용 데이터 잘라 내기 / 붙여 넣기를 수행 할 수 있습니다. 또한 체크 박스를 클릭하여 내 UI를 "인쇄보기"로 전환하여 인쇄 된 경우 어떻게 표시되는지 확인할 수 있습니다. 이 모든 것이 단 몇 백 줄의 C # 및 XAML입니다!

이 시점에서 RDL이 내보고 코드에없는 유일한 기능은 서식이 지정된 Excel 스프레드 시트를 생성하는 기능이라고 생각합니다. 어떻게 할 수 있는지 알 수 있지만 지금까지는 필요가 없었습니다. 데이터를 잘라내어 붙여 넣기만으로 충분했습니다.

내 경험에 비추어 볼 때 페이지 관리자를 작성한 다음 WPF 자체를 사용하여 보고서를 작성하는 것이 좋습니다.


http://wpfreports.codeplex.com/을 보십시오 .


PdfReports를 살펴 보십시오 . iTextSharp 및 EPPlus 라이브러리 위에 구축 된 코드 우선보고 엔진입니다. .NET 3.5+ 웹 및 Windows 응용 프로그램과 모두 호환됩니다.


Scryber는 어떻습니까? 이를 통해 xml을 사용하여 PDF 보고서 템플릿을 정의하고 런타임에 애플리케이션 내의 데이터에 바인딩 할 수 있습니다. http://scryber.codeplex.com/


Ray Burns 답변에 대해 자세히 설명하려면 구현 예제를 찾고 있다면 Custom Data Grid Document Paginator를 참조하십시오.

좋은 출발점입니다.


기본적으로 디자인 환경과 데이터 소스 관리자로 구성된 자체보고 시스템을 개발하는 작업을 최근에 수행했습니다. 첫 번째 과제는 WYSWIG와 같은 디자인 환경을 개발하는 것이 었습니다. 인쇄 / 인쇄 미리보기 생성이 예상했던 것보다 쉬웠 기 때문에 인쇄에 신경 쓰지 않고 GDI +를 사용하여이 작업을 수행했습니다. 일반적으로 인쇄 이벤트의 그래픽 개체에 화면의 모든 것을 그리기 만하면됩니다.

WPF의 경우도 비슷할 것이라고 생각하므로 화면에 보고서를 표시하고 인쇄하면 코드가 몇 줄 밖에되지 않습니다.


WPF의 미래에 대한 전체적인 정치적 논의를 거치지 않고 우리가 찾은 최상의 옵션은 Windows Forms 호스트 컨트롤에 ReportViewer를 래핑하는 것이 었습니다.

http://blog.pineywoodstech.com/index.php/2012/01/using-microsoft-reportviewer-with-wpf/

참고URL : https://stackoverflow.com/questions/180746/whats-the-best-approach-to-printing-reporting-from-wpf

반응형