Using Powershell to Print a Folder of Text files to PDF (Retaining the Original Base name)

大兔子大兔子 提交于 2019-12-01 01:29:06

You are missing a handler that reads the text file and passes the text to the printer. It is defined as a scriptblock like this:

$PrintPageHandler =
{
    param([object]$sender, [System.Drawing.Printing.PrintPageEventArgs]$ev)

    # More code here - see below for details
}

and is added to the PrintDocument object like this:

$doc.add_PrintPage($PrintPageHandler)

The full code that you need is below:

$PrintPageHandler =
{
    param([object]$sender, [System.Drawing.Printing.PrintPageEventArgs]$ev)

    $linesPerPage = 0
    $yPos = 0
    $count = 0
    $leftMargin = $ev.MarginBounds.Left
    $topMargin = $ev.MarginBounds.Top
    $line = $null

    $printFont = New-Object System.Drawing.Font "Arial", 10

    # Calculate the number of lines per page.
    $linesPerPage = $ev.MarginBounds.Height / $printFont.GetHeight($ev.Graphics)

    # Print each line of the file.
    while ($count -lt $linesPerPage -and (($line = $streamToPrint.ReadLine()) -ne $null))
    {
        $yPos = $topMargin + ($count * $printFont.GetHeight($ev.Graphics))
        $ev.Graphics.DrawString($line, $printFont, [System.Drawing.Brushes]::Black, $leftMargin, $yPos, (New-Object System.Drawing.StringFormat))
        $count++
    }

    # If more lines exist, print another page.
    if ($line -ne $null) 
    {
        $ev.HasMorePages = $true
    }
    else
    {
        $ev.HasMorePages = $false
    }
}

function Out-Pdf
{
    param($InputDocument, $OutputFolder)

    Add-Type -AssemblyName System.Drawing

    $doc = New-Object System.Drawing.Printing.PrintDocument
    $doc.DocumentName = $InputDocument.FullName
    $doc.PrinterSettings = New-Object System.Drawing.Printing.PrinterSettings
    $doc.PrinterSettings.PrinterName = 'Microsoft Print to PDF'
    $doc.PrinterSettings.PrintToFile = $true

    $streamToPrint = New-Object System.IO.StreamReader $InputDocument.FullName

    $doc.add_PrintPage($PrintPageHandler)

    $doc.PrinterSettings.PrintFileName = "$($InputDocument.DirectoryName)\$($InputDocument.BaseName).pdf"
    $doc.Print()

    $streamToPrint.Close()
}

Get-Childitem -Path "$PSScriptRoot\TextFiles" -File -Filter "*.txt" |
    ForEach-Object { Out-Pdf $_ $_.Directory }

Incidentally, this is based on the official Microsoft C# example here:

PrintDocumentClass

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!