문제

저는 지금 다른 응용 프로그램에서 메시지를 수신하고, 해당 메시지의 내용을 형식화하고, 프린터로 보내는 프로젝트를 진행하고 있습니다.선택한 기술은 C# Windows 서비스입니다.출력을 보고서라고 부를 수는 있겠지만 보고 엔진은 필요하지 않습니다.StringTemplate과 같은 간단한 템플릿 엔진이나 HTML을 출력하는 XSLT도 괜찮습니다.내가 겪고 있는 문제는 서비스에서 이러한 종류의 출력을 인쇄할 수 있는 무료 방법을 찾는 것입니다.그 이후로 것 같다 작동할 것이라고 생각하기 때문에 저는 Microsoft의 RDLC를 사용하여 로컬 보고서를 채운 다음 이를 메모리 스트림에 이미지로 렌더링하여 인쇄할 프로토타입을 작업하고 있습니다.이에 대한 문제는 다음과 같습니다.

  • 여러 페이지를 인쇄하는 것은 큰 골칫거리입니다.
  • Windows 서비스에서 지원되지 않는 메모리 스트림을 인쇄하려면 여전히 PrintDocument를 사용해야 합니다. (작동할 수도 있지만 아직 프로토타입에서는 그렇게까지 도달하지 못했습니다.)
  • 들어오는 데이터가 변경되면 데이터 세트와 데이터가 역직렬화되는 클래스를 변경해야 합니다.나쁘다 나쁘다.

이런 일을 원격으로 해야 하는 사람이 있었나요?어떤 충고?나는 이미 사용자 입력 없이 HTML을 인쇄하는 것에 대한 질문을 올렸고, 그것에 대해 약 3일을 낭비한 후에 적어도 무료로 사용할 수 있는 도구로는 할 수 없다는 결론에 도달했습니다.

모든 도움을 주시면 감사하겠습니다.

편집하다:우리는 .NET 프레임워크 버전 2.0을 사용하고 있습니다.

도움이 되었습니까?

해결책

저를 믿으세요. 타사 구성 요소를 구입하는 것보다 이에 대한 솔루션을 검색/개발하는 데 더 많은 비용을 지출하게 됩니다.바퀴를 재발명하지 말고 유료 솔루션을 선택하십시오.

인쇄는 복잡한 문제이며 이를 위해 더 나은 프레임워크 지원이 추가되는 날을 보고 싶습니다.

다른 팁

Windows 서비스에서 인쇄하는 것은 정말 고통스럽습니다.작동하는 것 같습니다 ...때때로...그러나 최종적으로는 명확한 이유 없이 때때로 예외가 발생하거나 예외가 발생합니다.정말 절망적이에요.공식적으로도 그렇죠 지원되지 않음, 어떤 설명도 없고 대체 솔루션에 대한 제안도 없습니다.

최근에 저는 이 문제에 직면했고 여러 번의 실패한 시도와 실험 끝에 마침내 두 가지 실행 가능한 해결책을 찾았습니다.

  • Win32 API(예: C/C++)를 사용하여 자체 인쇄 DLL을 작성한 다음 P/Invoke를 통해 서비스에서 사용합니다(잘 작동함).
  • 자신만의 인쇄 COM+ 구성 요소를 작성한 다음 서비스에서 사용하세요.나는 최근에 이 솔루션을 성공적으로 선택했습니다(그러나 그것은 자체적으로 작성되지 않은 타사 COM+ 구성 요소였습니다). 그것도 아주 잘 작동합니다.

난 끝냈어.A *의 고통입니다.문제는 인쇄하려면 GDI 엔진이 있어야 한다는 것입니다. 이는 일반적으로 로그인할 때만 로드되는 데스크탑이 있어야 함을 의미합니다.서버의 서비스에서 이 작업을 수행하려는 경우 일반적으로 로그인되어 있지 않습니다.

따라서 먼저 일반 서비스 사용자로 실행할 수 없고 대신 대화형 로그인 권한이 있는 실제 사용자로 실행할 수 있습니다.그런 다음 서비스 레지스트리 항목을 조정해야 합니다(지금은 방법을 잊어버렸습니다. 정말로 관심이 있으시면 오늘 밤에 할 수 있는 코드를 찾아야 할 것입니다).마지막으로 기도해야 합니다.

가장 큰 장기적 골칫거리는 인쇄 드라이버와 관련된 것입니다.로그인한 사용자 없이 서비스로 실행 중인 경우 일부 인쇄 드라이버는 때때로 대화 상자를 표시하는 것을 좋아합니다.프린터에 토너가 부족하면 어떻게 되나요?아니면 종이가 부족합니까?드라이버는 결코 볼 수 없는 대화 상자를 표시하고 로그인한 사람이 없기 때문에 프린터 대기열을 보류할 수 있습니다!

서비스에서 인쇄하는 것은 나쁜 생각입니다.네트워크 프린터는 "사용자별로" 연결됩니다.특정 사용자로 서비스가 실행되도록 표시할 수 있지만 이는 보안상 좋지 않은 관행이라고 생각합니다.로컬 프린터에 연결할 수도 있지만 이 방법을 사용하기 전에는 여전히 망설입니다.

가장 좋은 옵션은 서비스가 데이터를 저장하도록 하고 사용자가 실행하는 응용 프로그램이 서비스에 데이터를 요청하여 인쇄를 수행하도록 하는 것입니다.또는 데이터베이스와 같이 데이터가 저장되는 공통 위치입니다.

데이터를 정기적으로 인쇄해야 하는 경우 작업 스케줄러를 통해 작업 이벤트를 설정하세요.서비스에서 프로세스를 시작하려면 사용자 이름과 비밀번호를 알아야 하는데, 이는 다시 한번 나쁜 보안 관행입니다.

인쇄 자체의 경우 타사 도구를 사용하여 보고서를 생성하는 것이 가장 쉽습니다.

첫 번째 질문에 대답하려면 데이터에 따라 상당히 간단할 수 있습니다.우리는 귀하가 요구하는 것을 정확하게 수행하는 다양한 서비스 기반 애플리케이션을 보유하고 있습니다.일반적으로 우리는 들어오는 파일을 구문 분석하고 그 주위에 자체 Postscript 또는 PCL을 래핑합니다.레이아웃이 상당히 간단한 경우 원하는 글꼴/인쇄 레이업을 제공하기 위해 래핑할 수 있는 몇 가지 매우 기본적인 PCL 코드가 있습니다(오프라인에서 몇 가지 지침을 제공해 드리겠습니다).

인쇄 준비가 된 파일이 있으면 이를 공유되는 UNC 프린터, 로컬에 설치된 프린터 또는 장치의 IP(RAW 또는 LPR 유형 데이터)로 직접 보낼 수 있습니다.

그러나 PDF 경로를 따르는 경우 가장 간단한 방법은 PDF 출력을 직접 PDF 인쇄를 지원하는 프린터(현재 많은 경우 지원)로 보내는 것입니다.이 경우 PDF를 장치로 보내고 인쇄하면 됩니다.

다른 옵션은 시작하는 것입니다 고스트스크립트 귀하의 필요에 따라 무료로 제공되어야 하며(몇 가지 다른 버전, 일부 GNU, 일부 GPL 등이 있으므로 라이센스를 확인하십시오) 내장된 인쇄 기능을 사용하거나 간단히 Postscript로 변환하여 장치로 보내십시오.저는 서비스 앱에서 Ghostscript를 여러 번 사용했지만 기본적으로 변환을 수행하기 위해 명령줄 앱을 실행하고 실행하게 되므로 큰 팬은 아닙니다.즉, 정상적으로 실패하는 경향이 있는 안정적인 앱입니다.

이것은 당신이 찾고 있는 것이 아닐 수도 있지만, 이 빠르고 더러운 작업을 수행해야 한다면 다음을 수행합니다.

  1. 별도의 WPF 애플리케이션을 만듭니다(내장된 문서 처리 기능을 사용할 수 있도록).
  2. 서비스에 데스크탑과 상호 작용할 수 있는 기능을 제공하십시오(실제로 데스크탑에 아무것도 표시할 필요가 없거나 이 기능이 작동하기 위해 로그인할 필요는 없습니다).
  3. 서비스가 애플리케이션을 실행하고 인쇄할 데이터를 제공하도록 합니다.

서비스에서 실행하는 웹 브라우저에서 인쇄하기 위해 이것을 흔들 수도 있습니다(그러나 전체 브라우저를 사용하는 것보다 자체 쉘 IE를 구축하는 것이 좋습니다).

더 자세한(또한 무료) 솔루션을 위해 가장 좋은 방법은 아마도 수동으로 문서 형식을 지정하는 것입니다(GDI+를 사용하여 레이아웃을 수행함).이는 지루하고 오류가 발생하기 쉬우며 시간이 많이 걸리고 개발 중에 많은 종이를 낭비하지만 프린터에 어떤 영향을 미칠지 최대한 제어할 수 있습니다.

포스트 스크립트로 출력할 수 있는 경우 일부 프린터는 특정 디렉토리로 FTP로 전송되는 모든 것을 인쇄합니다.

우리는 이를 사용하여 대학에서 우리에게 노출한 인쇄 크레딧을 통과했지만 서비스가 ps로 출력되는 경우 ps 파일을 프린터로 ftp하면 됩니다.

우리는 사용하고 있습니다 DevExpress의 XtraReports 아무 문제 없이 서비스에서 인쇄할 수 있습니다.보고서 모델은 Windows Forms의 모델과 유사하므로 텍스트 요소를 동적으로 삽입한 다음 인쇄 명령을 실행할 수 있습니다.

나는 우리가 제3자의 길을 갈 것이라고 생각한다.나는 XSL -> HTML -> PDF -> 프린터 흐름을 좋아합니다...위노베이티브의 HTML을 PDF로 첫 번째 부분에서는 좋아 보이지만 좋은 PDF 인쇄 솔루션을 찾는 데 어려움을 겪고 있습니다...어떤 제안이 있나요?이상적으로 라이센스는 배포된 런타임 기반이 아닌 개발자 기반이 됩니다.

PDF 인쇄에 관한 귀하의 질문에 대한 답변에서 우아한 해결책을 찾지 못했습니다.나는 신뢰할 수 없고 사용자가 항상 로그인해야 하는 Adobe에 "셸"을 보내고 있었습니다.이 특정 문제를 해결하기 위해 우리가 처리하는 파일(송장)을 기본 .NET 인쇄 기능을 사용하여 분할하고 인쇄할 수 있는 다중 페이지 Tiff 파일 형식으로 지정하도록 요청했습니다.Adobe의 입장은 "사용자가 Adobe Reader에서 파일을 보고 인쇄를 클릭할 수 있도록 하는 것"인 것 같습니다.쓸모 없는.

나는 여전히 웹 서버에서 출력할 수 있는 품질 보고서를 생성하는 좋은 방법을 찾고 있습니다.

Yann Trevin의 응답에 따라 System. Drawing.Printing을 사용한 인쇄는 MS에서 지원되지 않습니다.그러나 새로운 WPF 기반 System.Printing(I 생각하다)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top