2017-11-29 24 views
0

cpdfを使用してPDFファイルを連結しています。Process.Startに渡される引数の文字列エンコーディングエラー

それは、このコードによって行われます:

Private Shared Sub ConcatenateWithCpdf(
             outputFileName As String, 
             inputfilenames() As String, 
             Optional timeout As Integer = 15000, 
             Optional ByRef process_exitcode As Integer = 0, 
             Optional ByRef process_output As String = Nothing, 
             Optional ByRef process_erroroutput As String = Nothing) 
    Dim output As New Text.StringBuilder() 
    Dim erroroutput As New Text.StringBuilder() 
    Using process As New Process() 
     process.StartInfo.FileName = CpdfPath() 
     process.StartInfo.Arguments = String.Format(
      "{0} -o ""{1}""", 
      Join(
       inputfilenames.Select(
        Function(s) String.Format("""{0}""", s)).ToArray, 
       " "), 
      outputFileName) 
     process.StartInfo.CreateNoWindow = True 
     process.StartInfo.UseShellExecute = False 
     process.StartInfo.RedirectStandardOutput = True 
     process.StartInfo.RedirectStandardError = True 
     Using outputWaitHandle As New Threading.AutoResetEvent(False) 
      Using errorWaitHandle As New Threading.AutoResetEvent(False) 
       AddHandler process.OutputDataReceived, 
        Sub(sender As Object, e As DataReceivedEventArgs) 
         If e.Data Is Nothing Then 
          outputWaitHandle.Set() 
         Else 
          output.AppendLine(e.Data) 
         End If 
        End Sub 
       AddHandler process.ErrorDataReceived, 
        Sub(sender As Object, e As DataReceivedEventArgs) 
         If e.Data Is Nothing Then 
          errorWaitHandle.Set() 
         Else 
          erroroutput.AppendLine(e.Data) 
         End If 
        End Sub 
       process.Start() 
       process.BeginOutputReadLine() 
       process.BeginErrorReadLine() 
       If process.WaitForExit(timeout) AndAlso 
        outputWaitHandle.WaitOne(timeout) AndAlso 
        errorWaitHandle.WaitOne(timeout) Then 
        process_exitcode = process.ExitCode 
       End If 
      End Using 
     End Using 
    End Using 
    process_output = output.ToString 
    process_erroroutput = erroroutput.ToString 
End Sub 

私の問題は、一部の入力ファイル名は次のように、非ASCII文字を持って、次のとおりです。この場合、

C:\Users\myuser\AppData\Local\Temp\Procuração - Processo 5001092-92.2017.4.03.6114.pdf

、CPDFに障害が発生し、

cpdfがエラーを検出しました。技術的な詳細は以下のとおりです。

C:\ Users \ユーザーmyuserの\のAppData \ローカル\ Tempに\Procurac¸a〜0 - Processoの5001092-92.2017.4.03.6114.pdf:そのようなファイルやディレクトリはありません

明らか

を引数を渡すときに、ある種のエンコーディングの不一致によってfilenameが壊れていました。

どうすればこの問題を解決できますか?

+1

入力ファイル名のリストを取得したり生成したりするにはどうすればよいですか? –

+0

@Idle_Mind、彼らは電子メールの添付ファイルのリストです。元の名前が付いています。しかし、私はエラーが発生した時点ですでにディスクに保存されているので、その名前がWindowsで有効であると確信しています。 – VBobCat

答えて

1

次のコードを使用してファイルをチェックする必要があります。

process.StartInfo.FileName = CpdfPath()ノーマライズ(NormalizationForm.FormD)NormalizationFormがあなたのために最善の可能性があり

ルック:

FormC

は、Unicode文字列は、それらの一次COMPを有する配列の置換に続いて、完全な正規分解を用いて正規化されていることを示し可能であればosites。

FormD

は、Unicode文字列が完全な正規の分解を用いて正規化されていることを示します。 FormKC

は、Unicode文字列が可能な場合、その一次複合体との配列の置換に続いて完全な互換性分解を用いて正規化されていることを示します。

FormKD

は、Unicode文字列は完全な互換性分解を用いて正規化されていることを示します。

+0

残念ながら、上記の4つのオプションのいずれも問題を解決しませんでした。しかし、私が* FormC *や* FormKC *を使用したときには、cpdfのエラーメッセージがディスクに存在するものと全く同じファイル名を表示してくれました。 – VBobCat

+1

ねえ、今私はそれをやった!上記の@Idle_Mindからの洞察と答えを組み合わせました。私は 'を適用しました。コンポーネントファイルをディスクに保存する前に**ファイル名への変換を標準化してください**。したがって、すべてのファイル名が正規化されます。したがって、私は答えとしてあなたの投稿を受け入れるつもりです。ええと、私は文字列が同じテキストを持つ異なることができることを知りませんでした... – VBobCat

関連する問題