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, а затем удаляем это изображение, просим также сослаться на это:- Ссылка для более