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;
}
Ist das ein Build- oder Laufzeitfehler? Welche Zeile wird als fehlerhaft gemeldet? –
Vergessen Sie nicht, den outputStream zurückzuspulen, sonst ist der Zeiger am Ende. 'outputStream.Position = 0;' vor der Rückkehr – Dijkgraaf
Es ist ein Laufzeitfehler, in der Zeile Stream orderStream = PdfFormParser.Parse (ms); Ich spulen den Stream vor dem Parsen: ms.Seek (0L, SeekOrigin.Begin); –