1

フォルダーをループし、GhostScript(9.07)を使用してフォルダー内のPDFをフラット化するバッチスクリプトがあります。PowerShellスクリプトに変換したいのは、たまにクラッシュするようで、バッチファイルのデバッグにうんざりしているからです。

とにかく、コンソールでの出力に基づいて機能しているように見えるPSスクリプトがありますが、実際にはファイルを取得していません。PSへの手動入力はさらに機能しないようです...何が間違っているのですか?

バッチスクリプト

@ECHO OFF
::
:: Process all PDFs and flatten them to PDF/A format
:: =====================================================================================
FOR %%F IN ("J:\Finals\*.pdf") DO (
    IF /I %%F NEQ "*Floor Plan*.pdf" (
::      Convert the original PDF to a flattened PDF PDF/A
::      ========================================================================
        "%ProgramFiles%\gs\gs9.07\bin\gswin64.exe" -dPDFA -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile="J:\Finals\%%~nF (Final).pdf" "%%F"
::
::      Delete the original PDF file
::      ========================================================================
        DEL "%%F" /F /Q
::
::      Rename the flattened PDF PDF/A to the original PDF's name
::      ========================================================================
        MOVE "J:\Finals\%%~nF (Final).pdf" "%%F"
    )
)
::
:: Move files form the Readdle drive to the Digital Documents drive
:: =====================================================================================
ROBOCOPY J:\Finals\ K:\ *.* /MOV /R:0 /W:0 /MT

PowerShellスクリプト(これまでのところ)

$GhostScript = "$env:ProgramFiles\gs\gs9.07\bin\gswin64c.exe"

Get-ChildItem "C:\Test In\*.pdf" | Where {
    $_.BaseName -NotMatch "Floor Plan"
} | ForEach-Object {
    $InputFile = $_.FullName
    $OutputFile = "C:\Test Out\{0} (Final).pdf" -F $_.BaseName

    & "$GhostScript" -dPDFA -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile="$OutputFile" "$InputFile"
}

PowerShellスクリプトの出力

GPL Ghostscript 9.07 (2013-02-14)
Copyright (C) 2012 Artifex Software, Inc.  All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Processing pages 1 through 1.
Page 1
Substituting font Times-Italic for TimesNewRomanPS-ItalicMT.
Loading NimbusRomNo9L-ReguItal font from %rom%Resource/Font/NimbusRomNo9L-ReguItal... 4198200 2870566 3665244 2332637 3 done.
Substituting font Courier for CourierNewPSMT.
Loading NimbusMonL-Regu font from %rom%Resource/Font/NimbusMonL-Regu... 3755680 2306439 4089108 2566088 3 done.
Loading NimbusRomNo9L-Regu font from %rom%Resource/Font/NimbusRomNo9L-Regu... 3796376 2391131 4078352 2484871 3 done.
Loading Dingbats font from %rom%Resource/Font/Dingbats... 3917480 2509851 4280192 2689988 3 done.

これを気にする人は誰でも、Windows Server2008R2仮想マシンでテストされています。4GBのRAMと4vCPUを搭載しています。また、使用しているテストフォルダーにアクセス許可の問題があるかどうかも確認しましたが、そうではありませんでした。

アップデート

現在のスクリプトがどのように見えるかを示すために投稿を更新しました。変数を引用符で囲ん$OutputFileでも何も起こりません。引用符の有無に関係なく、GhostScriptが想定どおりに動作していることを示す出力(上記で追加)を常に取得しますが、最終的にはファイルが作成されません...

4

5 に答える 5

1

私にとって、PDFtkを使用すると、元のPDFよりも大きなPDFが生成されたため、あまり役に立ちませんでした。最近はPowerShellを使用したかったのですが、PowerShellでghostscriptを実行するのに問題がありました。バッチファイルを使用すると正常に実行されたため、PowerShellスクリプトで呼び出す2つのパラメーターを持つバッチファイルを使用してghostscriptを実行することを選択しました。

スリム化されたバージョン(ループとクリーンアップなし)は次のようになります。

$script = "C:\path\to\script.cmd"
$InputFile = "C:\path\to\input.pdf"
$OutputFile = "C:\path\to\output.pdf"
& $script $InputFile $OutputFile

バッチスクリプトは次のようになります。

echo off
set arg1=%1
set arg2=%2

"C:\Program Files\gs\gs9.19\bin\gswin64c.exe" -sDEVICE=pdfwrite -dPDFSETTINGS=/screen -dCompatibilityLevel=1.4 -dNOPAUSE -dBATCH -sOutputFile=%arg2% %arg1%
于 2016-09-20T13:16:28.473 に答える
0

変数$OutFileは、スペースを含むパスを生成します。引用符で囲む必要があります。

& $GhostScript -dPDFA -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile="$OutputFile" $InputFile
于 2013-03-19T01:30:21.150 に答える
0

さて、私は解決策を見つけました。これには、GhostScriptforPDFtkの使用をオプトアウトすることが含まれます。真剣に、GhostScriptの取引が何であったかはわかりませんが、100%機能することを拒否しただけです。95%のように機能しましたが、私が本当に気にかけた最後の5%(出力されたファイル)は発生しませんでした。とにかく、私は代わりにPDFtkを使用しました、そしてそれはちょうど機能します、そしてそれはまったく同じタスクのためにGhostScriptより何倍も速く動作します。理解できません...

最終的なPowerShellスクリプトは次のようになります。

$PDFtk = "C:\Program Files (x86)\PDF Labs\PDFtk Server\bin\pdftk.exe"

If (Test-Path $PDFtk) {
    Get-ChildItem "J:\Finals\" | Where-Object {
        $_.Extension -Match "pdf"
    } | ForEach-Object {
        $InputFile = $_.FullName
        $OutputFile = "J:\Finals\{0} (Flattened).pdf" -F $_.BaseName
        $DigitalDocumentsFile = "K:\{0}" -F $_.Name

        & $PDFtk $InputFile OUTPUT $OutputFile FLATTEN

        If (Test-Path $OutputFile) {
            Remove-Item $InputFile
            Move-Item $OutputFile $DigitalDocumentsFile
        }
    }
}
于 2013-03-20T00:36:18.723 に答える
0

これは実際には奇妙です。プロセスモニターでこれを見ました。Ghostscriptは、二重引用符で囲まれていない場合、実際には文字通り「$Outputfile」に出力します。

 & $GhostScript -dPDFA -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile="$OutputFile" $InputFile

$ghostscript変数と$inputfile変数にスペースがあっても、これで十分でした。PS 6でも、コロンが前に付いているか、二重引用符で囲まれていない限り、PowerShellは通常-パラメーターのように見える変数を解釈しないようです。

より簡単なデモ:

$a = 'hi'

echo -InputObject$a

-InputObject$a

echo -InputObject"$a"

-InputOjbecthi

echo -InputObject:$a

hi
于 2019-07-07T16:04:18.500 に答える
0

私はこの質問がかなり古いことを知っています-しかし、これが状況についての私の見解です。

バッチスクリプトを単独で試して、出力ファイルが生成されたかどうかを確認しましたか?生成されていない場合は、GhostScript実行可能ファイルの実行が完了する前にバッチスクリプトのファイルの削除コマンドが実行された可能性があります。

この問題を解決するには、次の2つのアプローチのいずれかを試すことができます

  1. タイムアウトコマンドを使用して、ghostscriptの呼び出しと削除コマンドの間に遅延を追加します

    timeout /t 3 /nobreak > nul

3秒の遅延が追加されます。要件に合わせて調整してください。

  1. ghostscript呼び出しの先頭に「start」コマンドを追加します

    start /wait /min "" "%ProgramFiles%\gs\gs9.07\bin\gswin64.exe" ...

/ waitスイッチを指定すると、開始のターゲットが完了した後にのみdelコマンドが実行されます。/ minスイッチは、コンソールウィンドウの点滅を抑制します。/minスイッチの後の空の文字列""は、startコマンドがghostscript実行可能ファイルへのパスをコンソールタイトルとして扱わないようにするために必要です。

さらに、ghostscript引数を次のように置き換えます

-q -dNOPAUSE -dBATCH -dSAFER -dSimulateOverprint=true -sDEVICE=pdfwrite -dPDFSETTINGS=/ebook -dEmbedAllFonts=true -dSubsetFonts=true -dAutoRotatePages=/None -dColorImageDownsampleType=/Bicubic -dColorImageResolution=150 -dGrayImageDownsampleType=/Bicubic -dGrayImageResolution=150 -dMonoImageDownsampleType=/Bicubic -dMonoImageResolution=150 

おそらく、元の投稿で使用されている最小設定よりもはるかに小さいpdfが生成されることになります。

于 2021-11-29T06:52:21.417 に答える