65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 LEADTOOLS Virtual Printer SDK 扩展现有应用程序

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2015年7月2日

CPOL

7分钟阅读

viewsIcon

21971

downloadIcon

356

通过LEADTOOLS虚拟打印机SDK,开发人员可以利用任何应用程序的打印功能来扩展和增强该应用程序。

引言

许多开发人员面临的一个常见问题是,当无法更改底层源代码时,如何扩展现有应用程序。随着需求和系统的变化,必须有一种机制来添加新功能并为最终用户维护高效的工作流程。LEADTOOLS虚拟打印机SDK是LEADTOOLS提供的几种解决方案之一,用于解决此问题。

通过LEADTOOLS虚拟打印机SDK,开发人员可以利用任何应用程序的打印功能来扩展和增强该应用程序。开发人员可以在不更改可能不可用或因质量保证或安全措施禁止更改的源代码的情况下受益。最终用户也可以受益,因为他们熟悉且喜爱的应用程序界面不会改变,而且所有打印应用程序的新流程都是相同的。

LEADTOOLS文档和医疗成像SDK产品线包括LEADTOOLS虚拟打印机和网络虚拟打印机驱动程序。这两个驱动程序的主要区别在于,网络虚拟打印机驱动程序包含网络打印机制,例如Internet打印协议(IPP),用于创建自定义网络或基于Web的打印解决方案,从而实现轻量级的客户端部署,以及集中的维护和管理。

使用LEADTOOLS虚拟打印机SDK的可能性和优势

LEADTOOLS虚拟打印机驱动程序SDK是一个强大的资源,它提供了多项优势,包括:

电子存储打印作业

LEADTOOLS虚拟打印机驱动程序将每一页作为内存流提供,可以将其存储到磁盘、数据库、云、PACS或任何可访问的存储库中。

导出打印应用程序不支持的格式

只需几行代码,LEADTOOLS即可将EMF内存流转换为150多种图像和文档格式。例如,将Excel电子表格保存为非Excel格式,如TIFF。

广播打印

一次打印,最终用户将作业发送到多种格式的多个目标。例如,最终用户一次打印以保存为PNG,添加到SharePoint,作为PDF附件发送到电子邮件组,打印到纸张,以及并行发送到传真驱动程序。

在存储或传输之前预处理打印作业

预处理包括重新组织、删除和插入页面、编辑敏感信息、添加Bates印章,或用户或业务规则要求的任何其他修改。

通过流程自动化提高效率

开发人员可以实现上述任何一项或更多功能自动发生。通过一次打印,任务打印机在后台完成复杂的任务,从而为最终用户节省时间并减少人为错误的可能性。

现有应用程序不改变,开发人员保持关注点分离设计原则

现有的复杂应用程序不会改变,也不会经过任何QA或UAT流程。开发人员可以使用这些功能和优势扩展任何打印的应用程序,而无需更改现有应用程序的源代码。

使用LEADTOOLS虚拟打印机实现任务打印机

任务打印机利用LEADTOOLS虚拟打印机或网络虚拟打印机驱动程序。开发人员创建任务打印机的第一个步骤是定义任务打印机的属性。一旦开发人员定义了属性,只需一行代码即可将任务打印机添加到Windows打印机列表中。

定义打印机属性

定义属性很简单,只需设置Leadtools.Printer.PrinterInfo实例的值即可。

internal static PrinterInfo CreatePrinterInfo( string printerName, string printerPassword )
{
   const string documentPrinterRegPath = @"SOFTWARE\LEAD Technologies, Inc.\Printer\";
   const string printerDriverName = "LEADTOOLS VIRTUAL PRINTER";
 
   string taskPrinterPath = 
      System.Reflection.Assembly.GetExecutingAssembly().Location;
   string taskPrinterRootDirectory = Path.GetDirectoryName( taskPrinterPath );
 
   return new PrinterInfo() {
      DriverName = printerDriverName,
      PortName = printerName,
      MonitorName = printerName,
      ProductName = printerName,
      PrinterName = printerName,
      Password = printerPassword,
      RegistryKey = documentPrinterRegPath + printerName,
      RootDir = Properties.Settings.Default.DriverRootDir,
      Url = "http://www.leadtools.com/support/default.htm",
      PrinterExe = taskPrinterPath,
      AboutString = 
         String.Format( "{0} - {1}", printerDriverName, printerName ),
   };
}

PrinterInfo对象的主要属性是PrinterNameRootDirPrinterExe

  • PrinterExe属性是任务打印机可执行文件的名称,用于链接Windows打印机列表中显示的打印机。当最终用户打印到任务打印机时,LEADTOOLS虚拟打印机会执行在PrinterExe中定义的应用程序。
  • PrinterName属性是显示在Windows打印机列表中的打印机名称。此外,PrinterName将任务打印机应用程序(PrinterExe)与Windows打印机列表中的打印机关联起来,并订阅其事件。
  • RootDir是LeadtoolsPrinter.exe的位置,该文件包含在LEADTOOLS SDK中,并由所有任务打印机使用。

安装任务打印机

一旦开发人员定义了PrinterInfo对象,只需调用一次静态方法即可将任务打印机安装到Windows打印机列表中。

Printer.Install( CreatePrinterInfo( printerName, printerPassword ) );

调用Printer.Install()将导致以下结果:

  • Windows将在Windows打印机列表中显示由PrinterInfo类定义的任务打印机,就像任何其他打印机一样。
  • 打印到新安装的任务打印机将触发PrinterInfo.PrinterExe属性中定义的任务打印机可执行文件运行。

安装LEADTOOLS任务打印机的应用程序不必是实现打印机执行的任务的同一应用程序。安装应用程序可以即时定义和安装任务打印机,并提供一种拥有多个专门针对特定任务或任务集定制的自定义任务打印机的手段。例如,一个安装应用程序可以创建一个将PDF保存到SharePoint的任务打印机,以及另一个用于在将打印作业作为TIFF通过电子邮件发送之前搜索和编辑社会安全号码的任务打印机。

实现打印机的任务

开发的下一步是当任务打印机收到打印作业时执行有用的操作。为了方便这一点,Leadtools.Printer.Printer类提供了两个事件:

  • Job Event – 当打印作业开始和结束时触发。
  • Emf Event – 针对打印作业的每一页触发,并提供由打印机假脱机程序生成的EMF。

任务打印机的实现可以是简单的控制台应用程序,也可以是复杂的GUI应用程序。控制台和GUI任务打印机之间的选择主要取决于用户交互的需求,例如重新组织和合并打印作业或手动编辑用户指定的区域。在这两种情况下,安装和事件处理都是相同的。

LEADTOOLS SDK包含以.NET和C++实现的GUI示例。下面的代码片段展示了一个基本、必需的实现,以及一个简单的C#控制台应用程序。

创建虚拟打印机实例

要创建Printer对象的实例,任务打印机使用安装应用程序设置的PrinterInfo.PrinterName值来挂接到正确的打印机。

Printer printer = new Printer( printerName );
printer.EmfEvent += new EventHandler<EmfEventArgs>( VirtualPrinter_EmfEvent );
printer.JobEvent += new EventHandler<JobEventArgs>( VirtualPrinter_JobEvent );

任务打印机在每个打印作业的开始和结束时引发Job事件,并提供打印作业ID和打印机名称等信息。

在此示例中,当打印作业结束时,应用程序将结束,因为打印机没有其他任务需要完成。在需要用户交互的情况下,应用程序将保持打开状态。LEADTOOLS SDK包含C++和.NET项目,演示“保持打开”的任务打印机实现。

static void VirtualPrinter_JobEvent( object sender, JobEventArgs e )
{
   string printerName = e.PrinterName;
   int jobID = e.JobID;
 
   switch ( e.JobEventState )
   {
      case EventState.JobEnd:
         // Exit with success
         Environment.Exit( 0 );
         break;
      case EventState.JobStart:
         Console.WriteLine( 
            String.Format( 
               "{0}: Job {1} has started", printerName, jobID ) );
         break;
      default:
         break;
   }
}

大部分处理通常发生在Emf Event中。或者,打印机也可以将EMF存储起来以供以后处理。该事件提供每页作为EMF流,可以将其保存到磁盘或保存在内存中以供进一步处理。

将EMF直接保存到磁盘

以下代码片段显示了如何将EMF流直接保存到磁盘。一旦EMF保存到磁盘,就可以在以后处理,而不会占用内存,特别是当打印作业有多页时。

// Write the EMF as file to disk.
static void VirtualPrinter_EmfEvent( object sender, EmfEventArgs e )
{
   string  emfPath = Path.Combine(
         @"c:\Output\EMF\",
         Path.GetFileNameWithoutExtension(Path.GetRandomFileName() )
      ) + ".emf";
   Directory.CreateDirectory(Path.GetDirectoryName( emfPath ) );
   File.WriteAllBytes( emfPath, e.Stream.ToArray() );
}

使用LEADTOOLS处理EMF

如果需要立即进行其他或高级处理,RasterImageConverter类可以轻松地将EMF流转换为RasterImage。以下代码片段显示了一个示例,该示例将EMF转换为RasterImage,用黑色填充预定义区域,并将结果保存为PNG。虽然此示例填充了预定义区域,但在GUI应用程序中,最终用户可以选择特定区域或任意数量的区域进行编辑。在某些情况下,在提交到磁盘之前处理EMF是可取的,例如出于安全或隐私原因编辑个人信息。

// Get the EMF, convert to an image, fill a region and save as PNG.
static void VirtualPrinter_EmfEvent( object sender, EmfEventArgs e )
{
   string pngPath = Path.Combine(
      @"c:\Output\PNG\",
      Path.GetFileNameWithoutExtension( Path.GetRandomFileName() )
      ) + ".png";
   Directory.CreateDirectory( Path.GetDirectoryName( pngPath ) );
   // Get the EMF.
   Metafile metaFile = new Metafile( e.Stream );
   IntPtr hEmf = metaFile.GetHenhmetafile();
   // Convert to an image.
   RasterImage image = 
      RasterImageConverter.FromEmf( hEmf, 0, 0, RasterColor.White );
   // Define the region to fill.
   RasterRegion region = 
      new RasterRegion( 
         new LeadRect( 20, 30, 100, 200 ) );
   // Set the region in the image.
   image.SetRegion( null, region, RasterRegionCombineMode.Set );
   // Fill image region with black.
   new FillCommand( RasterColor.FromKnownColor( RasterKnownColor.Black ) )
      .Run( image );
   // Save as PNG.
   RasterCodecs codecs = new RasterCodecs();
   codecs.Save( image, pngPath, RasterImageFormat.Png, 32 );
}

将EMF保存为PDF

LEADTOOLS包含DocumentWriter类,可以将EMF保存为多种文档格式,包括DOCX、PDF、HTML、SVG和XPS。以下代码片段显示了将EMF保存为PDF是多么容易。

// Write the EMF as file to disk as PDF.
static void VirtualPrinter_EmfEvent( object sender, EmfEventArgs e )
{
   string pdfPath = Path.Combine(
      @"c:\Output\PDF\",
      Path.GetFileNameWithoutExtension( Path.GetRandomFileName() )
      ) + ".pdf";
   Directory.CreateDirectory( Path.GetDirectoryName( pdfPath ) );
            
   // Create an instance of the LEADTOOLS DocumentWriter
   DocumentWriter docWriter = new DocumentWriter();
   docWriter.BeginDocument( pdfPath, DocumentFormat.Pdf );
 
   DocumentEmfPage page = new DocumentEmfPage() {
      EmfHandle = new Metafile( e.Stream ) )
         .GetHenhmetafile()
   };
   docWriter.AddPage( page );
   docWriter.EndDocument();
}

使用LEADTOOLS SDK可以进行更高级的处理。此外,现在基本任务打印机实现到位后,可以轻松获得任何存储选项,如SharePoint、数据库或云(如SalesForce、Amazon和Google)。

结论

考虑到打印命令的普遍性,结合想象力和强大的SDK(如LEADTOOLS),LEADTOOLS虚拟打印机驱动程序打开了无限的可能性。从保持“绿色”到简化复杂的工作流程场景,再到将来自多个源的信息捕获到一个通用存储库中,文件 > 打印是LEADTOOLS实现目标的一种方式。

下载虚拟打印机示例

您可以下载功能齐全的项目,其中包括上述功能。要运行此示例,您需要:

  • LEADTOOLS 免费 60 天试用版
  • Visual Studio 2008 或更高版本
  • 浏览到LEADTOOLS示例文件夹(例如,C:\LEADTOOLS 19\Examples\),您可以在其中找到LEADTOOLS中更多技术的其他示例项目。

支持

需要帮助来运行此示例吗? 联系我们的支持团队以获得免费技术支持!有关定价或许可问题,您可以联系我们的销售团队(sales@leadtools.com)或致电+1-704-332-5532。

© . All rights reserved.