DocumentOperationTests.cs 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. using System;
  2. using System.IO;
  3. using System.Linq;
  4. using System.Runtime.InteropServices;
  5. using NUnit.Framework;
  6. using QuestPDF.Fluent;
  7. using QuestPDF.Helpers;
  8. using QuestPDF.Infrastructure;
  9. namespace QuestPDF.UnitTests;
  10. /// <summary>
  11. /// This test suite focus on executing various QPDF operations.
  12. /// In most cases, it does not check the result but rather if any exception is thrown.
  13. /// </summary>
  14. public class DocumentOperationTests
  15. {
  16. [Test]
  17. public void TakePages()
  18. {
  19. GenerateSampleDocument("take-input.pdf", Colors.Red.Medium, 10);
  20. DocumentOperation
  21. .LoadFile("take-input.pdf")
  22. .TakePages("2-5")
  23. .Save("operation-take.pdf");
  24. }
  25. [Test]
  26. public void MergeTest()
  27. {
  28. GenerateSampleDocument("merge-first.pdf", Colors.Red.Medium, 3);
  29. GenerateSampleDocument("merge-second.pdf", Colors.Green.Medium, 5);
  30. GenerateSampleDocument("merge-third.pdf", Colors.Blue.Medium, 7);
  31. DocumentOperation
  32. .LoadFile("merge-first.pdf")
  33. .MergeFile("merge-second.pdf")
  34. .MergeFile("merge-third.pdf")
  35. .Save("operation-merged.pdf");
  36. }
  37. [Test]
  38. public void OverlayTest()
  39. {
  40. GenerateSampleDocument("overlay-main.pdf", Colors.Red.Medium, 10);
  41. GenerateSampleDocument("overlay-watermark.pdf", Colors.Green.Medium, 5);
  42. DocumentOperation
  43. .LoadFile("overlay-main.pdf")
  44. .OverlayFile(new DocumentOperation.LayerConfiguration
  45. {
  46. FilePath = "overlay-watermark.pdf"
  47. })
  48. .Save("operation-overlay.pdf");
  49. }
  50. [Test]
  51. public void UnderlayTest()
  52. {
  53. GenerateSampleDocument("underlay-main.pdf", Colors.Red.Medium, 10);
  54. GenerateSampleDocument("underlay-watermark.pdf", Colors.Green.Medium, 5);
  55. DocumentOperation
  56. .LoadFile("underlay-main.pdf")
  57. .UnderlayFile(new DocumentOperation.LayerConfiguration
  58. {
  59. FilePath = "underlay-watermark.pdf",
  60. })
  61. .Save("operation-underlay.pdf");
  62. }
  63. [Test]
  64. public void AttachmentTest()
  65. {
  66. GenerateSampleDocument("attachment-main.pdf", Colors.Red.Medium, 10);
  67. GenerateSampleDocument("attachment-file.pdf", Colors.Green.Medium, 5);
  68. DocumentOperation
  69. .LoadFile("attachment-main.pdf")
  70. .AddAttachment(new DocumentOperation.DocumentAttachment
  71. {
  72. FilePath = "attachment-file.pdf"
  73. })
  74. .Save("operation-attachment.pdf");
  75. }
  76. [Test]
  77. public void Encrypt40Test()
  78. {
  79. GenerateSampleDocument("encrypt40-input.pdf", Colors.Red.Medium, 10);
  80. DocumentOperation
  81. .LoadFile("encrypt40-input.pdf")
  82. .Encrypt(new DocumentOperation.Encryption40Bit()
  83. {
  84. UserPassword = "user_password",
  85. OwnerPassword = "owner_password"
  86. })
  87. .Save("operation-encrypt40.pdf");
  88. }
  89. [Test]
  90. public void Encrypt128Test()
  91. {
  92. GenerateSampleDocument("encrypt128-input.pdf", Colors.Red.Medium, 10);
  93. DocumentOperation
  94. .LoadFile("encrypt128-input.pdf")
  95. .Encrypt(new DocumentOperation.Encryption128Bit()
  96. {
  97. UserPassword = "user_password",
  98. OwnerPassword = "owner_password"
  99. })
  100. .Save("operation-encrypt128.pdf");
  101. }
  102. [Test]
  103. public void Encrypt256Test()
  104. {
  105. GenerateSampleDocument("encrypt256-input.pdf", Colors.Red.Medium, 10);
  106. DocumentOperation
  107. .LoadFile("encrypt256-input.pdf")
  108. .Encrypt(new DocumentOperation.Encryption256Bit()
  109. {
  110. UserPassword = "user_password",
  111. OwnerPassword = "owner_password"
  112. })
  113. .Save("operation-encrypt256.pdf");
  114. }
  115. [Test]
  116. public void LinearizeTest()
  117. {
  118. GenerateSampleDocument("linearize-input.pdf", Colors.Red.Medium, 10);
  119. DocumentOperation
  120. .LoadFile("linearize-input.pdf")
  121. .Linearize()
  122. .Save("operation-linearize.pdf");
  123. }
  124. [Test]
  125. public void DecryptTest()
  126. {
  127. GenerateSampleDocument("decrypt-input-not-encrypted.pdf", Colors.Red.Medium, 10);
  128. DocumentOperation
  129. .LoadFile("decrypt-input-not-encrypted.pdf")
  130. .Encrypt(new DocumentOperation.Encryption256Bit()
  131. {
  132. UserPassword = "user_password",
  133. OwnerPassword = "owner_password"
  134. })
  135. .Save("decrypt-input-encrypted.pdf");
  136. DocumentOperation
  137. .LoadFile("decrypt-input-encrypted.pdf", "owner_password")
  138. .Decrypt()
  139. .Save("operation-decrypt.pdf");
  140. }
  141. [Test]
  142. public void RemoveRestrictionsTest()
  143. {
  144. GenerateSampleDocument("remove-restrictions-input-not-encrypted.pdf", Colors.Red.Medium, 10);
  145. DocumentOperation
  146. .LoadFile("remove-restrictions-input-not-encrypted.pdf")
  147. .Encrypt(new DocumentOperation.Encryption256Bit()
  148. {
  149. UserPassword = string.Empty,
  150. OwnerPassword = "owner_password",
  151. AllowPrinting = false,
  152. AllowContentExtraction = false
  153. })
  154. .Save("remove-restrictions-input-encrypted.pdf");
  155. DocumentOperation
  156. .LoadFile("remove-restrictions-input-encrypted.pdf", "owner_password")
  157. .RemoveRestrictions()
  158. .Save("operation-remove-restrictions.pdf");
  159. }
  160. [Test]
  161. public void LoadEncryptedWithIncorrectPasswordTest()
  162. {
  163. GenerateSampleDocument("load-encrypted-input-not-encrypted.pdf", Colors.Red.Medium, 10);
  164. DocumentOperation
  165. .LoadFile("load-encrypted-input-not-encrypted.pdf")
  166. .Encrypt(new DocumentOperation.Encryption256Bit()
  167. {
  168. UserPassword = "user_password",
  169. OwnerPassword = "owner_password"
  170. })
  171. .Save("load-encrypted-input-encrypted.pdf");
  172. Assert.Catch(() =>
  173. {
  174. DocumentOperation
  175. .LoadFile("load-encrypted-input-encrypted.pdf", "wrong_password")
  176. .Save("operation-load-encrypted.pdf");
  177. });
  178. }
  179. [Test]
  180. public void ExtendMetadataTest()
  181. {
  182. GenerateSampleDocument("extend-metadata-input.pdf", Colors.Red.Medium, 10);
  183. // requires PDF/A-3b
  184. DocumentOperation
  185. .LoadFile("extend-metadata-input.pdf")
  186. .ExtendMetadata("<rdf:Description xmlns:dc=\"http://purl.org/dc/elements/1.1/\" rdf:about=\"\"></rdf:Description>")
  187. .Save("operation-extend-metadata.pdf");
  188. }
  189. private void GenerateSampleDocument(string filePath, Color color, int length)
  190. {
  191. Document
  192. .Create(document =>
  193. {
  194. document.Page(page =>
  195. {
  196. page.Size(PageSizes.A4);
  197. page.PageColor(Colors.Transparent);
  198. page.Content().Column(column =>
  199. {
  200. foreach (var i in Enumerable.Range(1, length))
  201. {
  202. if (i != 1)
  203. column.Item().PageBreak();
  204. var width = Random.Shared.Next(100, 200);
  205. var height = Random.Shared.Next(100, 200);
  206. var horizontalTranslation = Random.Shared.Next(0, (int)PageSizes.A4.Width - width);
  207. var verticalTranslation = Random.Shared.Next(0, (int)PageSizes.A4.Height - height);
  208. column.Item()
  209. .TranslateX(horizontalTranslation)
  210. .TranslateY(verticalTranslation)
  211. .Width(width)
  212. .Height(height)
  213. .Background(color.WithAlpha(64))
  214. .AlignCenter()
  215. .AlignMiddle()
  216. .Text($"{filePath}\npage {i}")
  217. .FontColor(color)
  218. .Bold()
  219. .FontSize(16);
  220. }
  221. });
  222. });
  223. })
  224. .WithSettings(new DocumentSettings { PdfA = true })
  225. .GeneratePdf(filePath);
  226. }
  227. }