从 powershell 生成 pdf

Generate a pdf from powershell

我正在尝试使用 powershell 生成 PDF,但我不知道如何继续。我已经尝试过使用 Itext 7,但我不知道如何让它工作。

当我尝试在 powershell 上安装 Itext7 时出现此错误消息:

No match found for the specified search criteria and the itext7 package name. Use 
Get-PackageSource to display for all available registered package sources.

需要我帮忙吗?

提前致谢

下面是 PowerShell 脚本的代码,它输出带有“Hello World!”的 PDF。写在上面。它反映了 iText 7 基本 Hello World 示例的功能。您可以根据您的要求进行更改。

Add-Type -Path "C:\temp\Common.Logging.Core.dll"
Add-Type -Path "C:\temp\Common.Logging.dll"
Add-Type -Path "C:\temp\BouncyCastle.Crypto.dll"
Add-Type -Path "C:\temp\itext.io.dll"
Add-Type -Path "C:\temp\itext.layout.dll"
Add-Type -Path "C:\temp\itext.kernel.dll"

[string] $DEST = "C:\files\HelloWorldPowerShell.pdf"
$pdfWriter = [iText.Kernel.Pdf.PdfWriter]::new($DEST)
$pdf = [iText.Kernel.Pdf.PdfDocument]::new($pdfWriter)
$document = [iText.Layout.Document]::new($pdf)
$document.Add([iText.Layout.Element.Paragraph]::new("Hello World!"))
$pdf.Close()

PowerShell 依赖项的组合可能会有问题,因为它们需要及时属于 已知的工作组,而 7.1.14 被吹捧为轻量级解决方案 所以请参阅稍后的 TL;DR 编辑或下面的其他评论,并且 运行 作为管理员可能与普通用户不同。因此,请仔细执行这些步骤,因为有些步骤可能会降低您当前的设置。

最重要的是使用项目目录并注意您的提示位于该文件夹中,以确保您没有 运行在默认的 PowerShell 目录中。我使用目标目录为“blank/empty”的快捷方式,因此默认为当前工作文件夹。

第一次检查:-

project folder>[Net.ServicePointManager]::SecurityProtocol

应该 return Tls12 或 Tls13 我们需要它是 1.2 所以如果你的设置为 Tls13 和 运行 这一行请记下。

 [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

我们可能需要更改包提供程序,因此首先检查 nuget 是否包含 https://www.nuget.org/api/v2/:-

> Get-PackageSource

Name                             ProviderName     IsTrusted  Location
----                             ------------     ---------  --------
nuget.org                        NuGet            False      https://www.nuget.org/api/v2/
PSGallery                        PowerShellGet    False      https://www.powershellgallery.com/api/v2

如果没有,您可以将其添加为

Register-PackageSource nuget.org https://www.nuget.org/api/v2/ -ProviderName NuGet

现在您应该可以按如下方式安装 dll

Install-Package -Name "itext7" -ProviderName NuGet -RequiredVersion 7.1.14 -Destination . -SkipDependencies
Install-Package -Name Portable.BouncyCastle -ProviderName NuGet -RequiredVersion 1.8.9.0 -Destination . -SkipDependencies
Install-Package -Name Common.Logging -ProviderName NuGet -RequiredVersion 3.4.1.0 -Destination . -SkipDependencies
Install-Package -Name Common.Logging.Core -ProviderName NuGet -RequiredVersion 3.4.1.0 -Destination . -SkipDependencies

仔细检查您的文件夹结构是否正确

请注意脚本的顺序和位置对于正确加载至关重要

    Add-Type -Path (Join-Path $PSScriptRoot ".\Common.Logging.Core.3.4.1\lib\net40\Common.Logging.Core.dll")
    Add-Type -Path (Join-Path $PSScriptRoot ".\Common.Logging.3.4.1\lib\net40\Common.Logging.dll")
    Add-Type -Path (Join-Path $PSScriptRoot ".\Portable.BouncyCastle.1.8.9\lib\net40\BouncyCastle.Crypto.dll")
    Add-Type -Path (Join-Path $PSScriptRoot ".\itext7.7.1.14\lib\net40\itext.io.dll")
    Add-Type -Path (Join-Path $PSScriptRoot ".\itext7.7.1.14\lib\net40\itext.layout.dll")
    Add-Type -Path (Join-Path $PSScriptRoot ".\itext7.7.1.14\lib\net40\itext.kernel.dll")

    $pdfDocuFilename = (join-path $PSScriptRoot "My1st.pdf")
    $pdfWriter = [iText.Kernel.Pdf.PdfWriter]::new($pdfDocuFilename)
    $pdfdocument = [iText.Kernel.Pdf.PdfDocument]::new($pdfWriter)
    $pdfdocument.AddNewPage()

    $pdfdocument.Close()

这将生成一个空文件,但证明一切正常,,您可以开始 运行 其他示例,例如 S_G 建议的示例,所以在加载 Add-Type 块后用

替换我的空白示例
[string] $DEST = "HelloWorld.pdf"
$pdfWriter = [iText.Kernel.Pdf.PdfWriter]::new($DEST)
$pdf = [iText.Kernel.Pdf.PdfDocument]::new($pdfWriter)
$document = [iText.Layout.Document]::new($pdf)
$document.Add([iText.Layout.Element.Paragraph]::new("Hello World! from Powershell"))
$pdf.Close()

...祝你好运。

  • 上面的版本是针对固定时间点当用户博客验证 7.1 混音没有太多冲突时,目的是生成一组在其中工作的独立文件Net40 环境,但时间在推移,您应该确保您使用的是更新的组合。 但是在 7.1.15 中一切都变了,因为 Net 4.5 和现在的 4.6.1 现在需要一个非常大的依赖列表,尽管 packages/itext7/7.2.1 本身仍然适用于 packages/Portable.BouncyCastle/1.8.9 + 并且常见的日志记录仍然是 3.4.1

只是我的 2 美分,但上面的代码不适用于 Itext7 7.2.1(修改正确路径后)。
希望我上周看到这个 post - 浪费了几天的大部分时间,因为 7.2.1 本身没有表现。 :(