2017-11-29 2 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 : \ 사용자 \ 참고 MyUser \의 AppData \ 로컬 \ 온도 \ Procurac¸a ~ O를 - Processo의 5001092-92.2017.4.03.6114.pdf을 :

분명히 그런 파일이나 디렉토리를 filename을 인수를 전달할 때 일종의 인코딩 불일치로 인해 손상되었습니다.

어떻게 해결할 수 있습니까?

다음과 같은 코드를 사용하여 파일을 확인해야 할 수 있습니다
+1

어디서 어떻게 입력 파일 이름 목록을 가져오고 있습니까? –

+0

@Idle_Mind, 전자 메일 첨부 파일 목록이며 원래 이름이 붙어 있습니다. 하지만 그들은 오류가 발생하는 시점에 디스크에 이미 저장되어 있으므로 해당 이름이 Windows에서 유효하다고 확신합니다. – VBobCat

답변

1

:

process.StartInfo.FileName = CpdfPath() 표준화 (NormalizationForm.FormD) NormalizationForm 당신을 위해 최선이 될 수

봐 :.

FormC

유니 코드 문자열 일차 샘플 콘텐츠와 서열 교체 한 후, 전체 정규 분해를 이용하여 규격화되어 ​​표시 가능한 경우 osites.

는 유니 코드 문자열 전체 정식 분해를 사용하여 정규화 있음을 나타냅니다

을 FormD. FormKC

유니 코드 문자열이 가능한 경우, 일차 복합체와 서열의 여분 뒤에 완전한 호환성 분해를 사용하여 정규화되는 것을 나타냅니다.

는 유니 코드 문자열은 완벽한 호환성 분해를 사용하여 정규화 있음을 나타냅니다

을 FormKD.

+0

불행히도 위의 네 가지 옵션 중 어느 것도 문제를 해결하지 못했습니다. 그러나 FormC * 또는 * FormKC *를 사용할 때 cpdf 오류 메시지는 디스크에있는 파일 이름과 정확히 일치하는 파일 이름을 표시합니다. – VBobCat

+1

이봐, 이제 내가 해냈어! 나는 당신의 답을 @Idle_Mind의 통찰력과 결합시켰다. 나는'을 적용했다.** 구성 파일을 디스크에 저장하기 전에 ** 파일 이름으로 변환합니다. 그래서 모든 파일 이름이 이제 정규화되었습니다. 따라서 나는 귀하의 게시물을 답변으로 수락 할 것입니다. 휴, 나는 문자열이 그 안에 동일한 텍스트를 가지고 다를 수 있다는 것을 알지도 못했다 ... – VBobCat

관련 문제