2017-07-18 4 views
3

私は、カスタムモデルにitexsharpを使用して、PDF添付ファイルを解析しているBizTalkカスタムパイプラインコンポーネントを使用しています。パイプラインはPOP3受信ポートにバインドされています。BizTalkカスタムパイプラインPOP3 PDF添付ファイルのエラーを解析する

添付ファイルストリーム(outputMessage.GetPart("Body").Data = ms)を返すと、作成された新しいメッセージにBizTalk管理コンソールが表示されます。私はここから手動でメッセージを保存することができました。これは、パイプラインと同じ構文解析メソッドを使用して正しく解析されました。

パイプラインで直接PDFを解析すると、次のエラーが表示されます。再構築に失敗しました:予告編が見つかりませんでした。オリジナルメッセージ:私はパイプラインからデフォルトのXMLDisassemblerコンポーネントを削除する場合は外部参照サブセクションファイルポインタ1620729

で見つからない場合、解析エラーが消えますが、コンソールにメッセージ本文が空である、けれどもAttachmentSizeInBytes = 1788

public IBaseMessage Execute(IPipelineContext pContext, IBaseMessage pInMsg) 
{ 
    return ExtractMessagePartToMessage(pContext, pInMsg); 
} 

private IBaseMessage ExtractMessagePartToMessage(IPipelineContext pContext, IBaseMessage pInMsg) 
     { 
      if (pInMsg.PartCount <= 1) 
      { 
       throw new InvalidOperationException("The email had no attachment, apparently."); 
      } 

      string partName; 
      IBaseMessagePart attachmentPart = pInMsg.GetPartByIndex(1, out partName); 
      Stream attachmentPartStream = attachmentPart.GetOriginalDataStream(); 

      IBaseMessage outputMessage; 
      outputMessage = pContext.GetMessageFactory().CreateMessage(); 
      outputMessage.AddPart("Body", pContext.GetMessageFactory().CreateMessagePart(), true); 
      outputMessage.Context = pInMsg.Context; 

      var ms = new MemoryStream(); 
      attachmentPartStream.CopyTo(ms); 
      ms.Seek(0L, SeekOrigin.Begin); 

      Stream orderStream = PdfFormParser.Parse(ms); 

      outputMessage.GetPart("Body").Data = orderStream; 
      outputMessage.Context.Write("AttachmentName", "http://schemas.microsoft.com/BizTalk/2003/file-properties", partName); 
      outputMessage.Context.Write("AttachmentSizeInBytes", "http://schemas.microsoft.com/BizTalk/2003/file-properties", orderStream.Length.ToString()); 


      pContext.ResourceTracker.AddResource(ms); 
      pContext.ResourceTracker.AddResource(orderStream); 

      return outputMessage; 
     } 

    public static Stream Parse(Stream pdfDocument) 
     { 
      using (var reader = new PdfReader(pdfDocument)) 
      { 
       var outputStream = new MemoryStream(); 
       var pdfForm = ParseInternal(reader); 
       var xmlDocument = new XmlDocument(); 
       xmlDocument.LoadXml(pdfForm.Serialize()); 

       xmlDocument.Save(outputStream); 

       return outputStream; 
      } 
+0

これはビルドまたはランタイムエラーですか?どのラインがエラーとして報告されますか? –

+0

outputStreamを巻き戻すことを忘れないでください。それ以外の場合、ポインタは最後にあります。戻り値の前に 'outputStream.Position = 0;'が返される – Dijkgraaf

+0

これはストリームStreamでの実行時エラーです。orderStream = PdfFormParser.Parse(ms); 解析する前にストリームを巻き戻します。ms.Seek(0L、SeekOrigin.Begin); –

答えて

1

パイプラインでは、ストリームの読み取りまたは書き込みを行うときに、別のもの(特にBizTalkが処理することを期待する最後のメッセージ)を使用する場合は、ストリームを先頭に巻き戻す必要があります。

関連する問題