一种虚拟打印的处理方法
【专利摘要】本发明公开了一种虚拟打印的处理方法,包括接收虚拟打印数据,分析接收到的虚拟打印数据中的属性特征,合并属于同一属性特征的数据。在虚拟打印前,对于被切分的若干图片,首先进行合并处理,以还原出一幅原始图片,然后再按照现有方法实现虚拟打印。对于原始文档中已采用路径填充描述的虚线,首先将其还原为版式文件中的虚线指令描述后,再按照现有方法实现虚拟打印。通过本发明对图片和虚线的优化处理,避免了虚拟打印后版式文件的变大,以及减少了虚拟打印后版式文件的信息损失,从而保证了虚拟打印输出的版式文件与原始文件的一致性。
【专利说明】一种虚拟打印的处理方法
【技术领域】
[0001]本发明涉及打印技术,尤指一种虚拟打印中对图片及虚线的处理方法。
【背景技术】
[0002]虚拟打印就是在编辑软件中,选择一个虚拟的打印机并利用虚拟打印机的驱动(下文简称为打印驱动)将编辑软件中的文档以版式文件形式输出。比如,在编辑软件word中,可以利用“Adobe FOF”虚拟打印机将doc文档转换为pdf文档。
[0003]通过虚拟打印得到版式文件时,由于源数据即编辑软件中的原始文档如doc文档经过打印驱动标准接口的处理后,不可避免地会发生信息损失,而信息的损失不仅会影响原版原貌的效果(即经过虚拟打印输出的版式文件与原始文档是否一摸一样),还会使版式文件的尺寸变大、从而降低显示或打印版式文件的速度。
[0004]目前,在真实打印中即使用打印机打印中,为了避免由于数据过大造成的报内存错误而终止打印,对于原始文档中图片的处理,是将大图片切分成若干小图片。一般,在打印之前,应用软件会先按水平方向对大图片进行切分,比如微软powerpoint等软件就是将一个大图片按水平方向切分成高为一个像素的若干小图片。因为应用软件是不能区分打印驱动是真实打印机驱动还是虚拟打印机驱动,所以对于虚拟打印也会将大图片切分成若干小图片的优化处理,但是,对虚拟打印来说,这样就会带来两个问题:
[0005]I)版式文件将变大。
[0006]由于每张图片都有固定的属性特征描述信息,比如宽、高、位数、格式、显示位置、显示大小等。对于一张大图片,这样的描述信息只需要一份;而如果该大图片被切分成η张小图片,那么,这样的信息就需要η份,显然,在虚拟打印后,版式文件将变大。而且,图片在版式文件中是压缩存储的,图片越小,压缩的效果越好,当一个大图片被切分成η个小图片时,明显会降低压缩的效果。
[0007]2)显示版式文件时,版式文件与原图比较会有误差。
[0008]虚拟打印时传入的坐标是整型数值,如果原图片在打印时作了缩放,那么在切分后,需要重新计算显示位置和显示大小,这样取整后就会有误差。在真实打印机上打印,因为打印机的分辨率比较高,目前最小的是300dpi,因此打印出来和原图比较,不会看出差另O。但对于虚拟打印后的版式文件,由于版式文件的一个用途是用于显示,显示时的显示器的分辨率是96dpi,假设版式文件的分辨率是600dpi,那么,显示时只有放大到6.25倍才能与打印的效果一样;而如果以原页面大小显示,则需要将页面缩小为96/600=0.16倍,这样,在重新计算被切分后图片的显示位置和显示大小时会产生误差,再显示时,会看到图片之间的不连续,比如acrobat在显示有背景图的微软powerpoint打印后的pdf文件时,背景图会有明显的横条纹。
[0009]另外,
[0010]在真实打印驱动中,路径填充(DrvFillPath)和路径描绘(DrvStrokePath)接口是必须实现的,但路径描绘的接口一般只包括对实线的处理,而对于比较复杂的虚线处理,有的打印驱动却并不一定实现。因此,有的应用程序如常见的微软word等软件,在处理描绘虚线时,通常采用路径填充来达到同样的效果。这种对虚线的处理对真实打印机来说,因为其分辨率高,因此没有什么问题,打印后的效果与虚线效果一样。
[0011]因为应用软件是不能区分打印驱动是真实打印机驱动还是虚拟打印机驱动,所以对于虚拟打印也会采用路径填充对虚线进行优化处理。但是,对虚拟打印来说,由于对虚线处理后得到的版式文件的信息量变大,虚拟打印后的版式文件,会存在一定的失真,尤其是在显示时,从而使版式文件尺寸变大,显示和打印变慢。
[0012]图1a?图1c是微软word中常用的二种虚线,其中图1a是短划线像是的虚线,图1b是划线-点形式的虚线,图1c是划线-点-点形式的虚线。
[0013]在真实打印时,word通过打印接口送给虚拟打印驱动的指令是用路径填充处理后的信息,虚线中的每一个实线段就是一个路径填充。以图1a所示虚线中的一个小实线段的路径填充为例,描述包括:
[0014]Fill Path m 900.00, 1052.001 919.00, 1052.00 I 921.00, 1053.00 I922.00, 1055.00 I 921.00, 1057.00 I 919.00, 1058.00 I 900.00, 1058.00 I898.00, 1057.00 I 897.00, 1055.00 I 898.00, 1053.00 I 900.00, 1052.00 I900.00, 1052.00 endsubpath
[0015]其中,m表示当前光标移到的位置即画线的起点,I表示画直线段到此点即所画线段的终点。
[0016]图1a中有多少条小实线段,就有多少条这样的填充指令,如果在一篇文档里大量使用虚线,比如虚线表格等,采用上述路径填充的方式处理后的虚线转换后的版式文件的数据量将是非常大的。因此,如果不将虚线信息还原,而直接用路径填充来实现虚线,则指令数量将大幅增加,从而使版式文件的尺寸变大、显示和打印的速度变慢,同时也对原版原貌有一定的影响。
[0017]为了尽可能减少信息损失,同时保证虚拟打印输出的版式文件与原始文档的信息的一致性,需要对虚拟打印进行相应的优化处理。
【发明内容】
[0018]有鉴于此,本发明的主要目的在于提供一种虚拟打印中对图片的处理方法,能够减少虚拟打印后版式文件的信息损失,同时保证虚拟打印输出的版式文件与原始文档的信息的一致性。
[0019]本发明的另一目的在于提供一种虚拟打印中对虚线的处理方法,能够减少虚拟打印后版式文件的信息损失,同时保证虚拟打印输出的版式文件与原始文档的信息的一致性。
[0020]为达到上述目的,本发明的技术方案具体是这样实现的:
[0021](待权利要求撰写完毕后直接拷贝过来即可)
[0022]由上述技术方案可见,本发明在虚拟打印前,对于被切分的若干图片,首先进行合并处理,以还原出一幅原始图片,然后再按照现有方法实现虚拟打印。通过本发明对图片的优化处理,避免了虚拟打印后版式文件的变大,从而减少了虚拟打印后版式文件的信息损失,保证了虚拟打印输出的版式文件与原始文件的一致性。
[0023]对于原始文档中已采用路径填充描述的虚线,首先将其还原为版式文件中的虚线指令描述后,再按照现有方法实现虚拟打印。由于虚线指令非常简洁,所以,通过本发明对虚线的优化处理,避免了虚拟打印后版式文件的变大,从而减少了虚拟打印后版式文件的信息损失,保证了虚拟打印输出的版式文件与原始文件的一致性。
【专利附图】
【附图说明】
[0024]图1a是短划线形式的虚线示意图;
[0025]图1b是划线-点形式的虚线示意图;
[0026]图1c是划线_点_点形式的虚线不意图;
[0027]图2是本发明虚拟打印中对图片进行处理的流程图;
[0028]图3a是本发明图片处理中合并从上向下切分的图片的示意图;
[0029]图3b是本发明图片处理中合并从下向上切分的图片的示意图;
[0030]图4是本发明虚拟打印中对图片进行处理的实施例的流程图;
[0031]图5是本发明虚拟打印中对虚线进行处理的流程图;
【具体实施方式】
[0032]为使本发明的目的、技术方案及优点更加清楚明白,以下参照附图并举实施例,对本发明进一步详细说明。
[0033]本发明的基本思想是:接收虚拟打印数据,根据接收到的虚拟打印数据中的指定数据的属性特征,合并属于同一属性特征的图片信息数据。当数据为图片数据,合并的方法包括:合并属于同一图片的图片信息数据;当指定数据为虚线数据,合并的方法包括:将虚线数据中属于同一虚线的路径填充描述转换为虚线指令。
[0034]对于原始文档中已经被切分成若干小图片的图片信息,本发明虚拟打印驱动通过对这些小图片的分析,将其还原为原图后再进行虚拟打印输出。
[0035]图2是本发明虚拟打印中对图片进行处理的流程图,如图2所示,包括以下步骤:
[0036]步骤200:接收虚拟打印数据。
[0037]本步骤的实现与现有方法是一致的,这里不再赘述。需要说明的是,如果本次虚拟打印完成,则退出本流程。
[0038]步骤201:根据接收到的虚拟打印数据中的图片数据中的属性特征,合并属于同一图片的图片信息数据。
[0039]在接收到的虚拟打印数据中,如果存在图片数据,说明需要进行虚拟打印的文档中存在图片,而且,按照现有打印系统对图片的处理,如果这个图片是大图片的话,该图片是由切分后的若干小图片组成的。
[0040]图片数据包括用于描述图片内容的图片信息数据及其属性特征,一般,属性特征包括:
[0041]I)接收图片数据的虚拟打印驱动接口函数,目前有三个,分别是DrvBitBlt O、DrvStretchBlt O 和 DrvCopyBits O。
[0042]2)图片的颜色位数、宽度、高度、格式(如bmp或jpg等);
[0043]3)显示位置的坐标值,显示大小如显示宽度、显示高度;
[0044]4)光栅操作码。
[0045]符合下列条件的图片信息数据源于同一个图片:
[0046]I)接收图片数据的虚拟打印驱动接口函数相同;
[0047]2)图片的压缩格式相同,比如同为bmp无压缩格式;
[0048]3)图片必须在纵向(y方向)连续相接显示:对于从上往下切分的情况,上一个图片显示位置的I坐标加上其显示高度后等于当前图片的显示位置的I坐标值;对于从下往上切分的情况,当前图片显示位置的y坐标加上其显示高度后等于上一个图片的显示位置y坐标值。
[0049]4)图片的颜色位数、宽度相同、显示高度与图片本身的高度比值相同;
[0050]5)光栅操作码相同。
[0051]也就是说:接收到的图片和缓存的图片的宽度相等,且显示的宽度也相等;接收到的图片的显示高度与其被切分后的高度之比,等于缓存的图片的显示高度与其被切分后的高度之比;
[0052]对于从上向下切分的情况,缓存的图片的显示位置的y坐标加上其显示高度,等于当前接收到的图片的显示位置的I坐标值;对于从下向上切分的情况,当前接收到的图片的显示位置的y坐标加上其显示高度,等于缓存的图片的显示位置的y坐标值;接收到的图片与缓存的图片的光栅操作码相同。
[0053]本步骤的将两个压缩格式、颜色位数、宽度相同的图片沿y方向合并为一个图片中,需要修改图片高度及其显示高度以及显示位置的y坐标值:
[0054]合并后图片的高度为接收到的图片和缓存的图片的高度之和;合并后图片的显示高度为接收到的图片和缓存的图片的显示高度之和;
[0055]对从上向下切分的情况,合并后图片的显示位置为缓存的图片的显示位置;对从下向上切分的情况,合并后图片的显示位置为缓存的图片的显示位置的X坐标值为缓存的图片的显示位置的X坐标值,y坐标值为缓存的图片的显示坐标的I坐标值减去当前接收到的图片的高度。
[0056]下面举例具体描述步骤201中合并图片的具体实现:
[0057]图3a是本发明图片处理中合并从上向下切分的图片的示意图,图3b是本发明图片处理中合并从下向上切分的图片的示意图。在图3a和图3b中,左边是原图被切分成的图片A和图片B,假设图片A是先接收到的,图片B是当前接收到的;右图是这两个被切分的图在页面中经缩放后的显示。
[0058]如果图片A和图片B源于冋Iv图片,那么,图片A和图片B必须冋时?两足以下条件:
[0059](I)宽度相等;图片A和图片B的宽度相等,且显示的宽度也相等;
[0060](2)图片A的显示高度与切分后的图片A高度之比,等于图片B的显示高度与切分后的图片高度之比,即h21/hll=h22/hl2 ;
[0061](3)图片必须连续显示。也就是说:对于从上向下切分的情况,先接收到的图片A显示位置的I坐标加上其显示高度,等于当前接收到的图片B的显示位置的y坐标值,即yl+h21=y2 ;对于从下向上切分的情况,当前接收到的图片B显示位置的y坐标加上其显示高度,等于先接收到的图片A的显示位置的y坐标值,即y2+h22=yl。
[0062]4)图片A与图片B的光栅操作码相同。
[0063]将符合上述4个条件的当前图片B与先接收到的图片A进行合并,并修改图片高度及其显示高度以及显示位置的y坐标值。修改图片高度及其显示高度以及显示位置的y坐标值的方法为:假设图片A和图片B合并后为新图片A,则新图片A的高度为hll+hl2 ;显示高度为h21+h22 ;对从上向下切分的情况,显示位置为(xl,yl),对从下向上切分的情况,显示位置为(xl,yl_h22)。
[0064]图4是本发明虚拟打印中对图片进行处理的实施例的流程图,如图4所示,包括如下步骤:
[0065]步骤400?步骤401:接收虚拟打印数据,并判断接收数据的虚拟打印接口函数是否是 DrvBitBlt O、DrvStretchBlt O 和 DrvCopyBits O 中之一,如果是,进入步骤 405 ;如果不是进入步骤402。
[0066]步骤402:判断是否已有图片缓存,如果没有,进入步骤403,否则进入步骤404。
[0067]预先设置有用于缓存接收到的图片数据的缓存空间。
[0068]步骤403:处理当前接收到的虚拟打印数据,之后返回步骤400。
[0069]步骤404:将缓存的图片写入版式文件中,并清空缓存后进入步骤403。其中,写入的实现属于现有方法,这里不再赘述。
[0070]步骤405:判断是否已有图片缓存,如果有,进入步骤406,否则进入步骤411。
[0071]步骤406:比较当前接收到的图片与缓存中的图片,并判断是否属于同一图片,如果是进入步骤409 ;否则进入步骤407。本步骤具体实现的方法在图2中已详细描述,这里不再赘述。
[0072]步骤407?步骤408:将缓存的图片写入版式文件中,并利用当前接收到的图片更新缓存后返回步骤400。
[0073]步骤409:合并当前接收到的图片与缓存中的图片,并更新合并后的图片的特征属性。本步骤的具体实现在图2中已有详细描述,这里不再赘述。
[0074]步骤410:利用合并后的图片更新缓存后返回步骤400。
[0075]步骤411:将当前接收到的图片存入缓存后返回步骤400。
[0076]从图2及图4的流程可见,本发明在虚拟打印前,对于被切分的若干图片,首先进行合并处理,以还原出一幅原始图片,然后再按照现有方法实现虚拟打印。通过本发明对图片的优化处理,避免了虚拟打印后版式文件的变大,从而减少了虚拟打印后版式文件的信息损失,保证了虚拟打印输出的版式文件与原始文件的一致性。
[0077]对于原始文档中已采用路径填充描述的虚线,本发明虚拟打印驱动通过将其还原为版式文件中的虚线指令描述后再进行虚拟打印输出。
[0078]首先简单介绍一下版式文件中如何采用虚线(dash)指令来描述虚线。
[0079]dash是对线型特性的描述,假设d是dash指令,之后为dash指令的参数:
[0080]指令d[]0,表示实线;
[0081 ] 指令d [m] i,表示m长度的线段为实线、m长度的线段为虚线,且从i% (m+m)长度开始描绘;比如d[3]5,5取(3+3)的模是5,则表示从第5个点开始的第一个点为虚线,第二个点开始实线为长度3、虚线为长度3的循环。
[0082] 指令d[m n] i,表示m长度的线段为实线,η长度的线段为虚线,从i% (m+n)长度开始描绘;
[0083]指令d[m n h k] i,表示m长度的线段为实线,η长度的线段为虚线,h长度的线段为实线,k长度的线段为实线,从i% (m+n+h+k)长度开始描绘;
[0084].......依次类推。需要说明的是,m、n可以不是整数。
[0085]按照版式文件中dash指令描述虚线的方法,图1a?图1c中直线段的完整指令分别为:
[0086]d[3]0 m 108 746.6 I 300 746.54 ;
[0087]d[3 0.00075]O m 108 746.6 I 300 746.54 ;
[0088]d[5.25 3 0.00075 3 0.00075 3]O m 108 746.6 I 300 746.54。
[0089]其中,m表示当前光标移到的位置即画线的起点,I表示画直线段到此点即所画线段的终点。可见,这三条虚线段用dash指令是非常简洁的。所以,如果虚线采用虚线指令来描述,将避免由于采用路径填充描述所带来的虚拟打印后版式文件的变大,从而减少虚拟打印后版式文件的信息损失,保证虚拟打印输出的版式文件与原始文件的一致性。
[0090]图5是本发明虚拟打印中对虚线进行处理的流程图,如图5所示,包括以下步骤:
[0091]步骤500:接收虚拟打印数据。接收用于描述虚线的路径填充的虚拟打印驱动接口函数是 DrvFillPath O。
[0092]本步骤的实现与现有方法是一致的,这里不再赘述。需要说明的是,如果本次虚拟打印完成,则退出本流程。
[0093]步骤501:将接收到的虚拟打印数据中的属于同一虚线的路径填充描述转换为虚线指令。
[0094]本步骤包括两个过程:过程一是判断出属于同一虚线的路径填充;过程二是将属于同一虚线的路径填充转换为虚线指令。
[0095]过程一,判断接收到的路径填充描述的虚线是否属于同一虚线的路径填充的方法为:
[0096]步骤SI,比较接收到的两个路径填充描述的虚线的形状,比较形状的方法:
[0097]步骤a:坐标点数是否相同,如果点数不同则认为形状不同,二者不属于同一虚线;如果点数相同,则继续执行步骤b ;
[0098]步骤b:将每个路径的坐标原点都偏移到第一个点,然后比较每个路径中各个点的坐标值是否相同,如果相同,则表示接收到的两个路径填充描述的虚线的形状相同,否则不同。
[0099]每个路径的坐标原点都偏移到第一个点的方法为:假设路径的第一个点的坐标是(x0, y0),将路径的所有点的X和y都分别减去xO和y0即得到。
[0100]进一步地,可以预先设置一误差如等于1,即坐标值相减后的绝对值小于I即表示每个路径中各个点的坐标值是相同。当所设置的误差为O时,判断结果为绝对相等。
[0101]所述形状相同为:接收到的两个路径填充的坐标点数相同,且将第二个路径的第一个点偏移到第一个路径的第一个点后,两个路径完全重合,即将第二个路径经过平移的坐标变换后,两个路径中各对应点的坐标值相同,则所述形状相同。如果形状相同,则继续执行步骤S2 ;否则表明接收到的路径填充描述的虚线不属于同一虚线,继续接收虚拟打印数据。
[0102]步骤S2,连接当前路径的中心点与所有已经判断属于同一虚线的路径的中心点,判断是否处在同一线段,如果中心点仍在同一线段之上,则继续执行步骤S3,否则表明接收到的路径填充描述的虚线不属于同一虚线,继续接收虚拟打印数据。这里,所有已经判断属于同一虚线的路径可以先存在预先设置的缓存中。线段包括直线段如水平直线段、垂直直线段、或任意方向直线段。如何判断一个点是否位于这些线段之上属于成熟技术,这里不再详述。
[0103]本发明在虚拟打印中对虚线的优化处理,除了上述的水平虚直线段外,还包括垂直虚直线段,任意方向虚直线段等,其识别以及还原与水平虚直线的区别主要是:
[0104]I)每个填充路径中心点连接后形成的线段不是水平直线段,而对应上述除水平虚直线段外的虚线段类型分别是垂直直线段、任意方向虚直线段等;
[0105]2)比较每个路径填充的形状是否相同时,对坐标的变换不一样。
[0106]比如,水平直线段只需要将坐标进行偏移,使每个路径的第一个点位(0,0)坐标点,但对于其它虚线段,除了将坐标原点偏移到每个路径的第一点外,还可能要进行旋转变换后才可以进行比较,具体实现属于本领域技术人员惯用技术手段,这里就不再赘述。
[0107]除了以上两点区别外,对包括垂直虚直线段,任意方向虚直线段等的其它处理方法与水平虚直线段完全一致。
[0108]以上所述仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换以及改进等,均应包含在本发明的保护范围之内。
【权利要求】
1.一种虚拟打印的处理方法,其特征在于,该方法包括:接收虚拟打印数据,分析接收到的虚拟打印数据中的属性特征,合并属于同一属性特征的数据。
2.根据权利要求1所述的处理方法,其特征在于,所述分析接收到的虚拟打印数据中的属性特征后得出接收到的数据为图片数据,合并的方法包括:合并属于同一图片的图片信息数据。
3.根据权利要求2所述的处理方法,其特征在于,在接收到虚拟打印数据之后,该方法还包括:判断所述接收到的虚拟打印数据中是否包括有图片数据,如果存在,继续执行后续合并的步骤。
4.根据权利要求3所述的处理方法,其特征在于,如果所述接收数据的虚拟打印接口函数是 DrvBitBlt (...) >DrvStretchBlt (...)和 DrvCopyBits (...)中之一,则判断出所述接收到的虚拟打印数据中包括有图片数据。
5.根据权利要求2所述的处理方法,其特征在于,所述图片数据包括用于描述图片内容的图片信息数据及其属性特征;其中属性特征包括:图片的颜色位数、宽度、高度、格式、显示位置的坐标值、包括显示宽度显示高度的显示大小,以及光栅操作码。
6.根据权利要求5所述的处理方法,其特征在于,所述属于同一图片的图片信息数据为: 所述接收图片数据的虚拟打印驱动接口函数相同; 和,图片的压缩格式相同; 和,图片必须在纵向连续相接显示; 和,所述接收图片数据的颜色位数、宽度相同,显示高度与图片本身的高度比值相同; 和,所述光栅操作码相同。
7.根据权利要求3所述的处理方法,其特征在于,如果判断出所述接收到的虚拟打印数据中不包括图片数据, 进一步判断:预先设置的用于缓存接收到的图片数据的缓存空间中是否已存储有图片,如果没有,处理当前接收到的虚拟打印数据,并继续接收虚拟打印数据,直至完成本次虚拟打印;否则,将缓存中的图片写入版式文件中,并清空缓存后继续接收虚拟打印数据,直至完成本次虚拟打印。
8.根据权利要求2所述的处理方法,其特征在于,在所述合并步骤之前还包括: 判断预先设置的用于缓存接收到的图片数据的缓存空间中是否已存储有图片,如果有,在所述接收到的图片与缓存的图片属于同一图片时,继续执行合并的步骤;否则,将当前接收到的图片存入缓存后继续接收虚拟打印数据,直至完成本次虚拟打印。
9.根据权利要求8所述的处理方法,其特征在于,如果所述接收到的图片与缓存的图片不属于同一图片,该方法还包括: 将所述缓存的图片写入版式文件中,并利用当前接收到的图片更新缓存后继续接收虚拟打印数据,直至完成本次虚拟打印。
10.根据权利要求8所述的处理方法,其特征在于,所述合并的方法为将两个压缩格式、颜色位数、宽度相同的图片沿y方向合并为一个图片; 合并后图片的高度为接收到的图片和缓存的图片的高度之和;合并后图片的显示高度为接收到的图片和缓存的图片的显示高度之和; 对从上向下切分的情况,合并后图片的显示位置为缓存的图片的显示位置;对从下向上切分的情况,合并后图片的显示位置为缓存的图片的显示位置的X坐标值为缓存的图片的显示位置的X坐标值,y坐标值为缓存的图片的显示坐标的I坐标值减去当前接收到的图片的高度。
【文档编号】G06F3/12GK104516689SQ201310446926
【公开日】2015年4月15日 申请日期:2013年9月26日 优先权日:2013年9月26日
【发明者】王东临 申请人:天津书生软件技术有限公司