C# .NET으로 작성된 Windows 서비스 응용 프로그램이 있습니다. 이 응용 프로그램은 PDF를 생성하는 로컬 소프트웨어 프린터로 문서를 인쇄하여 보고서 pdf를 생성하는 데 사용됩니다. 이것은 Windows XP 및 Windows 7에서 잘 작동합니다. 불행히도 Windows 8에서는 실패하는 것으로 나타났습니다. 그런 다음 Windows 8에서 임의의 (심지어 물리적 인) 프린터로 인쇄 할 때 서비스에서 인쇄 할 때 오류가 있음을 알았습니다. 내 프로그램에 실종 된 것은 무엇입니까?Windows 8에서 Windows 서비스에서 인쇄가 실패합니다.
FlowDocument document = MyDocument;
var source = document as IDocumentPaginatorSource;
var documentPaginator = source.DocumentPaginator;
using (var printServer = new LocalPrintServer())
{
PrintQueue queue = printServer.GetPrintQueue(printerName);
XpsDocumentWriter docWriter = PrintQueue.CreateXpsDocumentWriter(queue);
// Print ticket - Approach 1
// PrintTicket printTicket = queue.DefaultPrintTicket.Clone();
// Print ticket - Approach 2
var printTicket = new PrintTicket
{
PageOrientation = PageOrientation.Landscape,
PageMediaSize = new PageMediaSize(PageMediaSizeName.ISOA4), // set size of media (paper)
};
documentPaginator.PageSize = new Size(document.PageWidth, document.PageHeight);
docWriter.Write(documentPaginator, printTicket);
}
서비스 '가 데스크톱과 상호 작용'없이 '시스템 계정'으로 설정됩니다 (하지만 난 너무 또는 로컬 사용자로 로그인하는 것을 시도) :이 방법을 인쇄하고 있습니다.
'인쇄 티켓 - 접근 한'사용하는 경우이 윈도우 8에 예외로 결과:
System.Printing.PrintQueueException: PrintTicket provider failed to bind to printer. Win32 error: -2147467231
at MS.Internal.Printing.Configuration.PTProvider..ctor(String deviceName, Int32 maxVersion, Int32 clientVersion)
at MS.Internal.Printing.Configuration.PTProviderBase.Create(String deviceName, Int32 maxVersion, Int32 clientVersion)
at System.Printing.PrintTicketManager..ctor(String deviceName, Int32 clientPrintSchemaVersion)
at System.Printing.PrintQueue.get_DefaultPrintTicket()
가 '인쇄 티켓을 - 접근법 2'를 사용 : 그 서비스를 말할 것
Exception encountered: System.Printing.PrintQueueException: Fehler beim Binden des PrintTicket-Anbieters an den Drucker. Win32-Fehler: -2147467231
bei MS.Internal.Printing.Configuration.PTProvider..ctor(String deviceName, Int32 maxVersion, Int32 clientVersion)
bei MS.Internal.Printing.Configuration.PTProviderBase.Create(String deviceName, Int32 maxVersion, Int32 clientVersion)
bei System.Printing.PrintTicketManager..ctor(String deviceName, Int32 clientPrintSchemaVersion)
bei System.Printing.PrintQueue.get_UserPrintTicket()
bei System.Printing.PrintQueue.get_CurrentJobSettings()
bei System.Printing.PrintQueue.CreateSerializationManager(Boolean isBatchMode, Boolean mustSetJobIdentifier)
bei System.Windows.Xps.XpsDocumentWriter.BeginWrite(Boolean batchMode, Boolean asyncMode, Boolean setPrintTicketHandler, PrintTicket printTicket, PrintTicketLevel printTicketLevel, Boolean printJobIdentifierSet)
bei System.Windows.Xps.XpsDocumentWriter.Write(DocumentPaginator documentPaginator, PrintTicket printTicket)
을 존재하지 않는 프린터로 인쇄하려고했을 때 "잘못된 프린터 이름"예외가 발생했기 때문에 해당 프린터를 찾을 수 있습니다. 여기
나는 몇 가지 관련 질문에 자신을 위해 노력하겠습니다 : Printing from a Windows Service, Printing from a Windows Service, http://social.msdn.microsoft.com/Forums/en-US/ieextensiondevelopment/thread/b74bd27d-1cc8-4fca-a6de-2cd1371cf3b7/, 온화 관련
: Printing from a .NET Service,
편집 : 경우 사람에
가 관심을 시도 중 - 구성 파일에서 선택한 프린터에 간단한 문서를 인쇄하려고하는 샘플 서비스 응용 프로그램이 여기에 있습니다. http://bin.mypage.sk/FILES/PrintTestService.rar
편집 2 :
흥미 롭습니다.
using (var printDocument = new PrintDocument())
{
printDocument.PrinterSettings.PrinterName = printerName;
printDocument.Print();
}
불행하게도이 시스템의 형태로 페이지가 매겨진 문서를 만들어 내 코드와 호환되지 않습니다 System.Drawing.Graphics 라이브러리를 사용하여 이전의 GDI + 코드 : 나는 다른 인쇄 코드를 시도 할 때 오류가 없다. Windows.Media.Visual 개체. 따라서 문서의 페이지 매김을 처음부터 새로 만드는 데 2 주를 소비하고 싶지 않으면 내 문서를 인쇄 할 수 없습니다.
EDIT3 :
여기에이 문제에 대한 논의가: 그것은 'anycpu를'플랫폼을 사용하는 http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/96e7fc10-3f08-4808-b748-692e30377293 은 '해결 방법'이있다가. 이 해결 방법은 실제로 작동하지만 (필자가 시도했지만) 서비스가 x86 일 필요가있을 때 사용할 수 없습니다. 나는 실제 솔루션을 찾기 위해 우리 회사를 통해 MS 지원에 연락했습니다.
시스템에서 대화 형 서비스를 사용하도록 데스크톱 PLUS와 상호 작용하도록 서비스를 구성해야합니다. 여기를 참고하십시오 http://msdn.microsoft.com/en-us/library/windows/desktop/ms683502.aspx 참고 Windows 8에서 NoInteractiveServices 레지스트리 키의 값은 기본적으로 1이며 0으로 설정해야합니다. –
@ SimonMourier : 레지스트리 플래그를 0으로 수정 한 다음 재부팅하고 서비스에서 '서비스가 데스크톱과 상호 작용하도록 허용'을 선택했는지 확인했습니다. 결과는 동일합니다. – MiroJanosik