使用 Powershell 和 iTextSharp 旋转 PDF
Rotate a PDF using Powershell and iTextSharp
我有一个使用 iTextSharp 从 PDF 文件中提取文本的 Powershell 脚本。脚本下载的文件之一是横向的,因此需要旋转它以便脚本读取它。
这是我的函数,它读取 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
也许我们正在处理 powershell
的不同版本,但我在使用您的示例函数时遇到的第一个问题就在这里,
[iTextSharp.text.pdf.PdfName]::ROTATE;
抛出以下异常:
The field or property: "ca" for type: "iTextSharp.text.pdf.PdfName"
differs only in letter casing from the field or property: "CA". The
type must be Common Language Specification (CLS) compliant.
查看 iTextSharp
源代码,异常中指出有两个单独的字段:
PdfName.CA
PdfName.ca
有一段时间没有编写 任何 powershell,所以最简单的解决方法是使用与 [=17= 相同的字符串实例化一个新的 PdfName
对象] 在来源中。无论如何,希望以下内容可以帮助您入门:
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,并且运行没有问题。
我有一个使用 iTextSharp 从 PDF 文件中提取文本的 Powershell 脚本。脚本下载的文件之一是横向的,因此需要旋转它以便脚本读取它。
这是我的函数,它读取 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
也许我们正在处理 powershell
的不同版本,但我在使用您的示例函数时遇到的第一个问题就在这里,
[iTextSharp.text.pdf.PdfName]::ROTATE;
抛出以下异常:
The field or property: "ca" for type: "iTextSharp.text.pdf.PdfName" differs only in letter casing from the field or property: "CA". The type must be Common Language Specification (CLS) compliant.
查看 iTextSharp
源代码,异常中指出有两个单独的字段:
PdfName.CA
PdfName.ca
有一段时间没有编写 任何 powershell,所以最简单的解决方法是使用与 [=17= 相同的字符串实例化一个新的 PdfName
对象] 在来源中。无论如何,希望以下内容可以帮助您入门:
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,并且运行没有问题。