使用Powershell和iTextSharp旋转PDF

时间:2016-03-14 17:01:16

标签: powershell pdf itextsharp

我有一个Powershell脚本,它使用iTextSharp从PDF文件中提取文本。脚本下载的其中一个文件是横向的,因此需要旋转它以便脚本读取它。

这是读取 PDF的函数。我测试了它并且它有效:

function Get-PdfText {
    [CmdletBinding()]
    [OutputType([string])]
    param (
        [Parameter(Mandatory = $true)]
        [string]
        $Path
    )

    try {
        $reader = New-Object iTextSharp.text.pdf.pdfreader -ArgumentList $Path
    }
    catch {
        throw
    }

    $stringBuilder = New-Object System.Text.StringBuilder

    for ($page = 1; $page -le $reader.NumberOfPages; $page++) {
        $text = [iTextSharp.text.pdf.parser.PdfTextExtractor]::GetTextFromPage($reader, $page)
        $null = $stringBuilder.AppendLine($text) 
    }

    $reader.Close()

    return $stringBuilder.ToString()
}

有大量关于如何在C#和Java中旋转PDF的文档,但没有关于Powershell的文档。这里有一个很好的例子,但我不知道如何将它转换为Powershell: http://developers.itextpdf.com/question/how-rotate-page-90-degrees

这是我转换它的尝试:

function RotatePdf90Degrees {
    param (
        [Parameter(Mandatory = $true)]
        [string]
        $Path
    )

    $reader = New-Object iTextSharp.text.pdf.PdfReader -ArgumentList $Path
    $n = $reader.NumberOfPages
    $page #PdfDictionary
    $rotate #PdfNumber
    for ($p = 1; $p -le $n; $p++) {
        $page = $reader.GetPageN($p);
        $rotate = $page.GetAsNumber([iTextSharp.text.pdf.PdfName]::ROTATE);
        if ($rotate -eq $null) {
            $page.put([iTextSharp.text.pdf.PdfName]::ROTATE, [iTextSharp.text.pdf]::PdfNumber(90));
        }
        else {
            $page.put([iTextSharp.text.pdf.PdfName]::ROTATE, [iTextSharp.text.pdf]::PdfNumber(($rotate.IntValue() + 90) % 360));
        }
    }

    $stamper = New-Object iTextSharp.text.pdf.PdfStamper ($reader, [System.IO.StreamWriter] $Path);
    $stamper.Close();
    $reader.Close();
}

$ page.put()行出了点问题。我不知道如何将该函数作为适当的PdfNumber对象。

我一直在使用这个文档: http://developers.itextpdf.com/reference/package/com.itextpdf.text.pdf

1 个答案:

答案 0 :(得分:2)

也许我们正在处理powershell的不同版本,但我在您的示例函数中遇到的第一个问题就在这里,

[iTextSharp.text.pdf.PdfName]::ROTATE;

抛出以下异常:

  

田地或财产:" ca"对于类型:" iTextSharp.text.pdf.PdfName"   不同之处仅在于外地或财产的字母外壳:" CA"。该   type必须符合公共语言规范(CLS)。

查看iTextSharp源代码,如下所示,有两个单独的字段:

  • PdfName.CA
  • PdfName.ca

Haven在一段时间内写了任何 powershell,所以最简单的解决方法是使用与PdfName相同的字符串实例化一个新的PdfName.ROTATE对象。资源。无论如何,希望以下内容可以帮助您:

function Rotate-Pdf {
    [CmdletBinding()]
    param(
        [parameter(Mandatory=$true)] [string]$readerPath
        ,[parameter(Mandatory=$true)] [float]$degrees
    )
    $reader = New-Object iTextSharp.text.pdf.PdfReader($readerPath);
    $rotate = New-Object iTextSharp.text.pdf.PdfName('Rotate');
    $pdfNumber = New-Object iTextSharp.text.pdf.PdfNumber($degrees);
    $pageCount = $reader.NumberOfPages;
    for ($i = 1; $i -le $pageCount; $i++) {
        # $rotation = $reader.GetPageRotation($i);
        $pageDict = $reader.GetPageN($i);
        $pageDict.Put($rotate, $pdfNumber);
    }
    $memoryStream = New-Object System.IO.MemoryStream;
    $stamper = New-Object iTextSharp.text.pdf.PdfStamper($reader, $memoryStream);
    $stamper.Dispose();
    $bytes = $memoryStream.ToArray();
    $memoryStream.Dispose();
    $reader.Dispose();
    return $bytes;
}
$bytes = Rotate-Pdf $input 90;
[System.IO.File]::WriteAllBytes($output, $bytes);

请注意,还有一个额外的旋转度数参数,并已注释掉$reader.GetPageRotation()。根据PDF的创建方式,you cannot always count on PdfReader.GetPageRotation()

<强>更新

确认上述异常特定于PowerShell 4.0。没有测试V3.0,但是当使用V2.0时,[iTextSharp.text.pdf.PdfName]::ROTATE 不会抛出ExtendedTypeSystemException,并且运行没有问题。