Itext BizTalk自定义管道分析POP3 PDF附件错误

Itext BizTalk自定义管道分析POP3 PDF附件错误,itext,biztalk,biztalk-2013,Itext,Biztalk,Biztalk 2013,我有一个BizTalk自定义管道组件,在该组件中,我正在使用itexsharp将PDF附件解析为自定义模型。管道绑定到POP3接收端口 在新创建的消息中,如果我返回附件流(outputMessage.GetPart(“Body”).Data=ms),则在BizTalk管理控制台中效果良好。我已经能够从这里手动保存消息,并且使用与管道中相同的解析方法正确解析了消息 当直接在管道中解析PDF时,我得到以下错误:重建失败:未找到拖车。;原始消息:在文件指针1620729处未找到外部参照子节 如果我从管

我有一个BizTalk自定义管道组件,在该组件中,我正在使用itexsharp将PDF附件解析为自定义模型。管道绑定到POP3接收端口

在新创建的消息中,如果我返回附件流(
outputMessage.GetPart(“Body”).Data=ms
),则在BizTalk管理控制台中效果良好。我已经能够从这里手动保存消息,并且使用与管道中相同的解析方法正确解析了消息

当直接在管道中解析PDF时,我得到以下错误:重建失败:未找到拖车。;原始消息:在文件指针1620729处未找到外部参照子节

如果我从管道中删除默认的XmlDemolector组件,那么解析错误就会消失,但是在控制台中,消息体是空的,尽管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;
            }
public IBaseMessage Execute(ipipipelinecontext pContext,IBaseMessage pInMsg)
{
返回ExtractMessagePartToMessage(pContext,pInMsg);
}
专用iBasMessage ExtractMessagePartToMessage(IPipelineContext pContext,iBasMessage pInMsg)
{

如果读取或写入流时(pInMsg.PartCount在管道中,如果有其他东西要使用它,则必须将流倒回开头(特别是您希望BizTalk处理的最后一条消息).

这是生成错误还是运行时错误?哪一行被报告为错误?不要忘记倒带outputStream,否则指针在末尾。
outputStream.Position=0;
在返回之前这是一个运行时错误,在line Stream orderStream=PdfFormParser.Parse(ms);我在解析之前倒带流:ms.Seek(0L,请参见Korigin.Begin);倒带orderStream也很有帮助,消息现在已正确显示在管理控制台中。