我已经在C#中看到了一些方法,但语法差异让我很难过。有人可以通过PowerShell的方式帮助我。
我想要完成的是: 我有一个包含客户会计报表的大型PDF。每个客户的声明页面数量都不同。我正在解析PDF上的文本以找到他们的帐号(我已经完成了)。因此,我使用该第一页创建PDF,然后检查该帐号是否还有更多页面。如果有,那么它(这是我需要帮助的地方)取出该页面并将其附加到我创建的第一页,直到没有更多页面具有该帐号。所以最后我将得到pdf文件,其中包含帐号作为文件名和每个PDF中的相应页面。
创建第一个页面后,我被困在附加页面上。
非常感谢! 标记
答案 0 :(得分:2)
假设您已经按照规定完成了困难部分,解析文本以查找帐号的页码,这是一个工作示例,显示如何从包含客户会计报表的大型PDF中追加页面:
$workingDirectory = Split-Path -Parent $MyInvocation.MyCommand.Path;
[void] [System.Reflection.Assembly]::LoadFrom(
[System.IO.Path]::Combine($workingDirectory, 'itextsharp.dll')
);
$output = [System.IO.Path]::Combine($workingDirectory, 'output.pdf');
$statements = [System.IO.Path]::Combine($workingDirectory, 'statements.pdf');
$fileStream = New-Object System.IO.FileStream($output, [System.IO.FileMode]::OpenOrCreate);
$document = New-Object iTextSharp.text.Document;
$pdfCopy = New-Object iTextSharp.text.pdf.PdfCopy($document, $fileStream);
$reader = New-Object iTextSharp.text.pdf.PdfReader($statements);
$document.Open();
$pageCount = $reader.NumberOfPages;
for ($i = 0; $i -lt $pageCount; $i++) {
if ($i % 2 -eq 0) {
$pdfCopy.AddPage(
$pdfCopy.GetImportedPage($reader, $i + 1)
# ^^^^^
# your page number here
);
}
}
$pdfCopy.FreeReader($reader);
$reader.Dispose();
$document.Dispose();
$fileStream.Dispose();
添加单独的循环以为每个个人帐号创建副本。
答案 1 :(得分:0)
这并没有完全回答我原本想要做的事情。但是,我能够完成我为此任务所需的工作。我仍然想知道如何将页面附加到现有PDF。
Add-Type -Path D:\FlavinHOA\itext\itextsharp.dll
$saveDir = 'D:\FlavinHOA\accountid'
$pageSpread = 0
function Copy-PDFPages {
param(
[Parameter(Mandatory)]
[string]$pdfFile,
[int]$StartPage,
[int]$EndPage
)
echo $pdfFile
$inputPdf = New-Object iTextSharp.text.pdf.PdfReader $pdfFile
$PageCount = $inputPdf.NumberOfPages
if ($EndPage -lt $StartPage -or $EndPage -gt $PageCount) {
$EndPage = $PageCount
}
$inputDoc = New-Object `
iTextSharp.text.Document $inputPdf.GetPageSizeWithRotation(1)
$fs = New-Object System.IO.FileStream `
("$saveDir\$accountID.pdf", "Create")
$outputWriter = [iTextSharp.text.pdf.PdfWriter]::GetInstance($inputDoc ,$fs)
$inputDoc.Open()
$cb1 = $outputWriter.DirectContent
ForEach($targetPage in ($StartPage..$EndPage)) {
[void]$inputDoc.SetPageSize($inputPdf.GetPageSizeWithRotation($targetPage))
[void]$inputDoc.NewPage()
$page = $outputWriter.GetImportedPage($inputPdf, $targetPage);
$rotation = $inputPdf.GetPageRotation($targetPage)
if ($rotation -eq 90 -or $rotation -eq 270) {
$cb1.AddTemplate($page, 0, -1, 1, 0, 0, $inputPdf.GetPageSizeWithRotation($targetPage).Height)
} else {
$cb1.AddTemplate($page, 1, 0, 0, 1, 0, 0)
}
}
$inputDoc.Close()
$fs.Close()
}
function Get-CustomerPages {
param(
[Parameter(Mandatory)]
[string]$pdfFile
)
$reader = New-Object iTextSharp.text.pdf.pdfreader -ArgumentList $pdfFile
$count = 0
for ($page = 1; $page -le $reader.NumberOfPages; $page++)
{
#$page = 48
$nextPage = $page + 1
$strategy = new-object 'iTextSharp.text.pdf.parser.SimpleTextExtractionStrategy'
$strategy2 = new-object 'iTextSharp.text.pdf.parser.SimpleTextExtractionStrategy'
$currentText = [iTextSharp.text.pdf.parser.PdfTextExtractor]::GetTextFromPage($reader, $page, $strategy);
if ( $page -lt $reader.NumberOfPages ){
$nextPageText = [iTextSharp.text.pdf.parser.PdfTextExtractor]::GetTextFromPage($reader, $nextPage, $strategy2);
} else {
$nextPageText = 'Customer'
}
$currentCustMatch = [regex]::Matches($currentText, 'Customer.*')
$currentCustID = ($currentCustMatch.Value).Replace('Customer Account ID: ','')
$nextPageMatch = [regex]::Matches($nextPageText, 'Customer.*')
$nextPageCustID = ($nextPageMatch.Value).Replace('Customer Account ID: ','')
$accountID = $currentCustID
$nextAccountID = $nextPageCustID
if ( $nextAccountID -eq $accountID) {
echo "More than 1"
$pageSpread++
} else {
echo "-----------Start Export-------------"
$startExportPage = $page - $pageSpread
echo "Account ID fed into CopyPDF $accountID"
echo "Pages exported from $startExportPage to $page"
Copy-PDFPages -pdfFile $pdfFile -StartPage $startExportPage -EndPage $page
echo "------------End Export--------------"
$pageSpread = 0
}
$accountID
$count++
}
$Reader.Close();
$count
}