客户发来一份专用的纸箱唛头文件,一张唛头占了一页,总共有50个产品,每个产品有一个专用的序列号,对应一个专用的唛头,所以文件也有50个页面。
因为客户要求两个正唛粘贴,所以每张唛头需要打印两次,刚好产品的包装箱比较小,正面用一张a4对半裁开刚好可以覆盖。考虑用coreldraw对文件重新排版,对每一页内容缩放至适合a4打印,然后复制一份上下排版。因为页数较多,需要的操作又是机械化的重复操作,就考虑用vba来完成。
强制分页
比较幸运的是客户的文件可以直接利用coreldraw进行编辑,对于很多pdf文件,coreldraw会要求输入口令或直接报错,但是也遇到了一些小问题,拖入coreldraw后文件的所有内容被放在了同一个页面,最初考虑的是通过vba分页导入,边导入边进行排版操作,但是并没有找到分次导入的语句-_-!!!,最后只能退而求其次,先强制分页导入全部页面,然后按页数复制每一页的内容,最后粘贴到指定的打印页面。
Sub Macro1()
Dim impflt As ImportFilter
Dim io As New StructImportOptions
With io
.MaintainLayers = True
End With
Set impflt = ActiveLayer.ImportEx("文件路径名", cdrAI9, io)
impflt.Finish
End Sub
切换页面的操作
通过pages()函数,coreldraw可以灵活的切换操作页面,下面的语句实现了对第2页的全部内容进行缩放,复制,然后返回第一个页面,粘贴所复制的内容这一系列操作。将页面设置为活动需要用到“Activate”命令,曾经一度以为是“moveto”,对页面使用“moveto”指令,其实是改变当前页面的页码。
ActiveDocument.Pages(2).Shapes.All.SetSize 6.889764, 4.645681
ActiveDocument.Pages(2).Shapes.All.Copy
ActiveDocument.Pages(1).Activate
ActiveLayer.Paste
成功的实现一次,就可以成功的实现多次,只需要将pages函数中的数字设置为一个变量,添加一个循环,就可以依次获取到从第2到第n页的内容,并将其依次复制到第一页进行打印。打印之后需要删除上一次复制的内容,以避免重叠。
完整的循环程序如下:
Sub Macro2()
Dim Paste1 As ShapeRange
Dim Paste2 As ShapeRange
For i = 2 To 50
ActiveDocument.Pages(i).Shapes.All.SetSize 6.889764, 4.645681
ActiveDocument.Pages(i).Shapes.All.Copy
ActiveDocument.ReferencePoint = cdrCenter
ActiveDocument.Pages(1).Activate
ActiveLayer.Paste
Set Paste1 = ActiveSelectionRange
Paste1.SetPosition 4.133858, 2.923228
ActiveLayer.Paste
Set Paste2 = ActiveSelectionRange
Paste2.SetPosition 4.133858, 8.769685
ActiveDocument.PrintOut
Paste1.Delete
Paste2.Delete
Next i
End Sub
程序整理
因为导入文件默认从第一页导入,第一页准备留空仅用于打印,所以在导入程序中添加了一句语句,先增加一个页面,再进行导入操作。导入完毕后,再手动运行Macro2()就可以实现自动的排版打印了。
Sub Macro2()
Dim Paste1 As ShapeRange
Dim Paste2 As ShapeRange
For i = 2 To 50
ActiveDocument.Pages(i).Shapes.All.SetSize 6.889764, 4.645681
ActiveDocument.Pages(i).Shapes.All.Copy
ActiveDocument.ReferencePoint = cdrCenter
ActiveDocument.Pages(1).Activate
ActiveLayer.Paste
Set Paste1 = ActiveSelectionRange
Paste1.SetPosition 4.133858, 2.923228
ActiveLayer.Paste
Set Paste2 = ActiveSelectionRange
Paste2.SetPosition 4.133858, 8.769685
ActiveDocument.PrintOut
Paste1.Delete
Paste2.Delete
Next i
End Sub
Sub Macro1()
Dim impflt As ImportFilter
Dim io As New StructImportOptions
Dim p1 As Page
Set p1 = ActiveDocument.InsertPagesEx(1, False, 1, 8.267717, 11.692913)
ActiveDocument.Pages(2).Activate
With io
.MaintainLayers = True
End With
Set impflt = ActiveLayer.ImportEx("文件路径名", cdrAI9, io)
impflt.Finish
End Sub
文件路径名的参考格式:
ActiveLayer.ImportEx("E:\设计资料\测试文件夹\testfile.pdf", cdrAI9, io)