PdfSharpCore проблема рендеринга изображений

Полностью не в состоянии отрисовать изображение JPEG в PDF, используя PdfSharpCore.

Код так же прост, как

public byte[] GetPdfContent()
{
    ImageSource.ImageSourceImpl = new ImageSharpImageSource();

    var document = new PdfDocument();
    var logo = XImage.FromFile("logo.jpg");

    // this is test line, I'm saving XImage result and it is identical to the source file!
    File.WriteAllBytes("logo1.jpg", logo.AsJpeg().ToArray());

    var page = document.AddPage();
    var gfx = XGraphics.FromPdfPage(page);
    gfx.DrawImage(logo, 0, 0);

    using (var stream = new MemoryStream())
    {
         document.Save(stream, false);
         return stream.ToArray();
    }
}

я знаю это ImageSource.ImageSourceImpl должен быть установлен, и я установил его на самый простой ImageSharpреализация на основе: ImageSource.ImageSourceImpl = new ImageSharpImageSource() который действительно действителен, потому что XImage сохраняется как logo1.jpg должным образом.

Но мой PDF визуально пуст. Двоичный контент есть, и кажется, что все свойства формата в порядке, но двоичные данные несколько отличаются от источника.

Вот как моя реализация ImageSharp сохраняет / загружает изображение:

public class ImageSharpImageSource : ImageSource
{
    protected override IImageSource FromFileImpl(string path, int? quality = 75)
    {
        return new ImageSharpImageSourceImpl(path, () =>
        {
            return Image.Load<Rgb24>(path, new JpegDecoder());
        }, (int)quality);
    }

    private class ImageSharpImageSourceImpl : IImageSource
    { 
        public void SaveAsJpeg(MemoryStream ms)
        {
            Image.SaveAsJpeg(ms, new JpegEncoder());
        }
    }
}

Наконец, PDF часть:

7 0 obj   % PdfSharpCore.Pdf.Advanced.PdfImage
<<
  /BitsPerComponent 8
  /ColorSpace /DeviceRGB
  /Filter /DCTDecode
  /Height 340
  /Interpolate true
  /Length 16443
  /Subtype /Image
  /Type /XObject
  /Width 340
>>
stream <<BINARY DATA>>

Пожалуйста, помогите, я застрял на несколько дней! Новичок в этом деле, так что, вероятно, что-то упустил?..

НОТА: gfx.DrawString() методы работают правильно, поэтому я могу отображать текст с той же настройкой.

1 ответ

Пожалуйста, используйте этот метод:-

    internal void SaveImageAsPdf(string imageFileName, string pdfFileName, int width = 600)
    {
        using (var document = new PdfDocument())
        {
            PdfPage page = document.AddPage();
            using (XImage image = XImage.FromFile(imageFileName))
            {
                var height = (int)(((double)width / (double)image.PixelWidth) * image.PixelHeight);

                page.Width = width;
                page.Height = height;

                XGraphics graphics = XGraphics.FromPdfPage(page);
                graphics.DrawImage(image, 0, 0, width, height);                
            }
            document.Save(pdfFileName);
        }
    }

И если вам нужна дополнительная ссылка, например, как только мы конвертируем изображение в pdf, а затем удаляем это изображение, просим также сослаться на это:- Ссылка для более

Другие вопросы по тегам