首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BizTalk自定义管道解析POP3 PDF附件错误

BizTalk自定义管道解析POP3 PDF附件错误
EN

Stack Overflow用户
提问于 2017-07-18 15:00:56
回答 1查看 189关注 0票数 3

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

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

当直接在管道中解析PDF时,我得到以下错误:重建失败:未找到预告片;原始消息: xref分段未在文件指针1620729处找到

如果我从管道中删除默认的XMLDisassembler组件,那么解析错误就消失了,但是在控制台中消息体是空的,尽管AttachmentSizeInBytes=1788是空的。

代码语言:javascript
复制
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;
            }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-19 22:34:55

在管道中,当您读取或写入一个流时,如果要使用它(特别是您希望BizTalk处理的最后消息),您必须将流回原点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45170460

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档