使用 vba 分割和重命名 pdf 文件

问题描述 投票:0回答:2

我收到了包含多张工资单的合并文件。
每张工资单上的特定位置都有特定的号码。
我希望使用这个确切的数字作为每个文件名(例如37224.pdf) 我尝试使用下面的 VBA 代码将工资单拆分并命名为单独的工资单。

Option Explicit
Sub pdf()
Dim Acro_app As Acrobat.AcroApp
Dim Acro_PDDoc As Acrobat.AcroPDDoc
Dim Acro_NewPDDoc As Acrobat.AcroPDDoc
Set Acro_app = New Acrobat.AcroApp
Set Acro_PDDoc = New Acrobat.AcroPDDoc
Acro_PDDoc.Open "C:\Users\User\Desktop\PDF\Slip.pdf"
Dim i As Integer
For i = 0 To Acro_PDDoc.GetNumPages() - 1
Set Acro_NewPDDoc = New Acrobat.AcroPDDoc
Acro_NewPDDoc.Create
Acro_NewPDDoc.InsertPages -1, Acro_PDDoc, i, 1, 1

Acro_NewPDDoc.Save 1, "C:\Users\User\Desktop\PDF\S" & i & ".pdf"

Next i
End Sub

运行代码后,文件名显示为 S1.pdf、S2.pdf … 等,但我想将其设置为 37224.pdf、36299.pdf … 等

有人可以帮助我吗?

vba pdf
2个回答
0
投票

如果您的计算机上有 PDFtools 或类似工具的副本(甚至 Powshell 也有 PSwritePDF 作为下载模块),则可以使用单个控制台行命令将 pdf 文件拆分为多个页面。

对于 Windows 用户,可以从 GitHub 获取现代 64 位 2023 版本的 pdftotext https://github.com/oschwartz10612/poppler-windows 或者对于 32 位使用,目前有更新的 Xpdf 版本 4.04 http://www .xpdfreader.com/download.html 但是没有 PDFseperate

pdftotext的强大之处在于它可以从PDF页面的窗口中提取文本字符串,这里我通过简单地定义一个区域来重命名两个S1.pdf和S2.pdf,为了说明起见,该区域被涂成绿色,并且我定义了窗口作为

-x 100 -W 300 -y 50 -H 25

为了补偿水平变化,因此,如果源代码中有轻微的位移,这并不重要,并且重命名可以是该区域中的任何文本,因此如果需要,我可以包含“发票”。对于 VBA,您可以完成该任务,但我建议在 cmd 控制台上测试和实时运行要容易得多。这对于您的使用来说已经足够了,但是拖放分离功能尚未包含在内,因为我不需要,您的问题也不需要。

更改窗口以适合您的情况并将文件另存为 SETNUM.bat 并使用

SetNum c:\data\output\S*.pdf

在控制台上运行
@echo off & setlocal ENABLEDELAYEDEXPANSION
REM REM REM set "PDFsplit=C:\Apps\PDF\poppler\23.01.0\Library\bin\pdfseperate.exe"
REM REM REM if not exist %PDFsplit% echo Resource not found & exit /b 1
set "PDF2text=C:\Apps\PDF\poppler\23.01.0\Library\bin\pdftotext.exe"
if not exist %PDF2text% echo Resource not found & exit /b 1
set "workDir=C:\data\output"
if not exist "%workDir%" md "%workDir%"
if not exist "%workDir%" echo Folder not found & exit /b 2
set "Input=%~f1"
if not exist "%~dpn1.pdf" echo "%~dpn1.pdf" not found & exit /b 3

REM need to switch to files dir
cd /d "%~dp1"
echo Processing ...

REM pdfseperate is not need for this example, but would expect/allow for drag and drop as required
REM to use this file simply use the folder path of multiple files with prefix before numbers e.g.
REM getnum c:\data\output\S*.pdf

if exist "%temp%\getText.txt" del /F "%temp%\getText.txt"
for /f "usebackq delims==" %%c in (`dir /B "%~1"`) do (
echo.|set /p="%%c" "

"%PDF2text%" -nopgbrk -layout -f 1 -l 1 -x 100 -W 300 -y 50 -H 25 "%%c" -
) >>"%temp%\getText.txt"

if exist "%temp%\getText.cmd" del "%temp%\getText.cmd"
for /f "tokens=*" %%a in ('type "%temp%\getText.txt"') do echo Ren ^"%%a.pdf >>"%temp%\getText.cmd"

REM REM REM FOR TESTING remove REM on lines below

REM CALL "%temp%\getText.cmd"
rem del /F "%temp%\getText.txt"&&del /F "%temp%\getText.cmd"
ECHO Processing done
pause

0
投票

您需要添加一个变量,例如aCntr,并分配您的值,例如 aCntr = 37224 并在下面的行中使用 aCntr 变量而不是 i

Acro_NewPDDoc.Save 1, "C:\Users\User\Desktop\PDF\S" & i & ".pdf"

在下一个之前,我会增加计数器,如 aCntr = aCntr + 1

© www.soinside.com 2019 - 2024. All rights reserved.