如何通过标签文件接口打印书脊标签
dp2 系统内务前端的“标签打印”窗提供了打印书脊标签的功能。这个功能不但可以为 dp2 系统内的业务流程所用,也可以利用标签文件接口为第三方系统提供打印书脊标签的功能,还可以打印图书的册条码。本文重点介绍如何利用标签文件接口来进行打印。
准备工作
安装 dp2 内务前端
打印书脊标签是使用内务前端的标签打印窗来进行的,所以首先需要安装一个内务前端。
安装的环境条件:
- Windows 7(SP1)/8/10 操作系统,打好全部 Windows 系统补丁;
- .NET Framework 4.7.2 环境。安装内务前端时会自动提醒安装 .NET Framework 环境,依提示操作即可;
- 建议这台电脑不要安装任何杀毒软件,因为杀毒软件可能会干扰内务运行。
用浏览器访问下述 URL: http://dp2003.com/dp2Circulation/v3/publish.htm 即可下载和安装内务前端。
安装步骤
安装程序会引导我们进行安装。
在第二步“发行版”属性页,选择“社区版”。
在安装的最后一步”选择服务器“,在”服务器类型“列表中选择“[暂时不使用任何服务器]”,意思是暂时不使用任何 dp2library 服务器。因为这里仅使用内务的标签打印功能。
启动内务前端
内务前端安装好以后,Windows 开始菜单里面会有一个程序组“DigitalPlatform”,里面有一个菜单项“dp2 内务 V3”,可以用来启动内务前端。也可以在前述安装页面(http://dp2003.com/dp2Circulation/v3/publish.htm)上点“启动”锚点启动。
内务前端启动后,会首先出现一个登录对话框。点“取消”按钮即可。(因为我们只用到内务的标签打印功能,所以不需要登录任何 dp2library 服务器)
在内务框架窗口上使用主菜单命令“功能/打开功能窗口/标签打印窗”,可以打开一个标签打印窗。这是一个 MDI 子窗口。标签打印功能只需要使用这一个子窗口即可。
进入标签打印模式
内务前端有很多标签打印以外的功能,如果不想看到这些功能的菜单项,每次启动内务就只使用标签打印功能,可以设置一下让它进入“标签打印模式”。
方法是:
- 在内务框架窗口上使用主菜单命令“帮助/参数配置”,进入参数配置对话框;
- 在“外观”属性页,勾选“标签打印模式”。点对话框的“确定”按钮;
- 在内务框架窗口上使用主菜单命令“文件/退出”,退出内务前端。以后再启动内务前端的时候,就会直接进入标签打印模式。
标签文件接口
内务的标签打印功能,是通过加载“标签文件”来获取标签文本内容的。
标签文件是普通文本文件,其格式如下:
I247.5
1234
***
I247.5
1234
***
即一个标签用多行文本表示,有多少行就会在标签上打印出这么多行;每个标签之间间隔一个 *** 行。
如果想打印一维码的图书册条码,可以将标签文件内容设置为如下格式,第一行是机构名称,第二行为册条码号:
星洲小学
B000001
***
星洲小学
B000002
***
如何指定标签文件
在标签打印窗的“标签文件名”文本框中输入标签文件名,标签打印窗就可以利用这个标签文件了。也可以点该文本框右侧的“...”按钮,会出现一个装载文件的对话框,方便指定标签文件。
内务前端退出时,会记忆本次用过的标签文件名,下次启动的时候,会在界面上恢复这个文件名。
自动探测标签文件内容变化
当为标签打印窗指定了一个标签文件名以后,它就会自动监控这个文件内容的变化。当文件内容发生变化以后,它会自动装载新内容到窗口内。
您可以尝试用 Windows 记事本或者其他文本编辑器修改标签文件,可以看到文件保存后,标签打印窗内会自动更新显示修改后的内容。
这样,上游输出标签文件的程序,如果恒定输出到一个标签文件中,内务的标签打印窗就可以自动探测到文件内容的变化,省去了重新指定标签文件的操作。
标签定义文件
标签定义文件是用来定义标签排版和打印格式的一种 XML 文件。注意和“标签文件”区分,标签文件是存储要打印的标签文本内容的一种普通文本文件。
标签定义文件只需要定义一次即可。以后同一种规格的标签纸,沿用定义好的标签定义文件即可。建议提供标签纸的商家搜集整理各种规格的标签纸的定义文件,提供给用户单位,可免去用户每次自己重新定义的烦恼。
标签打印窗“标签定义文件名”文本框右侧有一个“设计”按钮,点它会出现标签设计对话框。这是一个所见即所得的标签设计界面,方便用户设计定义标签页面。但所有设计信息都会存储在标签定义文件内,如要给其他用户提供标签设计格式,只需要拷贝标签定义文件即可。
格式
下面是一个样例标签定义文件内容:
<?xml version="1.0" encoding="utf-8"?>
<root>
<page width="850" height="236.220472440945" margins="7.8740157480315,7.8740157480315,7.8740157480315,7.8740157480315" defaultPrinter="printerName=\\MAC-STAR\HP LaserJet Professional P1108;paperName=8.5x13(自定义),850,1300" />
<label width="200" height="200" paddings="50,50,0,0" font="Times New Roman, 30pt" lineSep="0" />
<lineFormats>
<line font="Times New Roman, 20pt" align="right" />
<line font="Times New Roman, 20pt" align="center" style="" />
</lineFormats>
</root>
page 元素 -- 页面参数
page 元素定义了打印页面的参数。
width 和 height 属性定义了页面的宽度和高度。单位是 1/100 英寸。
margins 属性定义了页边距。是四个数字,顺次表示“左,上,右,下”边距,单位是 1/100 英寸。
defaultPrinter 属性定义了默认的打印机特征。
label 元素 -- 标签参数
label 元素定义了一个标签的参数。
width 和 height 属性定义了一个标签的宽度和高度。单位是 1/100 英寸。
padding 属性定义了标签边沿的空白。由四个数字构成,顺次表示“左,上,右,下”边沿空白,单位是 1/100 英寸。
font 属性定义了标签所用的默认字体。
lineSep 定义了标签内文字行之间的行间距。单位是 1/100 英寸。
lineFormats 元素 -- 标签文字行
lineFormats 元素是一个容器元素,其内可以包含若干 line 元素,每个 line 元素负责定义一个文字行的格式。
line 元素 -- 定义一行文字
line 元素定义一行文字的格式。
font 属性定义了本行所用的字体。如果这里的 font 属性缺省,则会自动采用 label 元素 font 属性所定义的默认字体。如果同时也使用了(line 元素)这里的 font 属性,则这里的优先起作用。
align 属性定义了文字的对齐方向。值为 "left" "center" "right" 之一。
style 属性定义了本行的风格。后面专门用一个小节介绍。
offset 属性定义了本行的位置偏移。值为 “X偏移,Y偏移”这样的两个数字形态,例如 "-10,20"表示 X 方向向左偏移 10,Y 方向向下偏移 20。单位为 1/100 英寸。
start 属性定义了本行左上角位置。值为 “X位置,Y位置”这样的两个数字形态,例如 "-5,10"。单位为 1/100 英寸。两个数字均可不出现(但逗号始终需要使用),表示它使用缺省值。由于各行默认采用流式布局,即下一行自动处在上一行的正下方,一般情况下本属性可以不用。
size 属性定义了本行的外围尺寸。值为“宽,高”这样的两个数字形态,例如 "200,100"。宽和高数字如果不出现(但逗号始终需要使用),则表示它使用缺省值,例如 "100," 表示宽度为 100,高度使用默认值。单位为 1/100 英寸。由于各行默认采用流式布局,一般情况下本属性可以不用。如果不用本属性,那么默认本行宽度为标签内除去左右边距以后的所有宽度;本行高度由本行 font 属性或(label 元素的 font 属性定义的)默认字体决定。
foreColor 属性定义了本行的文字颜色。
backColor 属性定义了本行的背景颜色。
行风格
line 元素的 style 属性值格式比较复杂,这里单独用一节来讲解。
行风格采用一系列逗号间隔的子参数来进行定义。例如 "line_style:bottom,text_style:auto_fit"。每个逗号之间是一个子参数的范围。子参数名和子参数值之间用冒号间隔。显然,子参数值里面不能用逗号来间隔多个值,一般会使用竖线 | 来分隔。
picture 子参数 -- 图像文件
只要定义了 picture 子参数,那么打印模块会自动把本行标签文字内容当作图像文件名使用。如果图像文件名字符串的第一个字符为 '',则表示文件名是完整、包括路径的文件名;否则就是一个单纯文件名,打印模块会在标签文件所在的目录寻找这个图像文件。
text_style 子参数 -- 文字风格
auto_fit 表示自动调整字体大小以被本行外围尺寸所容纳。也就是说当文字太多导致本行打印不下的时候,会自动缩小字体,直到可以完整打印在本行内。
shupai 表示行显示为竖排风格,也就是中文古籍的那种上下排列的方式。如果竖排方式下字间距不合适,可以用 shupai_delta 子参数来调整,见后。
shupai_delta 子参数 -- 竖排字间距调整
shupai_delta 子参数要和 text_style:shupai 配套使用。也就是说 shupai_delta 子参数单独使用没有意义。shupai_delta 用来调整竖排情况下的字间距大小。
例如 shupai_delta:-0.1 表示间距减小字高的 10%。shupai_delta 子参数缺省的时候,默认 -0.2。
line_style 子参数 -- 线条风格
表示随本行文字绘制的线条的风格。为 top bottom center 之一,分别表示在本行文字的顶部、底部、中部绘制横线。如果没有使用 line_style 子参数,则不会绘制横线。
barcode 子参数 -- 条码风格
如果包含 qr 或 qrcode 值,表示打印为二维码。否则为一维码。
如果不使用 barcode 子参数,则本行会被当作普通文字打印(不会被当作条码打印)。
barcode_text_style 子参数 -- 条码下方附带的条码号文字的风格
none 表示不出现附带的条码号文字。默认是要出现附带的条码号文字(如果本行是按照条码来打印的话)
流式布局
为了方便定义标签打印格式,默认各行采用从上到下排列的自然顺序,纵向紧密排列。
标签内除了四个边距以外的空间,全部都用于文字行的排列。即,文字行的宽度默认就是左右除去边距以外剩下的全部宽度。
lineFormats 元素内的 line 元素,每个 line 元素负责定义一行文字的格式。如果 line 元素数量少于标签内容的行数,那么多出来的文本行按照默认的流式布局继续向下方延展排列。
标签内的“文字行”实际上是广义的文字行。条码、横线、图像,也都被认为是一个特殊的文字行,服从上述流式布局原则。
标签设计界面
标签打印窗为标签排版和打印格式提供了一个设计界面。
(在标签打印窗右上角点“设计”按钮可以打开标签设计界面)

标签设计对话框实际上是通过图形界面来设置标签定义文件。可以很方便的实时观察到每一处参数修改的效果。
属性页
对话框分为以下几个属性页:
- 页面
- 标签
- 行格式
- XML
- 样例标签内容
下面逐个介绍这些属性页。
页面
在这里可以设置打印页面参数。对应于标签定义文件中 page 元素。
可以用两种方式设定页面尺寸:1) 手动设定页面尺寸;2) 根据打印机纸张设定页面尺寸。手动设定页面尺寸,需要把页面长宽数字输入;根据纸张设定,则是通过选择打印机提供的现成纸张尺寸来设定。
值得注意的是,如果标签纸属于特殊尺寸,当前打印机并没有现成的符合这个尺寸的纸张定义,那么就需要我们利用打印机的自定义纸张尺寸功能,预先定义好标签纸尺寸,然后再选用。纸张尺寸必须准确,否则在换页的时候会产生多余的空白。
在这里还可以定义内容边距。顺序为“左,上,右,下”。一张纸,除去边沿的边距部分外,里面的部分就是用于标签排列的全部区域。标签会按照从左到右,从上到下的顺序自动排列。一行排列不下就会自动放到下面一行。所以纸张上打印多少行、列的标签,是由页面尺寸(可用部分)和标签尺寸共同决定的。
“显示调试线”可以设定是否在右侧预览区显示出调试线。调试线可以帮助我们观察标签的边沿位置,标签内文字行之间的行间距等等。
设置页面尺寸时,要注意区分页面的长,高方向,高度设置采用量取多个标签取平均值的方式来设置。可以参考如何打印书脊标签相关章节。
标签
在这里可以定义标签格式参数。对应于标签定义文件中的 label 元素。
“标签字体”定义了默认的标签字体。如果某一行的标签行格式中没有定义字体,则会沿用这里定义的字体。否则就用本行定义的专门字体。
标签字体里面的 “pt” 是“点”这样一种字体尺寸度量单位,为 1/72 英寸。
“设为条码字体”按钮可以把标签字体设置为条码字体。条码字体是软件携带的一种特殊字体,字符打印出来是条码的形状。注意这里的条码字体是对默认的标签字体起作用,如果标签行格式中专门定义了字体,这一行就不会使用这个默认字体了。
条码字体是实现条码打印的一种方式,不是唯一的方式。在行格式定义中,还可以用 style 属性定义绘制的条码,可以参考相关小节。
(实践发现打印条码时,如果采用【标签】页面设置为条码字体,打印出来一维码的效果不理想。条形码的疏密不尽合理。所以打印条码还是推荐从【行格式】来设置)
【标签】属性页标签宽度和高度时,要注意标签高度/宽度小于或等于页面的宽度/高度,否则可能造成系统出错,无法打印。具体设置可以参考如何打印书脊标签相关章节。
行格式
在这里可以定义一个标签内各个文本行的格式。对应于标签定义文件中的 lineFormats 元素。
具体在设置的时候,有几行内容就要创建几个行格式。设置时行格式的【文字】定义了该行文字的字体,对齐方式以及风格;【位置】定义了该行文字的起始X/Y位置以及偏移位置,字体宽度和高度;特殊的,如果需要将某行文字打印成条码,则这一行所对应的行格式的【文字】设置中,【字体】一栏需要设置为普通字体以及大小,同时【风格】一栏要设置为barcode。这样打印出来这一行的内容会显示为条码的同时,下方显示具体的内容。如下图:
XML
在这里可以观察和直接修改标签定义文件的 XML 形态内容。
样例标签内容
在这里可以设置用于预览的标签文件内容。标签设计界面会利用这里的内容来渲染出标签图像。
尺寸单位
标签设计对话框左下角有“尺寸单位”列表。可以在 “1/100 英寸” 和 “毫米” 之间进行选择。标签定义文件里面的 XML 代码默认采用 1/100 英寸单位;在标签设计界面上则可以从两种单位中选择一种。当改变选择后,可以看到设计界面上的数字会发生变化。
一般中国人习惯使用米制单位,但其实打印机的纸张尺寸原始基本都是英制单位。这里提供一个经验,当您用米制测量一个尺寸发现它有零有整的,如果您转换为英制,就可能会发现它非常接近一个简单整数,那么大概率这个简单整数就是理论精确尺寸。比如图书馆常用的 3X5 英寸卡片的尺寸。
样例
多行文字
下面例子,定义了页面为 600 宽 600 高,标签为 300 宽 300 高。页边距四个方向都为 0,这样一页正好放下四个标签。
标签定义 XML 代码如下(粘贴到标签设计界面里面可以直接看到效果):
<?xml version="1.0" encoding="utf-8"?>
<root>
<page width="600" height="600" margins="0,0,0,0" defaultPrinter="" />
<label width="300" height="300" paddings="50,50,0,0" font="Times New Roman, 30pt" lineSep="0" />
<lineFormats>
<line align="" style="" />
<line align="" style="" />
</lineFormats>
</root>
样例标签内容:
U664.121
N590
***
I247.6
G910
***
U664.121
N590
***
I247.6
G910
***

每一行用不同的字体
标签中的每一行都可以使用不同的字体。
例如:
...
<lineFormats>
<line font="Ink Free, 26pt" />
<line font="Cera PROModern Medium, 26pt, style=Bold" />
</lineFormats>
...
第一行和第二行都用了 font 属性定义字体。

包含一个条码行(一维码、条码字体)
标签定义:
<?xml version="1.0" encoding="utf-8"?>
<root>
<page width="600" height="600" margins="0,0,0,0" defaultPrinter="" />
<label width="300" height="300" paddings="50,50,0,0" font="Times New Roman, 30pt" lineSep="0" />
<lineFormats>
<line font="Ink Free, 26pt" align="" style="" />
<line font="Cera PROModern Medium, 26pt, style=Bold" />
<line font="barcode, 30pt" align="left" />
</lineFormats>
</root>
注意第三个 line 元素的 font 属性使用了条码字体。
样例标签内容:
U664.121
N590
123456789
***
I247.6
G910
123456789
***
U664.121
N590
123456789
***
I247.6
G910
123456789
***

绘制的条码(一维码)
“绘制的条码”的意思是,不使用条码字体,而是用专门的条码绘制函数库来绘制出条码图像。
<?xml version="1.0" encoding="utf-8"?>
<root>
<page width="600" height="600" margins="0,0,0,0" defaultPrinter="" />
<label width="300" height="300" paddings="50,50,0,0" font="Times New Roman, 30pt" lineSep="0" />
<lineFormats>
<line font="Ink Free, 26pt" align="" style="" />
<line font="Cera PROModern Medium, 26pt, style=Bold" />
<line style="barcode" />
</lineFormats>
</root>
line 元素的 style 属性值为 "barcode",表示把这一行内容绘制为一维码。一维码的宽度自动充满本行的宽度,高度则由 label 元素 font 属性定义的默认字体来决定。

下面我们做一些变化。
通过 size 属性,把高度专门修改为 100:
<line style="barcode" size=",100" />

通过 size 属性,把宽度专门修改为 120(高度则是根据默认字体决定):
<line style="barcode" size="120," />

通过 style 属性值的 barcode_text_style 子参数将条码附带的文字去掉:
<line style="barcode,barcode_text_style:none" />
注意 barcode 子参数负责定义本行为条码;barcode_text_style 子参数负责定义附带文字的形态。

二维码
使用绘制方式,打印出二维码。
...
<line style="barcode:qr" />
...
绘制出的二维码包含附带的文字部分。可以看到这个二维码图象的高度很小。这是因为它使用了 label 元素 font 属性定义的默认字体高度。

为了增大它的高度,可以使用 size 属性:
...
<line style="barcode:qr" size="150,150" />
...

还可以用 style 属性(的 barcode_text_style 子参数)去掉附带的文字部分:
...
<line style="barcode:qr,barcode_text_style:none" size="150,150" />
...

控制行的位置
默认状态下,line 元素定义的文字行(或者条码)是流式布局的。也就是说第一行下面是第二行,第二行下面是第三行。这种方式的好处是符合一般标签打印的习惯,定义起来比较自然和简单。
但很多时候我们希望把某些行打印到特定的位置,不按照流式布局来决定位置。可以使用 start 和 offset 属性来达到这样的效果。
...
<lineFormats>
<line font="Ink Free, 26pt" />
<line font="Cera PROModern Medium, 26pt, style=Bold" start=",0" />
</lineFormats>
...
这个例子中,第二个 line 元素使用 start 属性,将第二行的 Y 方向起始位置强行设置为 0,这样的效果就是第一行和第二行在 Y 方向重叠了。不过值得注意的是,如果标签内容还有第三行的话,第三行依然是采用流式布局,自动打印在第二行的下方。

...
<lineFormats>
<line font="Ink Free, 26pt" />
<line font="Cera PROModern Medium, 26pt, style=Bold" align="right" start=",0" />
</lineFormats>
...
在上例基础上,为第二行的 line 元素使用了 align 属性,把第二行打印为右对齐效果,这样基本上避开了和第一行文字重叠。

...
<lineFormats>
<line font="Ink Free, 26pt" />
<line font="Cera PROModern Medium, 26pt, style=Bold" start="140,0" />
</lineFormats>
...
和上例不同,使用了 start 属性的 X 部分,也可以让第二行文字在 X 方向和第一行文字避开重叠。

样例(续)
控制行的位置(流式微调)
有时候只是希望在流式布局的基础上微调一下行之间的位置关系。可以使用 line 元素的 offset 属性来实现这种效果。
...
<lineFormats>
<line font="Ink Free, 26pt" />
<line font="Cera PROModern Medium, 26pt, style=Bold" offset="0,40" />
</lineFormats>
...
第二行使用 offset 属性,把第二行和第一行之间 Y 方向的距离拉大了 40。

...
<lineFormats>
<line font="Ink Free, 26pt" />
<line font="Cera PROModern Medium, 26pt, style=Bold" offset="0,-20" />
</lineFormats>
...
当然,也可以用负数来减小距离。

...
<lineFormats>
<line font="Ink Free, 26pt" />
<line font="Cera PROModern Medium, 26pt, style=Bold" offset="50," />
</lineFormats>
...
X 方向也可以移动。

行间距
可以用 label 元素的 lineSep 属性,改变整体的行间距:
<?xml version="1.0" encoding="utf-8"?>
<root>
<page width="600" height="600" margins="0,0,0,0" defaultPrinter="" />
<label width="300" height="300" paddings="50,50,0,0" font="Times New Roman, 30pt" lineSep="20" />
<lineFormats>
<line font="Ink Free, 26pt" />
<line font="Cera PROModern Medium, 26pt, style=Bold" />
</lineFormats>
</root>

(前面介绍了使用 line 元素的 offset 属性可以改变行之间的相对距离。不过,当很多行都需要增加行间距的时候,用 label 元素的 lineSep 属性定义效率更高)
横线
...
<lineFormats>
<line font="Ink Free, 26pt" />
<line font="Cera PROModern Medium, 26pt, style=Bold" style="line_style:bottom" />
</lineFormats>
...
例子中使用 style 属性的 line_style 子参数定义了一条处于本行文字下方的横线。

如果标签内容中本行文字为空白,那么打印出来的效果就是只有一条横线而没有文字了。
图像
可以在标签上打印图像。
标签内容样例如下:
U664.121
reader.png
***
标签定义如下:
...
<lineFormats>
<line font="Ink Free, 26pt" align="" style="" />
<line style="picture" />
</lineFormats>
...

line 元素的 style 属性中可以使用子参数 picture 来表示这里需要打印图像。标签内容的此行负责定义图像文件名。一般情况下,图像文件需要和标签文件放在同一个子目录。
上面这个例子中,图像的高度由 label 元素 font 属性定义的默认字体决定。
注意在标签设计界面,如果指定的图像文件没有找到,那么图像会用一个红色方块表示。如果图像文件存在,则会把图像显示出来。
可以用 line 元素的 size 属性来专门定义图像打印的高度:
...
<lineFormats>
<line font="Ink Free, 26pt"/>
<line style="picture" size=",200" />
</lineFormats>
...

样例(竖排)
line 元素的 style 属性中,可以通过 text_style:shupai 子参数定义竖排风格;通过 shupai_delta:-0.21 子参数调整字间距,其中 -0.21 表示减少相当于行高 21% 的间距。
...
<lineFormats>
<line font="黑体, 21.8571434pt" align="left" style="text_style:shupai,shupai_delta:-0.21" />
</lineFormats>
...
