ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: opiona

[分享] PDF插件 for VBA 合并,提取,旋转等

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2023-11-3 12:52 | 显示全部楼层
本帖已被收录到知识树中,索引项:其他编程应用

近30多个功能了,很不错的一个工具啦,
人家熬夜写代码不易,喝瓶可乐提下神也是要的
真需要何不联系下作者
期待楼主继续开发这个功能

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-11-21 10:59 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
提起发票信息的函数: GetInfoInvoice

发票样式:
2.jpg

识别的内容:
1.jpg



函数代码:

  1. Rem *********************************
  2. Rem *******  北极狐工作室出品  ******
  3. Rem *******  QQ:14885553      ******
  4. Rem *********************************
  5. Option Explicit  '//强制声明变量

  6. Sub FA_提取PDF发票信息()
  7.     Dim PathPDF, StrXiangMu
  8.     Dim ARX
  9.    
  10.     '    PathPDF = ThisWorkbook.Path & "\发票\10月发票\CA001.PDF"
  11.     '    StrXiangMu = "*经营租赁*通行费,*经营租赁*代收通行费"
  12.    
  13.     PathPDF = ThisWorkbook.Path & "\发票\F001.PDF"
  14.     StrXiangMu = "*供电*电费"
  15.    
  16.     ARX = GetInfoInvoice(PathPDF:=PathPDF, StrXiangMu:=StrXiangMu)
  17.     Worksheets("发票识别A").Range("A2").Resize(UBound(ARX, 1), UBound(ARX, 2)) = ARX
  18.    
  19.     MsgBox "OK"
  20. End Sub

  21. Function GetInfoInvoice(ByVal PathPDF As String, ByVal StrXiangMu As String, Optional ByVal StrFenLei As String = "")
  22.     Rem PathPDF       PDF格式的发票文件
  23.     Rem StrXiangMu  需要提取那些项目名称,可以多个 "*经营租赁*通行费,*经营租赁*代收通行费"
  24.     Rem StrFenLei      输出结果的部分  发票明细部分的标题 一般8个  例如: 项目名称,车牌号,类型,开始日期,结束日期,金额,税额,税率
  25.     Rem  ARX = GetInfo(PathPDF:=PathPDF, StrXiangMu:=StrXiangMu)
  26.    
  27.     Dim I, X, ICOL, INTA, INTB, INTC As Long
  28.     Dim StrE, StrX, Mystr, PathSave, ZCM As String
  29.     Dim BL As Boolean
  30.     Dim PDFDLL, FSO, STM As Object
  31.     Dim ARX, CRX, DRX, ERX, FRX, ZAC, ZAD
  32.    
  33.     'On Error Resume Next
  34.    
  35.     Rem 发票不同 一次只能获取一类发票的内容
  36.     Rem  项目名称: StrXiangMu 和 各列内容:StrFenLei  都是不一样的
  37.     Rem StrXiangMu = "*经营租赁*通行费,*经营租赁*代收通行费"
  38.     Rem StrXiangMu = "*供电*电费"
  39.     Rem If StrFenLei = "" Then StrFenLei = "项目名称,车牌号,类型,开始日期,结束日期,金额,税额,税率"
  40.     If StrFenLei = "" Then StrFenLei = "项目名称,规格,单位,数量,单价,金额,税额,税率"
  41.    
  42.     Rem 文件名,发票代码,发票号码,开票日期,价税合计  是固定的
  43.     StrFenLei = "文件名,发票代码,发票号码,开票日期,价税合计," & StrFenLei
  44.     CRX = Split(StrFenLei, ",")
  45.     Rem 结果的标题
  46.     Set ZAC = CreateObject("Scripting.Dictionary")
  47.     For X = 0 To UBound(CRX)
  48.         ZAC(CRX(X)) = X + 1
  49.     Next
  50.    
  51.     Rem 保存发票内容的文本文件
  52.     PathSave = ThisWorkbook.Path & "\TempTxt.txt"
  53.     Set FSO = CreateObject("Scripting.FileSystemObject")
  54.     If FSO.FileExists(PathSave) = True Then
  55.         Kill PathSave   '//删除文件
  56.     End If
  57.    
  58.     Rem 获取发票文本, 也可以用纯VBA的代码获取
  59.     Set PDFDLL = CreateObject("GTDPDFPlugIn.PDFClass")
  60.     ZCM = "QQ14885553"
  61.     BL = PDFDLL.ExtractTextFromPDF(PathPDF:=PathPDF, PathSave:=PathSave, StrPages:="", StrArea:="", ZCM:=ZCM)
  62.    
  63.     Rem 读取文本 发票内容
  64.     Set STM = CreateObject("Adodb.Stream")
  65.     STM.Type = 2
  66.     STM.Mode = 3
  67.     STM.CharSet = "utf-8"
  68.     STM.Open
  69.     STM.LoadFromFile PathSave
  70.     Mystr = STM.ReadText   '//文本文件内容
  71.     STM.Close
  72.    
  73.     Rem 分解发票内容
  74.     INTA = 0
  75.     DRX = Split(StrXiangMu, ",")
  76.     ERX = Split(Mystr, vbCrLf)
  77.     ReDim ARX(1 To 50, 1 To UBound(CRX) + 1)
  78.     Set ZAD = CreateObject("Scripting.Dictionary")
  79.    
  80.     For I = 0 To UBound(ERX)
  81.         INTB = INTA
  82.         For X = 0 To UBound(DRX)
  83.             Rem 每一行的内容
  84.             If InStr(ERX(I), DRX(X)) > 0 Then
  85.                 Rem 符合项目名称的要求
  86.                 StrX = Split(WorksheetFunction.Trim(ERX(I)), DRX(X))(1)
  87.                 INTA = INTA + 1
  88.                 FRX = Split(StrX, " ")
  89.                 ARX(INTA, ZAC(CRX(5))) = DRX(X)
  90.                 ARX(INTA, ZAC(CRX(6))) = Split(StrX, " ")(1)
  91.                 ARX(INTA, ZAC(CRX(7))) = Split(StrX, " ")(2)
  92.                 ARX(INTA, ZAC(CRX(8))) = Split(StrX, " ")(3)
  93.                 ARX(INTA, ZAC(CRX(9))) = Split(StrX, " ")(4)
  94.                 ARX(INTA, ZAC(CRX(10))) = Split(StrX, " ")(5)
  95.                 ARX(INTA, ZAC(CRX(11))) = Split(StrX, " ")(6)
  96.                 ARX(INTA, ZAC(CRX(12))) = Split(StrX, " ")(7)
  97.             End If
  98.         Next
  99.         
  100.         Rem 当前发票的: 文件名,发票代码,发票号码,开票日期,价税合计
  101.         ZAD("文件名") = Dir(PathPDF, vbNormal)
  102.         StrE = Replace(ERX(I), ":", ":")
  103.         If InStr(StrE, "发票代码:") > 0 Then
  104.             ZAD("发票代码") = Trim(Split(StrE, "发票代码:")(1))
  105.         End If
  106.         If InStr(StrE, "发票号码:") > 0 Then
  107.             ZAD("发票号码") = Trim(Split(StrE, "发票号码:")(1))
  108.         End If
  109.         If InStr(StrE, "开票日期:") > 0 Then
  110.             ZAD("开票日期") = Replace(WorksheetFunction.Trim(Left(Split(StrE, "开票日期:")(1), 12)), " ", "-")
  111.         End If
  112.         If InStr(ERX(I), "(小写)") > 0 Then
  113.             ZAD("价税合计") = Trim(Split(ERX(I), "(小写)")(1))
  114.         End If
  115.     Next
  116.    
  117.     Rem 整体信息 每行相同
  118.     For X = 1 To UBound(ARX, 1)
  119.         ARX(X, ZAC("文件名")) = ZAD("文件名")
  120.         ARX(X, ZAC("发票代码")) = ZAD("发票代码")
  121.         ARX(X, ZAC("发票号码")) = ZAD("发票号码")
  122.         ARX(X, ZAC("开票日期")) = ZAD("开票日期")
  123.         ARX(X, ZAC("价税合计")) = ZAD("价税合计")
  124.     Next
  125.    
  126.     Rem 去掉多余行
  127.     ReDim TRX(1 To INTA, 1 To UBound(ARX, 2))
  128.     For X = 1 To INTA
  129.         For ICOL = 1 To UBound(ARX, 2)
  130.             TRX(X, ICOL) = ARX(X, ICOL)
  131.         Next
  132.     Next
  133.    
  134.     GetInfoInvoice = TRX
  135. End Function

复制代码



TA的精华主题

TA的得分主题

 楼主| 发表于 2023-11-21 11:06 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2023-11-24 08:52 | 显示全部楼层
opiona 发表于 2023-4-25 18:19
PDF页码数  纯VBA代码 需要安装Acrobat  最好是专业版

大佬这个代码,好nice!!!!

TA的精华主题

TA的得分主题

发表于 2023-11-25 20:38 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2023-11-27 14:18 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
    多谢分享

TA的精华主题

TA的得分主题

发表于 2023-12-16 11:29 来自手机 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2023-12-16 12:20 来自手机 | 显示全部楼层
可以用FreeSpire.PDF替代吗?另外这个可以吗https://github.com/zhjunbai/crack-spire

TA的精华主题

TA的得分主题

发表于 2023-12-16 12:34 来自手机 | 显示全部楼层
opiona 发表于 2023-11-21 11:06
DLL文件链接:https://pan.baidu.com/s/1W36A_Apc661xszaYg_mNAA?pwd=lvb3
提取码:lvb3


可以用FreeSpire.PDF代替吗

TA的精华主题

TA的得分主题

发表于 2023-12-17 23:09 来自手机 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-18 04:19 , Processed in 0.037367 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表