From cb493562fcf3b8e56e5d2d989f1e2ceb3b630187 Mon Sep 17 00:00:00 2001 From: Xaver Schulz Date: Fri, 10 Dec 2021 21:07:42 +0100 Subject: [PATCH] fix rendering direct to aspnet core response stream adding a WrapperStream to support streams that not implement the Position property needed by SkiaSharp. e.g. useful for the aspnet core response stream fix #52 --- QuestPDF/Drawing/PdfCanvas.cs | 4 +- QuestPDF/Drawing/XpsCanvas.cs | 4 +- QuestPDF/Helpers/WriteStreamWrapper.cs | 53 ++++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 4 deletions(-) create mode 100644 QuestPDF/Helpers/WriteStreamWrapper.cs diff --git a/QuestPDF/Drawing/PdfCanvas.cs b/QuestPDF/Drawing/PdfCanvas.cs index fd7b1df..ca7cf6b 100644 --- a/QuestPDF/Drawing/PdfCanvas.cs +++ b/QuestPDF/Drawing/PdfCanvas.cs @@ -1,5 +1,5 @@ using System.IO; -using QuestPDF.Infrastructure; +using QuestPDF.Helpers; using SkiaSharp; namespace QuestPDF.Drawing @@ -7,7 +7,7 @@ namespace QuestPDF.Drawing internal class PdfCanvas : SkiaDocumentCanvasBase { public PdfCanvas(Stream stream, DocumentMetadata documentMetadata) - : base(SKDocument.CreatePdf(stream, MapMetadata(documentMetadata))) + : base(SKDocument.CreatePdf(new WriteStreamWrapper(stream), MapMetadata(documentMetadata))) { } diff --git a/QuestPDF/Drawing/XpsCanvas.cs b/QuestPDF/Drawing/XpsCanvas.cs index c885ef8..044f5bf 100644 --- a/QuestPDF/Drawing/XpsCanvas.cs +++ b/QuestPDF/Drawing/XpsCanvas.cs @@ -1,5 +1,5 @@ using System.IO; -using QuestPDF.Infrastructure; +using QuestPDF.Helpers; using SkiaSharp; namespace QuestPDF.Drawing @@ -7,7 +7,7 @@ namespace QuestPDF.Drawing internal class XpsCanvas : SkiaDocumentCanvasBase { public XpsCanvas(Stream stream, DocumentMetadata documentMetadata) - : base(SKDocument.CreateXps(stream, documentMetadata.RasterDpi)) + : base(SKDocument.CreateXps(new WriteStreamWrapper(stream), documentMetadata.RasterDpi)) { } diff --git a/QuestPDF/Helpers/WriteStreamWrapper.cs b/QuestPDF/Helpers/WriteStreamWrapper.cs new file mode 100644 index 0000000..e4ce5c9 --- /dev/null +++ b/QuestPDF/Helpers/WriteStreamWrapper.cs @@ -0,0 +1,53 @@ +using System; +using System.IO; + +namespace QuestPDF.Helpers +{ + internal class WriteStreamWrapper : Stream + { + private readonly Stream _innerStream; + + private long _length; + + public WriteStreamWrapper(Stream stream) + { + if (!stream.CanWrite) + { + throw new NotSupportedException("Stream cannot be written"); + } + + _innerStream = stream; + } + + public override bool CanRead => false; + + public override bool CanSeek => false; + + public override bool CanWrite => true; + + public override long Length => _length; + + public override long Position { + get => _length; + set => throw new NotImplementedException(); + } + + public override void Flush() + => _innerStream.Flush(); + + public override int Read(byte[] buffer, int offset, int count) + => throw new NotImplementedException(); + + public override long Seek(long offset, SeekOrigin origin) + => throw new NotImplementedException(); + + public override void SetLength(long value) + => throw new NotImplementedException(); + + public override void Write(byte[] buffer, int offset, int count) + { + _innerStream.Write(buffer, offset, count); + _length += count; + } + } +}