办公自动化杂志
一、
前言作为新一代电子文本,PDF 文档在不少企业得到了普遍应用。由于它把文本、格式、字体、颜、分辨率、图形图像等所有的信息封装在一个特殊的整合文件中,体积小,不易改变,所以不少使用三维软件的技术人员会将三维软件生成的最终工程图直接转换成PDF 文档进行存档保存。由于PDF 文档体积更小,便于浏览与网络传输,不少PLM 全生命周期管理软件也将PDF 文档作为管理对象,在需要进行打印时,直接从PLM 系统中下载PDF 文档,然后进行打印。既避免了下载三维模型及工程图数据量大,速度慢的问题,又避免了因某些原因下载模型不全导致工程图出错的情况。
由于图纸具有不同图幅(通常为A0~A4),所以生成的PDF 图纸也具有不同图幅,这给打印带来了一定的困难。
针对打印PDF 不同图幅图纸的问题,
一般有三种解决办法:一是用软件将PDF 进行拼图(国内某公司拼图软件,约5000元一套),在绘图仪上打印,然后人工进行剪裁;二是使用佳能打印机PlotWave750(国内某国企使用,网络查询价格约52万元),使用其自带软件,自动识别不同图幅,自动使用打印机不同图幅的卷筒纸(见图1);三
是人工一个一个打开PDF 文档,识别图幅,分类,然后用Adobe Reader 软件自带功能将相同图幅的PDF 合并成单一PDF,然后打印。
图1PlotWave750
因为一套图纸(随车吊图纸)通常700~1200张,办法一需要人工剪裁,工作量也比较大;办法二对资金要求高;办法三中如果能用软件自动识别图幅,
自动分类,自动合并相同图幅PDF,对于不少企业来说,将是一个不错的选择。
通过研究,可以利用Excel VBA,调用读取Adobe Reader 软件AcroPDPage 对象的GetSize 属性(或称函数),获取PDF 文档页面的长、宽像素,然后通过运算得到图纸图幅大小,再利用VBA 语言,实现相同图幅PDF 归类与合并,然后进行打印,工作量就大大减小了。
基于VBA 的PDF 文档图幅大小识别的开发
陈兆勇
李文峰
于少萌
(江苏宏昌天马物流装备有限公司
扬州
225000)
摘要:介绍了用Excel VBA 进行开发,自动识别PDF 文档图幅大小的方法。并在此基础上实现进行PDF 合并操作,根据指定文
件进行查等功能,解决了目前某些公司购买软件或设备资金投入高的情况。对于利用Excel VBA 对PDF 文件进行其它功能开发有一定的指定意义。关键词:VBA;PDF;图幅;识别中图分类号:TP317.3;G232文献标识码:A 文章编号:6846
Development of PDF Document Size Recognition Based on VBA
CHEN Zhaoyong
LI Wenfeng
YU Shaomeng
(Jiangsu Hongchang Sky Hourse Logistics Facilities Co.,Ltd.
Yangzhou
225000)
Abstract :This paper introduces the method of developing with Excel VBA and automatically recognizing the size of PDF document.On this basis,it realizes the functions of PDF merger operation and searching according to specified docu-ments,which solves the high investment of some companies in purchasing software or equipment.Excel VBA can be used to develop other functions of PDF files Keywords :VBA;PDF;Size;Recognition
总第400期
2019年6月1日
Application Exchange
62··
二、开发前设置及注意事项
由于是利用Excel VBA进行开发,并且利用宏来实现动作,所以Excel文件格式应为.xls(excel2003带宏格式)或. xlsm(excel2007~2013带宏格式)。
为了能方便开发与编程,应打开Excel“开发工具”面板。方法是点击菜单“文件”→“选项”→“自定义功能区”,在右侧,将“开发工具”打勾。为了能调用Adobe Reader对象,需要引用Adobe Reader对象库。方法是点击菜单“开发工具”→“Visual Basic”→“工具”→“引用”,勾选对象库“Adobe Acrobat9.0Type Library”。
三、程序界面功能
程序界面如图2所示,只有三个功能:“识别PDF图幅”,“合并PDF”,“查指定PDF”,通过宏来实现。A~F列数据含义为:PDF文件名、图幅水平尺寸(单位CM)、图幅垂直尺寸(单位CM),颜块(以不同颜来表示不同图幅)、指定PDF文件、合并结果显示。图2为将含有程序的xls文件与PDF文档放在同一目录下,点击“识别PDF图幅”结果显示。
图2程序界面
四、识别PDF图幅核心代码
为了能够识别PDF文档图幅大小,必须先要知道PDF 文件的位置及文件名。可以利用xls文件的位置获
取路径(具体操作时,必须将xls文件与PDF文件放在一起),然后列出当前目录下所有的PDF文档,通过循环语句就能依次打开PDF文档进行识别了。核心代码如下:
partpath=ThisWorkbook.Path获取工作薄路径
MsgBox"请确认此xls文件与PDF文件在同一目录下!"
弹出对话框进行提示
FN=Dir(partpath&"\*.pdf")列出目录下所有PDF文档
Dim objAcroAVDoc As New Acrobat.AcroAVDoc定义对象
Dim objAcroPDDoc As Acrobat.AcroPDDoc定义对象
Dim objAcroPDPage As Acrobat.AcroPDPage定义对象
Dim objAcroPoint As Acrobat.AcroPoint定义对象
Dim lRet As Long定义变量
Do While FN<>""进入循环
LJ=partpath&"\"&FN LJ为包含路径的PDF文件名
lRet=objAcroAVDoc.Open(LJ,"")以后台方式打开PDF文件
Set objAcroPDDoc=objAcroAVDoc.GetPDDoc获取打开PDF文件关联信息
Set objAcroPDPage=objAcroPDDoc.AcquirePage(0)获取打开PDF第0页页面信息,注意,PDF文件首页,是0页。
Set objAcroPoint=objAcroPDPage.GetSize获取打开文件第0页页面像素信息
Debug.Print"objAcroPoint.x="&objAcroPoint.x显示页面水平像素值(便于调试,为后面确定28.33系数作准备)Debug.Print"objAcroPoint.y="&objAcroPoint.y显示页面垂直像素值(便于调试,为后面确定28.33系数作准备)Cells(n,1)=FN在excel表格A列(即第1列)列出文件名
Cells(n,2)=Int(objAcroPoint.x/28.33)在excel表格B列(即第2列)列出图幅水平尺寸
Cells(n,3)=Int(objAcroPoint.y/28.33)在excel表格C列(即第3列)列出图幅水平尺寸
Loop
为了确定像素转换成图幅的比值,可以先用一张已知A4PDF文档,运行程序,查看其像素:objAcroPoint.x=595,objAcroPoint.y=842,因为A4图幅水平尺寸为21CM,所以595÷21=28.33。
五、对识别出图幅大小PDF文件进行归类
将PDF图幅大小识别出来后应按类别复制到不同文件夹,便于后期进行合并处理。所以在识别之前,应先建立相应A0~A4的文件夹。以下代码以建立A4文件夹为例。
A44=partpath&"\A4"
Set AAA=CreateObject("Scripting.FilesyStemObject")
Set BBB=CreateObject("Scripting.FilesyStemObject")
Set fso=CreateObject("Scripting.FilesyStemObject")
If AAA.FolderExists(A44)Then
BBB.DeleteFolder A44
visual basic pdfMkDir A44
Else
MkDir A44
End If
以下代码插入在识别出图幅大小的循环语句中,将识别出来的A4图幅PDF复制到A4文件夹下。
If Int(objAcroPoint.x/28.33)=21Then
Debug.Print"正在复制到A4文件夹"&souf
Application
2019年6月1日
总第400期
Exchange
63
·
·
办公自动化杂志
办公自动化杂志
(上接第55页)参考文献
[1]黄霄羽.国外档案利用服务社会化的理论认识和实践特点[J].档案学通讯,2010(06):41-44.
[2]周燕.档案馆休闲利用功能探讨[J].云南档案,2013(12):43-45.
[3]丁宁.档案休闲利用行为探析[J].档案,2012(02):12-15.
[4]郝晓雅,蒋冠.英国国家档案馆“探索你的档案”主题活动介绍及启示[J].北京档案,2018(01):37-40.
[5]/.[EB/OL].[6]www.shac/cdzn/lyzxz/.[EB/OL].
[7]v.uk/about/visit-us/opening-times/[EB/OL].
[8]www.shac/cdzn/lyzxz/[EB/OL].
[9]杨柳.国外档案休闲利用形式初探[J].黑龙江史志,2008(20):36-37.
[10]郑杨.智慧档案馆建设思路探讨[J].齐齐哈尔师范高等专科学校学报,2018(06):70-71.
[11]黄丹颖,乔健.档案馆“休闲利用”服务功能优化初探[J].云南档案,2018(07):55-58.
作者简介
李勤(1994.12),性别:女,民族:汉,籍贯:安徽滁州,职务:安徽大学管理学院17级档案学硕士研究生,研究方向:档案学基础理论,工作单位:安徽省合肥市安徽大学管理学院。
fso.CopyFile souf,desA4
Cells (n,4).Interior.ColorIndex =9将第4列
(D 列)
第n 行单元格填充红ActiveSheet.Cells (n,4).Select
拾取单元格,如果PDF 文件很多,可以实现屏幕向下滚动。
Set fso =Nothing End If
六、
合并PDF 关于PDF 文档合并,笔者直接使用了网络上“北极狐工作室”程序(QQ:14885553),在此向北极狐工作室致敬!读者可以从网络上下载包含该程序的xls 文件。值得一提的是,当只有一个PDF 文件时,如果执行合并操作,那么在Opiona ()程序中下列语句Kill 处将提示出错(不到文件)。
For x =0To UBound (FileArr)Kill FileArr (x)Next
如果在外侧套一个判断语句,将避免出错,语句如下If UBound (FileArr)>=1Then For x =0To UBound (FileArr)Kill FileArr (x)Next End If
七、查指定PDF
查指定PDF 功能的使用场景是,有一成套图纸(PDF)700张,某部门需要打印其中50张图纸,并提供xls 列表。此时可将列表复制到程序工作表中的E 列,然后让程序判断,如果列表中的文件在当前目录下存在,则进行图幅大小判断并进行相应复制操作(后期合并并打印即
可)。关键代码如下:
Set AAA =CreateObject ("Scripting.FilesyStemObject")FileArray (w,5)=Cells (w,5)将
要查文件(第5列)存入数组
PathFileArray (w,5)=partpath &"\"&FileArray (w,5)&".pdf"
将路径及后缀补充完整
If
AAA.FileExists (PathFileArray (w,5))Then
判断查的文件是否存在
(在当前目录下)………识别图幅大小等语句
End If
八、总结
当同一图幅的PDF 文件合并成一个文件后,打印就相对简单了,只需要打开此文件,选择打印机、选择相应纸张大小,然后打印就可以了。避免了购买几十万的设备,也不需要人工剪裁A3、A4图纸了(一般地,A3、A4可用激光打印机打印,无需用绘图仪打印)。当然也可以通过开发,将打印按钮直接存放在工作表中,这样就避免人工打开合并的PDF 文件,进一步提高效率了。作者简介
陈兆勇,男,1977年生,工程师,现从事技术管理工作。李文峰,男,1984年生,工程师,现从事项目管理工作。于少萌,男,1989年生,助工,现从事随车吊折臂吊设计工作。
总第400期
2019年6月1日
Application Exchange
64··
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论