2017-07-18 1 views
3

Ich habe eine BizTalk benutzerdefinierte Pipeline-Komponente, wo ich eine PDF-Anlage mit ITEXSHARP in ein benutzerdefiniertes Modell analysieren. Die Pipeline ist an einen POP3-Empfangsport gebunden.BizTalk benutzerdefinierte Pipeline Parser POP3 PDF-Anlage Fehler

In der neu erstellten Nachricht, wenn ich den Anlagenstream (outputMessage.GetPart("Body").Data = ms) zurückgeben, dann sieht dies in der BizTalk-Verwaltungskonsole gut aus. Ich war in der Lage, die Nachricht von hier manuell zu speichern, und dies wurde mit der gleichen Parsing-Methode wie in der Pipeline korrekt analysiert.

Beim Parsing der PDF direkt in der Pipeline, bekomme ich den folgenden Fehler: Rebuild fehlgeschlagen: Trailer nicht gefunden .; Originaltext: xref Unterabschnitt nicht auf Dateizeiger 1620729

gefunden Wenn ich die Standard-XMLDisassembler Komponente aus der Pipeline zu entfernen, dann wird die Parsing-Fehler verschwunden, aber in der Konsole des Nachrichtentext ist leer, obwohl das 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

Ist das ein Build- oder Laufzeitfehler? Welche Zeile wird als fehlerhaft gemeldet? –

+0

Vergessen Sie nicht, den outputStream zurückzuspulen, sonst ist der Zeiger am Ende. 'outputStream.Position = 0;' vor der Rückkehr – Dijkgraaf

+0

Es ist ein Laufzeitfehler, in der Zeile Stream orderStream = PdfFormParser.Parse (ms); Ich spulen den Stream vor dem Parsen: ms.Seek (0L, SeekOrigin.Begin); –

Antwort

1

In Pipelines, wenn Sie einen Stream lesen oder schreiben, müssen Sie den Stream zurück zum Anfang zurückspulen, wenn etwas anderes es verwenden wird (insbesondere die letzte Nachricht, die BizTalk erwartet).