DocumentOperationStreamExamples.cs 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. using System.IO;
  2. using System.Runtime.InteropServices;
  3. using NUnit.Framework;
  4. using QuestPDF.Fluent;
  5. using QuestPDF.Helpers;
  6. using QuestPDF.Infrastructure;
  7. namespace QuestPDF.DocumentationExamples;
  8. [TestFixture]
  9. public class DocumentOperationStreamExamples
  10. {
  11. public DocumentOperationStreamExamples()
  12. {
  13. if (RuntimeInformation.RuntimeIdentifier == "linux-musl-x64")
  14. Assert.Ignore("The DocumentOperations functionality is not supported on Linux Musl, e.g. Alpine.");
  15. }
  16. [Test]
  17. public void LoadFromStreamAndSaveToStream()
  18. {
  19. // Generate a sample PDF as bytes
  20. var samplePdfBytes = Document
  21. .Create(document =>
  22. {
  23. document.Page(page =>
  24. {
  25. page.Size(PageSizes.A4);
  26. page.Content()
  27. .PaddingVertical(1, Unit.Centimetre)
  28. .PaddingHorizontal(2, Unit.Centimetre)
  29. .Column(column =>
  30. {
  31. column.Item().Text("Sample Document").FontSize(20).Bold();
  32. column.Item().Text("This document was loaded from a stream and processed using DocumentOperation.").FontSize(12);
  33. });
  34. });
  35. })
  36. .GeneratePdf();
  37. // Process the PDF using stream-based operations
  38. using var inputStream = new MemoryStream(samplePdfBytes);
  39. using var outputStream = new MemoryStream();
  40. DocumentOperation
  41. .LoadStream(inputStream)
  42. .Linearize() // Optimize for web
  43. .SaveToStream(outputStream);
  44. // The processed PDF is now in outputStream
  45. Assert.That(outputStream.Length, Is.GreaterThan(0));
  46. // You can write it to a file if needed
  47. File.WriteAllBytes("stream-processed-output.pdf", outputStream.ToArray());
  48. }
  49. [Test]
  50. public void MergeMultipleStreams()
  51. {
  52. // Create multiple PDF documents as byte arrays
  53. var doc1Bytes = CreateSampleDocument("Document 1", Colors.Red.Lighten3);
  54. var doc2Bytes = CreateSampleDocument("Document 2", Colors.Green.Lighten3);
  55. var doc3Bytes = CreateSampleDocument("Document 3", Colors.Blue.Lighten3);
  56. // Merge them using streams
  57. using var stream1 = new MemoryStream(doc1Bytes);
  58. using var stream2 = new MemoryStream(doc2Bytes);
  59. using var stream3 = new MemoryStream(doc3Bytes);
  60. using var outputStream = new MemoryStream();
  61. DocumentOperation
  62. .LoadStream(stream1)
  63. .MergeStream(stream2)
  64. .MergeStream(stream3)
  65. .SaveToStream(outputStream);
  66. // Save the merged document
  67. File.WriteAllBytes("merged-streams-output.pdf", outputStream.ToArray());
  68. Assert.That(outputStream.Length, Is.GreaterThan(0));
  69. }
  70. [Test]
  71. public void AddStreamBasedOverlay()
  72. {
  73. // Create main document and watermark
  74. var mainDocBytes = CreateSampleDocument("Main Document", Colors.Grey.Lighten4);
  75. var watermarkBytes = CreateWatermarkDocument();
  76. using var mainStream = new MemoryStream(mainDocBytes);
  77. using var watermarkStream = new MemoryStream(watermarkBytes);
  78. using var outputStream = new MemoryStream();
  79. DocumentOperation
  80. .LoadStream(mainStream)
  81. .OverlayStream(new DocumentOperation.LayerStreamConfiguration
  82. {
  83. Stream = watermarkStream
  84. })
  85. .SaveToStream(outputStream);
  86. File.WriteAllBytes("watermarked-output.pdf", outputStream.ToArray());
  87. Assert.That(outputStream.Length, Is.GreaterThan(0));
  88. }
  89. [Test]
  90. public void AddAttachmentFromStream()
  91. {
  92. // Create main document
  93. var mainDocBytes = CreateSampleDocument("Document with Attachment", Colors.Purple.Lighten3);
  94. // Create attachment content
  95. var attachmentContent = "This is the content of the attached text file.";
  96. var attachmentBytes = System.Text.Encoding.UTF8.GetBytes(attachmentContent);
  97. using var mainStream = new MemoryStream(mainDocBytes);
  98. using var attachmentStream = new MemoryStream(attachmentBytes);
  99. using var outputStream = new MemoryStream();
  100. DocumentOperation
  101. .LoadStream(mainStream)
  102. .AddAttachmentStream(new DocumentOperation.DocumentAttachmentStream
  103. {
  104. Stream = attachmentStream,
  105. AttachmentName = "readme.txt",
  106. Description = "Important information about this document",
  107. MimeType = "text/plain"
  108. })
  109. .SaveToStream(outputStream);
  110. File.WriteAllBytes("document-with-attachment.pdf", outputStream.ToArray());
  111. Assert.That(outputStream.Length, Is.GreaterThan(0));
  112. }
  113. [Test]
  114. public void MixFileAndStreamOperations()
  115. {
  116. // Create a file-based document first
  117. var filePdfBytes = CreateSampleDocument("File-based Document", Colors.Orange.Lighten3);
  118. File.WriteAllBytes("file-document.pdf", filePdfBytes);
  119. // Create stream-based content
  120. var streamPdfBytes = CreateSampleDocument("Stream-based Document", Colors.Teal.Lighten3);
  121. using var streamInput = new MemoryStream(streamPdfBytes);
  122. using var outputStream = new MemoryStream();
  123. // Mix file and stream operations
  124. DocumentOperation
  125. .LoadFile("file-document.pdf") // Load from file
  126. .MergeStream(streamInput) // Merge from stream
  127. .SaveToStream(outputStream); // Save to stream
  128. File.WriteAllBytes("mixed-operations-output.pdf", outputStream.ToArray());
  129. Assert.That(outputStream.Length, Is.GreaterThan(0));
  130. }
  131. private byte[] CreateSampleDocument(string title, Color color)
  132. {
  133. return Document
  134. .Create(document =>
  135. {
  136. document.Page(page =>
  137. {
  138. page.Size(PageSizes.A4);
  139. page.PageColor(color);
  140. page.Content()
  141. .PaddingVertical(2, Unit.Centimetre)
  142. .PaddingHorizontal(2, Unit.Centimetre)
  143. .Column(column =>
  144. {
  145. column.Item().Text(title).FontSize(24).Bold().FontColor(Colors.White);
  146. column.Item().PaddingTop(1, Unit.Centimetre);
  147. column.Item().Text("This is a sample document created for stream-based operations demonstration.")
  148. .FontSize(12).FontColor(Colors.White);
  149. });
  150. });
  151. })
  152. .GeneratePdf();
  153. }
  154. private byte[] CreateWatermarkDocument()
  155. {
  156. return Document
  157. .Create(document =>
  158. {
  159. document.Page(page =>
  160. {
  161. page.Size(PageSizes.A4);
  162. page.PageColor(Colors.Transparent);
  163. page.Content()
  164. .AlignCenter()
  165. .AlignMiddle()
  166. .Rotate(-45)
  167. .Text("CONFIDENTIAL")
  168. .FontSize(72)
  169. .FontColor(Colors.Red.Darken2)
  170. .Bold();
  171. });
  172. })
  173. .GeneratePdf();
  174. }
  175. }