如何获取文本文件输出并传递管道?

时间:2018-06-29 19:46:43

标签: powershell

我有一个打开Winform并要求用户输入PDF文件的应用程序。由于我无法轻松读取PDF文件中的字符串,因此需要将其转换为.txt。当用户单击“确定”时,应用程序将执行此操作。

我现在遇到的问题是使用.txt文件对象,并将其传递给另一个命令而又不知道其名称。当我尝试将其通过管道传递到另一个命令时,它将无法工作,因为我没有路径。我认为这是因为转换的输出是字符串“ OK”,而不是实际的.txt文件。

如何将PDF转换为文本(我正在使用Xpdf)并将转换后的文件向下传递到管道中以进行进一步处理?

如果我使用的方式有问题,我该如何以另一种方式完成此任务?

Add-Type -AssemblyName System.Windows.Forms

$form = New-Object System.Windows.Forms.Form
$form.StartPosition = 'CenterScreen'

$button = New-Object System.Windows.Forms.Button
$form.Controls.Add($button)
$button.Text = 'Get file'
$button.Location = '10,10'
$button.Add_Click({
    $ofd = New-Object system.windows.forms.Openfiledialog
    $ofd.Filter =  'PDFs (*.pdf)|*.pdf' 
    $script:filename = 'Not found'
    if ($ofd.ShowDialog() -eq 'Ok') {
        $script:filename = $textbox.Text = $ofd.FileName
    }
})

$buttonOK = New-Object System.Windows.Forms.Button
$form.Controls.Add($buttonOK)
$buttonOK.Text = 'Ok'
$buttonOK.Location = '10,40'
$buttonOK.DialogResult = 'OK'

$textbox = New-Object System.Windows.Forms.TextBox
$form.Controls.Add($textbox)
$textbox.Location = '100,10'
$textbox.Width += 50

$form.ShowDialog()
$output = & "C:\Users\eakinsa\Desktop\Style Guide Report\Includes\bin32\pdftotext" $filename
$output |
    Get-Location -OutVariable textFile |
    Select-String -Path $textFile -Pattern ed

每Ansgar:

我将最后几行修改为现在,保留了pdftotext的默认功能,该功能可以在同名目录下创建文件,就像他的建议一样,我可以轻松地用.txt替换.pdf。文件路径的末尾,从而可以灵活地将正确的文件路径传递给后续功能。做到了这一点,因此我能够搜索文本文件。

& "C:\users\eakinsa\Desktop\Style Guide Report\Includes\bin32\pdftotext" $filename
$pdf = Get-Item $filename
$textfile = $filename -replace '\.pdf$', '.txt'
Select-String -Path $textfile -Pattern ed

1 个答案:

答案 0 :(得分:1)

仅将输入PDF作为参数运行pdftotext时,它将在相同目录中使用相同的基本名称和扩展名txt创建输出文本文件。

& pdftotext C:\temp\foo.pdf    # creates C:\temp\foo.txt

因此,您可以像这样构建文本文件路径:

$pdf = Get-Item $filename
$textfile = Join-Path $pdf.DirectoryName ($pdf.BaseName + '.txt')

或类似这样:

$textfile = $filename -replace '\.pdf$', '.txt'

或者,您可以告诉pdftotext在哪里创建输出文件:

$textfile = 'C:\some\where\bar.txt'
& pdftotext $filename $textfile     # creates C:\some\where\bar.txt