【问题标题】:BizTalk custom pipeline parsing POP3 PDF attachment errorBizTalk 自定义管道解析 POP3 PDF 附件错误
【发布时间】:2017-12-23 12:55:54
【问题描述】:

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

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

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

如果我从管道中删除默认 XMLDisassembler 组件,则解析错误消失,但在控制台中消息正文为空,尽管 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;
            }

【问题讨论】:

  • 这是构建错误还是运行时错误?哪一行被报告为错误?
  • 别忘了将 outputStream 倒回,否则指针在末尾。 outputStream.Position = 0;返回前
  • 这是一个运行时错误,位于 Stream orderStream = PdfFormParser.Parse(ms);我在解析之前倒带流:ms.Seek(0L, SeekOrigin.Begin);
  • 倒带 orderStream 也很有帮助,消息现在正确显示在管理控制台中。

标签: itext biztalk biztalk-2013


【解决方案1】:

在管道中,当您读取或写入 Stream 时,如果有其他东西要使用它(尤其是您希望 BizTalk 处理的最终消息),您必须将流倒回到开头。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-15
    • 2012-03-05
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    • 2012-03-31
    • 1970-01-01
    • 2022-07-27
    相关资源
    最近更新 更多