2016-11-28 5 views
4

Я пытаюсь разместить изображение в PDF с помощью XSLT. У меня есть изображения, которые уже отображаются, но в этом случае у меня есть байт-код изначально, и я просто генерирую строку base64. Однако в следующем примере я читаю изображение из файла ресурсов, а затем пытаюсь изменить его на base64, но в этом случае он вызывает следующую ошибку:Изображение не найдено при создании PDF

Исключение пути: this.imageFilePath (первые 100 символов): base64: iVBORw0KGgoAAAANSUhEUgAAAFoAAABNCAYAAAAme3MhAAAABGdBTUEAALGPC/xhBQAAHrFJREFUeF7V3AuwrWVdx/Etq

шаблон используется следующим образом:

string brandLogoXslt = @"<Paragraph Style=""P"">Some text here:</Paragraph>"; 
     brandLogoXslt += @"<Image><xsl:attribute name=""Filename"">" + MigraDocFilenameFromByteArray(ExtractResource(Business.Properties.Resources.logo)) + "</xsl:attribute></Image>"; 
     genericPlaceholderNodes[i].ParentNode.InnerXml = genericPlaceholderNodes[i].ParentNode.InnerXml.Replace(genericPlaceholderNodes[i].OuterXml, brandLogoXslt); 

код, используемый для изменения изображения:

private static string MigraDocFilenameFromByteArray(byte[] image) 
{ 
    return "base64:" + Convert.ToBase64String(image); 
} 
public static byte[] ExtractResource(System.Drawing.Image image) 
{ 
    MemoryStream ms = new MemoryStream(); 

    image.Save(ms, ImageFormat.Png); 
    if (ms == null) 
     return null; 
    byte[] imageByteArray = ms.ToArray(); 
    return imageByteArray; 
} 

Я уже проверил строку base64, и он генерирует правильное изображение, проверенное онлайн.

Стек след:

bei MigraDoc.Rendering.ImageRenderer.CalculateImageDimensions() 
bei MigraDoc.Rendering.ImageRenderer.Format(Area area, FormatInfo previousFormatInfo) 
bei MigraDoc.Rendering.TopDownFormatter.FormatOnAreas(XGraphics gfx, Boolean topLevel) 
bei MigraDoc.Rendering.FormattedCell.Format(XGraphics gfx) 
bei MigraDoc.Rendering.TableRenderer.FormatCells() 
bei MigraDoc.Rendering.TableRenderer.InitFormat(Area area, FormatInfo previousFormatInfo) 
bei MigraDoc.Rendering.TableRenderer.Format(Area area, FormatInfo previousFormatInfo) 
bei MigraDoc.Rendering.TopDownFormatter.FormatOnAreas(XGraphics gfx, Boolean topLevel) 
bei MigraDoc.Rendering.FormattedDocument.Format(XGraphics gfx) 
bei MigraDoc.Rendering.DocumentRenderer.PrepareDocument() 
bei MigraDoc.Rendering.PdfDocumentRenderer.PrepareDocumentRenderer(Boolean prepareCompletely) 
bei MigraDoc.Rendering.PdfDocumentRenderer.PrepareRenderPages() 
bei MigraDoc.Rendering.PdfDocumentRenderer.RenderDocument() 
bei School.DE.WebApplications.SCHDI.Business.NewPDFGenerator.TemplateToPdfTransformerBase.Transform2Pdf(Object data, XslTransform transform, Stream outStrm) in d:\Projects\Business\NewPDFGenerator\TemplateToPdfTransformerBase.cs:Zeile 70. 

ответ

0

в base64 кодирование изображений является функция MigraDoc и она работает с MigraDoc 1.50 бета 3 и позже только.

Файл, закодированный таким образом, не может использоваться с XSLT или с MigraDoc 1.32 или старше.

+0

Да, я знаю, но, как уже упоминалось, я уже смогу отображать изображения с помощью xslt. xslt предназначен только для шаблонирования pdf-документа. – Maqsood

+0

Если в коде MigraDoc возникает исключение, укажите дополнительную информацию (например, трассировку стека для исключения) или лучше предоставите MCVE. Если исключение происходит вне кода MigraDoc, тогда ответ будет неработоспособным. –

+0

Вы можете отредактировать свой вопрос, чтобы включить трассировку strack в более удобочитаемую форму и удалить комментарии здесь. BASE64 для изображений - это новая функция MigraDoc 1.50. Какую версию MigraDoc вы используете? –