如何在Powershell中将PDF与iTextsharp合并/附加?

时间:2015-05-22 22:23:59

标签: powershell pdf itextsharp itext

我已经在C#中看到了一些方法,但语法差异让我很难过。有人可以通过PowerShell的方式帮助我。

我想要完成的是: 我有一个包含客户会计报表的大型PDF。每个客户的声明页面数量都不同。我正在解析PDF上的文本以找到他们的帐号(我已经完成了)。因此,我使用该第一页创建PDF,然后检查该帐号是否还有更多页面。如果有,那么它(这是我需要帮助的地方)取出该页面并将其附加到我创建的第一页,直到没有更多页面具有该帐号。所以最后我将得到pdf文件,其中包含帐号作为文件名和每个PDF中的相应页面。

创建第一个页面后,我被困在附加页面上。

非常感谢! 标记

2 个答案:

答案 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
}