From 8465e1d2e239d0f9929e6e26ca7eb0e077a43e28 Mon Sep 17 00:00:00 2001 From: Dawid Nowak Date: Tue, 20 Oct 2026 15:32:34 +0200 Subject: [PATCH 1/4] Fix docs examples that don't compile or mislead - Rotate: RotateLayoutClockwise / RotateLayoutCounterclockwise; table basics: obsolete RotateLeft replaced. - SVG: describe the real scaling options (SVG keeps its aspect ratio); add a section on transparent colors (QuestPDF writes #AARRGGBB, the SVG renderer reads #RRGGBBAA); colors page points to it. - Barcodes: the QR example uses BarcodeFormat.QR_CODE. - Document operations: nested DocumentOperation types are qualified; document operations and ZUGFeRD use PDFA_Conformance instead of obsolete PdfA. - Units: Unit.Point, Unit.Centimetre, Unit.Millimetre, Unit.Mil (border, column, row, page settings, length units table, which also lists every unit once). - Generating output: GenerateSvg instead of GenerateSvgFiles. - Debug area: DebugArea instead of Debug. - Components: EmptyContainer.Create() instead of IContainer.Empty, and the missing parenthesis before GeneratePdf. - Dynamic components: usings for QuestPDF.Elements and System.Globalization. - Layers: additional layers continue across pages but are not repeated; point to the page Background / Foreground slots. - Text style: say what BreakAnywhere changes; long words already wrap. - Obsolete Grid, MinimalBox and Text(object) replaced with Column/Row, Shrink and string text; the rendered output is unchanged. Co-Authored-By: Claude Opus 5.5 --- docs/api-reference/barcodes.md | 2 +- docs/api-reference/border.md | 4 +- docs/api-reference/column.md | 4 +- docs/api-reference/debug-area.md | 26 ++++--- docs/api-reference/image/basics.md | 28 +++++--- docs/api-reference/image/svg.md | 7 +- docs/api-reference/layers.md | 2 +- docs/api-reference/page/settings.md | 8 +-- docs/api-reference/rotate.md | 10 +-- docs/api-reference/row.md | 6 +- docs/api-reference/table/basics.md | 2 +- docs/api-reference/table/header-and-footer.md | 10 +-- docs/api-reference/text/style-inheritance.md | 2 +- docs/api-reference/text/text-style.md | 2 +- docs/concepts/code-patterns/components.md | 4 +- .../code-patterns/document-structure.md | 69 ++++++++++++------- .../code-patterns/dynamic-components.md | 8 +++ docs/concepts/colors.md | 2 +- docs/concepts/document-operations.md | 26 +++---- docs/concepts/generating-output.md | 2 +- docs/concepts/length-unit-types.md | 12 ++-- docs/concepts/prototyping.md | 23 ++++--- docs/examples/zugferd.md | 2 +- 23 files changed, 161 insertions(+), 100 deletions(-) diff --git a/docs/api-reference/barcodes.md b/docs/api-reference/barcodes.md index dd0f839e..1d0b40e9 100644 --- a/docs/api-reference/barcodes.md +++ b/docs/api-reference/barcodes.md @@ -121,7 +121,7 @@ using ZXing.Rendering; var writer = new QRCodeWriter(); var qrCode = writer.encode(url, BarcodeFormat.QR_CODE, (int)size.Width, (int)size.Height); var renderer = new SvgRenderer { FontName = "Lato" }; - return renderer.Render(qrCode, BarcodeFormat.EAN_13, null).Content; + return renderer.Render(qrCode, BarcodeFormat.QR_CODE, null).Content; }); }); ``` diff --git a/docs/api-reference/border.md b/docs/api-reference/border.md index bc5fc1b6..77cf5f99 100644 --- a/docs/api-reference/border.md +++ b/docs/api-reference/border.md @@ -31,11 +31,11 @@ container | **BorderTop** | Sets a border on the top side of its content. | | **BorderBottom** | Sets a border on the bottom side of its content. | -Each method requires a thickness value as a parameter. Optionally, you can specify the unit value (default is `Unit.Points`). +Each method requires a thickness value as a parameter. Optionally, you can specify the unit value (default is `Unit.Point`). ```csharp container.Border(1); -container.Border(1, Unit.Millimeters); +container.Border(1, Unit.Millimetre); ``` diff --git a/docs/api-reference/column.md b/docs/api-reference/column.md index 121acb84..1fc21449 100644 --- a/docs/api-reference/column.md +++ b/docs/api-reference/column.md @@ -53,10 +53,10 @@ container
-Optionally, you can specify the unit value (default is `Unit.Points`). +Optionally, you can specify the unit value (default is `Unit.Point`). ```csharp -column.Spacing(5, Unit.Millimeters); +column.Spacing(5, Unit.Millimetre); ``` diff --git a/docs/api-reference/debug-area.md b/docs/api-reference/debug-area.md index f6dd4696..f415070c 100644 --- a/docs/api-reference/debug-area.md +++ b/docs/api-reference/debug-area.md @@ -17,15 +17,15 @@ You can specify text and color to better distinguish between various debug eleme ```csharp{2} container - .Debug("Grid example", Colors.Blue.Medium) + .DebugArea("Grid example", Colors.Blue.Medium) // content ``` It is also possible to skip the color (it is red by default), and even the label: ```csharp -.Debug("Grid example") -.Debug() +.DebugArea("Grid example") +.DebugArea() ``` @@ -38,13 +38,23 @@ container .Height(250) .Padding(25) .DebugArea("Grid example", Colors.Blue.Medium) - .Grid(grid => + .Column(column => { - grid.Columns(3); - grid.Spacing(5); + column.Spacing(5); + + foreach (var itemsInRow in new[] { 3, 3, 2 }) + { + column.Item().Row(row => + { + row.Spacing(5); + + foreach (var _ in Enumerable.Range(0, itemsInRow)) + row.RelativeItem().Height(50).Placeholder(); - foreach (var _ in Enumerable.Range(0, 8)) - grid.Item().Height(50).Placeholder(); + if (itemsInRow < 3) + row.RelativeItem(3 - itemsInRow); + }); + } }); ``` diff --git a/docs/api-reference/image/basics.md b/docs/api-reference/image/basics.md index 64bf6cb3..153abf1a 100644 --- a/docs/api-reference/image/basics.md +++ b/docs/api-reference/image/basics.md @@ -49,17 +49,25 @@ Therefore, the resolution of an image is not used for determining its physical s #### Example ```csharp{8-11} -.Grid(grid => +.Column(column => { - grid.Columns(2); - grid.Spacing(10); - - grid.Item(2).Text("My photo gallery:").Bold(); - - grid.Item().Image("photo-gallery-1.jpg"); - grid.Item().Image("photo-gallery-2.jpg"); - grid.Item().Image("photo-gallery-3.jpg"); - grid.Item().Image("photo-gallery-4.jpg"); + column.Spacing(10); + + column.Item().Text("My photo gallery:").Bold(); + + column.Item().Row(row => + { + row.Spacing(10); + row.RelativeItem().Image("photo-gallery-1.jpg"); + row.RelativeItem().Image("photo-gallery-2.jpg"); + }); + + column.Item().Row(row => + { + row.Spacing(10); + row.RelativeItem().Image("photo-gallery-3.jpg"); + row.RelativeItem().Image("photo-gallery-4.jpg"); + }); }); ``` diff --git a/docs/api-reference/image/svg.md b/docs/api-reference/image/svg.md index 341604fc..d72e873b 100644 --- a/docs/api-reference/image/svg.md +++ b/docs/api-reference/image/svg.md @@ -38,7 +38,7 @@ The same setting is also available via the GUI in your preferred IDE. ::: :::tip -SVG content supports the same scaling options as raster images. [Learn more](/api-reference/image/basics.html#image-scaling) +SVG content supports the `FitWidth`, `FitHeight` and `FitArea` scaling options and always keeps its aspect ratio. `FitUnproportionally` is available only for raster images. [Learn more](/api-reference/image/basics.html#image-scaling) For example: ```csharp{4} @@ -102,6 +102,11 @@ The `QuestPDF.Settings.ThrowOnMissingFontFamilies` and `QuestPDF.Settings.ThrowO Learn more in the [font management](/api-reference/text/font-management) section. +## Transparent colors + +QuestPDF writes a translucent color as `#AARRGGBB` (alpha first), while the SVG renderer reads 8-digit colors as `#RRGGBBAA`, so such a color inside SVG markup renders wrong or not at all. In SVG, use a 6-digit color with an opacity attribute instead, e.g. `fill="#D50000" fill-opacity="0.5"`. + + ## Limitations The SVG module displays SVGs as images with high capabilities and compliance. diff --git a/docs/api-reference/layers.md b/docs/api-reference/layers.md index eb77b722..eed48b19 100644 --- a/docs/api-reference/layers.md +++ b/docs/api-reference/layers.md @@ -3,7 +3,7 @@ The Layers element adds content either underneath (as a background) or on top of (as a watermark) the main content. The main layer supports paging, can span multiple pages, and determines the container's target length. -Additional layers can also span multiple pages and are repeated on each one. +Additional layers can also span multiple pages: like the main layer, a long layer continues on the next page, but it is not repeated on each one. For content on every page, such as a watermark, use the page's [Background or Foreground slot](/api-reference/page/slots). | Method | Description | |------------------|--------------------------------------------------| diff --git a/docs/api-reference/page/settings.md b/docs/api-reference/page/settings.md index 5fe65425..d4eab0f8 100644 --- a/docs/api-reference/page/settings.md +++ b/docs/api-reference/page/settings.md @@ -36,7 +36,7 @@ document.Page(page => { page.Size(595, 842); // in points // or - page.Size(21, 29.7f, Unit.Centimeter); + page.Size(21, 29.7f, Unit.Centimetre); // or page.Size(PageSizes.A4); }); @@ -53,7 +53,7 @@ document.Page(page => { page.ContinuousSize(215); // or - page.ContinuousSize(76, Unit.Millimeter); + page.ContinuousSize(76, Unit.Millimetre); }); ``` @@ -116,7 +116,7 @@ You can configure each side individually or use combined methods for convenience document.Page(page => { page.MarginVertical(32); - page.MarginHorizontal(2, Unit.Centimeter); + page.MarginHorizontal(2, Unit.Centimetre); }); ``` @@ -173,7 +173,7 @@ Document document.Page(page => { page.Size(PageSizes.A5.Landscape()); - page.Margin(2f, Unit.Centimeter); + page.Margin(2f, Unit.Centimetre); page.Content().AlignCenter().AlignMiddle().Text("A5 LANDSCAPE"); }); diff --git a/docs/api-reference/rotate.md b/docs/api-reference/rotate.md index 0a8b38d8..0b155d1f 100644 --- a/docs/api-reference/rotate.md +++ b/docs/api-reference/rotate.md @@ -4,10 +4,10 @@ Constrained rotation enables you to rotate an element by exactly 90 degrees, either clockwise or counterclockwise, while maintaining the content within the same space and size constraints. -| Method | Description | -|----------------------------|--------------------------------------------------| -| **RotateCounterclockwise** | Rotates its content 90 degrees counterclockwise. | -| **RotateClockwise** | Rotates its content 90 degrees clockwise. | +| Method | Description | +|----------------------------------|--------------------------------------------------| +| **RotateLayoutCounterclockwise** | Rotates its content 90 degrees counterclockwise. | +| **RotateLayoutClockwise** | Rotates its content 90 degrees clockwise. | ::: warning When applying rotation, be aware that it changes the dimensional behavior of your elements. @@ -19,7 +19,7 @@ This affects how other properties like alignment and padding work on the rotated container.Row(row => { row.AutoItem() - .RotateCounterclockwise() + .RotateLayoutCounterclockwise() .AlignCenter() .Text("Definition") .Bold().FontColor(Colors.Blue.Darken2); diff --git a/docs/api-reference/row.md b/docs/api-reference/row.md index 8c816908..55d45f97 100644 --- a/docs/api-reference/row.md +++ b/docs/api-reference/row.md @@ -22,7 +22,7 @@ the items will occupy sizes of 15 points, 75 points, and 10 points respectively. | **RelativeItem** | Adds a new item to the row element. This item occupies space proportionally to other relative items. | | **AutoItem** | Adds a new item to the row element. It requests as much horizontal space as its content requires. **Warning**: It doesn't adjust its size based on other items and may frequently result in layout exceptions. It is recommended to use this API in conjunction with the [MaxWidth](/api-reference/width) element. | -For ConstantItem, you can optionally specify the unit value (default is `Unit.Points`). +For ConstantItem, you can optionally specify the unit value (default is `Unit.Point`). ```csharp row.ConstantItem(5, Unit.Centimetre); @@ -85,10 +85,10 @@ container
-Optionally, you can specify the unit value (default is `Unit.Points`). +Optionally, you can specify the unit value (default is `Unit.Point`). ```csharp -row.Spacing(5, Unit.Millimeters); +row.Spacing(5, Unit.Millimetre); ``` diff --git a/docs/api-reference/table/basics.md b/docs/api-reference/table/basics.md index 96460114..bbbaede8 100644 --- a/docs/api-reference/table/basics.md +++ b/docs/api-reference/table/basics.md @@ -116,7 +116,7 @@ Here’s an example showcasing a confusion matrix layout where cells are placed .Text("Predicted condition").Bold(); table.Cell().Row(3).Column(1).RowSpan(2) - .Element(HeaderCellStyle).RotateLeft() + .Element(HeaderCellStyle).RotateLayoutCounterclockwise() .Text("Actual\ncondition").Bold().AlignCenter(); table.Cell().Row(2).Column(3) diff --git a/docs/api-reference/table/header-and-footer.md b/docs/api-reference/table/header-and-footer.md index 2c171f99..b213f2c3 100644 --- a/docs/api-reference/table/header-and-footer.md +++ b/docs/api-reference/table/header-and-footer.md @@ -21,7 +21,7 @@ const int inchesToPoints = 72; container .Padding(10) - .MinimalBox() + .Shrink() .Border(1) .Table(table => { @@ -72,12 +72,12 @@ container table.Cell().Element(CellStyle).ExtendHorizontal().AlignLeft().Text(page.name); // inches - table.Cell().Element(CellStyle).Text(page.width); - table.Cell().Element(CellStyle).Text(page.height); + table.Cell().Element(CellStyle).Text($"{page.width}"); + table.Cell().Element(CellStyle).Text($"{page.height}"); // points - table.Cell().Element(CellStyle).Text(page.width * inchesToPoints); - table.Cell().Element(CellStyle).Text(page.height * inchesToPoints); + table.Cell().Element(CellStyle).Text($"{page.width * inchesToPoints}"); + table.Cell().Element(CellStyle).Text($"{page.height * inchesToPoints}"); IContainer CellStyle(IContainer container) => DefaultCellStyle(container, Colors.White).ShowOnce(); } diff --git a/docs/api-reference/text/style-inheritance.md b/docs/api-reference/text/style-inheritance.md index c6f88a13..658209d9 100644 --- a/docs/api-reference/text/style-inheritance.md +++ b/docs/api-reference/text/style-inheritance.md @@ -51,7 +51,7 @@ It reduces repetitive code, enhances maintainability, and provides flexibility t table.Cell().Element(Style).Text(Placeholders.Sentence()); } - IContainer Style(IContainer container) => container.container.Padding(5); + IContainer Style(IContainer container) => container.Padding(5); }); }); ``` diff --git a/docs/api-reference/text/text-style.md b/docs/api-reference/text/text-style.md index 61faf109..935f8873 100644 --- a/docs/api-reference/text/text-style.md +++ b/docs/api-reference/text/text-style.md @@ -470,7 +470,7 @@ Allows a line to break between any two characters, not only at word boundaries s With this setting enabled, lines are filled as fully as possible, at the cost of splitting words at arbitrary positions without hyphenation. -It is useful for content without natural break points, such as long URLs, identifiers, hashes, or file paths, especially in narrow columns. For regular prose, prefer the default behavior. +Without this setting, a word longer than the line is still split where it overflows, so no text is cut off. `BreakAnywhere` changes where lines break: they are filled completely instead of breaking early at natural break points such as `/` or `-`. Use it when evenly filled lines matter more than readable breaks, e.g. hashes or identifiers in narrow columns; for prose and URLs the default is usually easier to read. ```csharp .Column(column => diff --git a/docs/concepts/code-patterns/components.md b/docs/concepts/code-patterns/components.md index bf8e0cbb..2d9b1f4f 100644 --- a/docs/concepts/code-patterns/components.md +++ b/docs/concepts/code-patterns/components.md @@ -157,7 +157,7 @@ public class SectionComponent : IComponent public IContainer Custom(string label) { - var content = IContainer.Empty; + var content = EmptyContainer.Create(); Fields.Add((label, content)); return content; } @@ -187,7 +187,7 @@ Document // more usages of the section component }); }); - } + }) .GeneratePdf("report.pdf"); IComponent BuildSampleSection() diff --git a/docs/concepts/code-patterns/document-structure.md b/docs/concepts/code-patterns/document-structure.md index 0e3cd93d..f35e9482 100644 --- a/docs/concepts/code-patterns/document-structure.md +++ b/docs/concepts/code-patterns/document-structure.md @@ -52,52 +52,73 @@ public class MyReport private void RedSection(IContainer container) { - container.Grid(grid => + container.Column(column => { - grid.Columns(3); - grid.Spacing(15); - - grid.Item(3 ).Text("Red section") + column.Spacing(15); + + column.Item().Text("Red section") .FontColor(Colors.Red.Darken2).FontSize(32).Bold(); - grid.Item(3).Text(Placeholders.Paragraph()).Light(); + column.Item().Text(Placeholders.Paragraph()).Light(); + + foreach (var rowNumber in Enumerable.Range(0, 2)) + { + column.Item().Row(row => + { + row.Spacing(15); - foreach (var i in Enumerable.Range(0, 6)) - grid.Item().AspectRatio(4 / 3f).Background(Colors.Red.Lighten4); + foreach (var columnNumber in Enumerable.Range(0, 3)) + row.RelativeItem().AspectRatio(4 / 3f).Background(Colors.Red.Lighten4); + }); + } }); } private void GreenSection(IContainer container) { - container.Grid(grid => + container.Column(column => { - grid.Columns(3); - grid.Spacing(15); - - grid.Item(3).Text("Green section") + column.Spacing(15); + + column.Item().Text("Green section") .FontColor(Colors.Green.Darken2).FontSize(32).Bold(); - grid.Item(3).Text(Placeholders.Paragraph()).Light(); + column.Item().Text(Placeholders.Paragraph()).Light(); - foreach (var i in Enumerable.Range(0, 12)) - grid.Item().AspectRatio(4 / 3f).Background(Colors.Green.Lighten4); + foreach (var rowNumber in Enumerable.Range(0, 4)) + { + column.Item().Row(row => + { + row.Spacing(15); + + foreach (var columnNumber in Enumerable.Range(0, 3)) + row.RelativeItem().AspectRatio(4 / 3f).Background(Colors.Green.Lighten4); + }); + } }); } private void BlueSection(IContainer container) { - container.Grid(grid => + container.Column(column => { - grid.Columns(3); - grid.Spacing(15); - - grid.Item(3).Text("Blue section") + column.Spacing(15); + + column.Item().Text("Blue section") .FontColor(Colors.Blue.Darken2).FontSize(32).Bold(); - grid.Item(3).Text(Placeholders.Paragraph()).Light(); + column.Item().Text(Placeholders.Paragraph()).Light(); - foreach (var i in Enumerable.Range(0, 18)) - grid.Item().AspectRatio(4 / 3f).Background(Colors.Blue.Lighten4); + foreach (var rowNumber in Enumerable.Range(0, 6)) + { + column.Item().Row(row => + { + row.Spacing(15); + + foreach (var columnNumber in Enumerable.Range(0, 3)) + row.RelativeItem().AspectRatio(4 / 3f).Background(Colors.Blue.Lighten4); + }); + } }); } } diff --git a/docs/concepts/code-patterns/dynamic-components.md b/docs/concepts/code-patterns/dynamic-components.md index 0707a626..20a4572a 100644 --- a/docs/concepts/code-patterns/dynamic-components.md +++ b/docs/concepts/code-patterns/dynamic-components.md @@ -19,6 +19,11 @@ This component places page numbers on alternating sides of the page - left for o It demonstrates how to use the page number information to conditionally format content. ```csharp +using QuestPDF.Elements; +using QuestPDF.Fluent; +using QuestPDF.Helpers; +using QuestPDF.Infrastructure; + public class PageNumberSideComponent : IDynamicComponent { public DynamicComponentComposeResult Compose(DynamicContext context) @@ -173,6 +178,9 @@ The following component implements a paging algorithm that: 6) Updates state to track progress ```csharp +using System.Globalization; +using QuestPDF.Elements; + public class OrdersTableWithPageSubtotalsComponent : IDynamicComponent { private ICollection Items { get; } diff --git a/docs/concepts/colors.md b/docs/concepts/colors.md index c789ecc5..6d5de0ea 100644 --- a/docs/concepts/colors.md +++ b/docs/concepts/colors.md @@ -54,7 +54,7 @@ You can also omit the hash sign (`#`) at the beginning of the color code. ::: warning -Please be aware that in some software the alpha channel is specified at the end of the color code, e.g. `#RRGGBBAA`. +Please be aware that in some software the alpha channel is specified at the end of the color code, e.g. `#RRGGBBAA`. This includes the SVG renderer used by QuestPDF: in SVG markup, use `fill-opacity` instead (see [SVG Support](/api-reference/image/svg#transparent-colors)). ::: ## Examples diff --git a/docs/concepts/document-operations.md b/docs/concepts/document-operations.md index 4c0c19bb..cf4e9d56 100644 --- a/docs/concepts/document-operations.md +++ b/docs/concepts/document-operations.md @@ -121,7 +121,7 @@ A simple overlay example: ```csharp DocumentOperation .LoadFile("input.pdf") - .OverlayFile(new LayerConfiguration + .OverlayFile(new DocumentOperation.LayerConfiguration { FilePath = "watermark.pdf" }) @@ -133,7 +133,7 @@ More complex overlay example with specific page selections: ```csharp DocumentOperation .LoadFile("input.pdf") - .OverlayFile(new LayerConfiguration + .OverlayFile(new DocumentOperation.LayerConfiguration { FilePath = "watermak.pdf", TargetPages = "1-z", // Apply to all pages @@ -171,7 +171,7 @@ Starting with the 2026.7.2 version, the `AllowModification` permission is also s ```csharp DocumentOperation .LoadFile("input.pdf") - .Encrypt(new Encryption40Bit + .Encrypt(new DocumentOperation.Encryption40Bit { UserPassword = "user123", OwnerPassword = "owner456", @@ -188,7 +188,7 @@ DocumentOperation ```csharp DocumentOperation .LoadFile("input.pdf") - .Encrypt(new Encryption128Bit + .Encrypt(new DocumentOperation.Encryption128Bit { UserPassword = "user123", OwnerPassword = "owner456", @@ -208,7 +208,7 @@ DocumentOperation ```csharp DocumentOperation .LoadFile("input.pdf") - .Encrypt(new Encryption256Bit + .Encrypt(new DocumentOperation.Encryption256Bit { UserPassword = "user123", OwnerPassword = "owner456", @@ -245,7 +245,7 @@ A simple attachment example: ```csharp DocumentOperation .LoadFile("input.pdf") - .AddAttachment(new DocumentAttachment + .AddAttachment(new DocumentOperation.DocumentAttachment { FilePath = "data.csv", Description = "Supporting data table", @@ -286,12 +286,12 @@ The PDF/A-3b standard requires that all attachments provide more information abo ```csharp DocumentOperation .LoadFile("input.pdf") - .AddAttachment(new DocumentAttachment + .AddAttachment(new DocumentOperation.DocumentAttachment { FilePath = "invoice-data.xml", Description = "Invoice XML data", MimeType = "application/xml", - Relationship = DocumentAttachmentRelationship.Alternative, + Relationship = DocumentOperation.DocumentAttachmentRelationship.Alternative, CreationDate = DateTime.UtcNow, ModificationDate = DateTime.UtcNow, Replace = true @@ -319,7 +319,7 @@ Document page.Content().Text("Your invoice content"); }); }) - .WithSettings(new DocumentSettings() { PdfA = true }) // important + .WithSettings(new DocumentSettings() { PDFA_Conformance = PDFA_Conformance.PDFA_3B }) // important .GeneratePdf(path); // step 2: extend the metadata of the PDF document @@ -342,17 +342,17 @@ DocumentOperation .LoadFile("input.pdf") .TakePages("1-10") // Select first 10 pages .MergeFile("appendix.pdf", "1-z") // Append all pages from appendix - .OverlayFile(new LayerConfiguration + .OverlayFile(new DocumentOperation.LayerConfiguration { FilePath = "watermark.pdf", TargetPages = "1-z" }) - .AddAttachment(new DocumentAttachment + .AddAttachment(new DocumentOperation.DocumentAttachment { FilePath = "metadata.xml", - Relationship = DocumentAttachmentRelationship.Supplement + Relationship = DocumentOperation.DocumentAttachmentRelationship.Supplement }) - .Encrypt(new Encryption256Bit + .Encrypt(new DocumentOperation.Encryption256Bit { OwnerPassword = "owner456", AllowPrinting = true, diff --git a/docs/concepts/generating-output.md b/docs/concepts/generating-output.md index 5eb711b3..19c48171 100644 --- a/docs/concepts/generating-output.md +++ b/docs/concepts/generating-output.md @@ -39,7 +39,7 @@ The library also supports generating SVG files. Each page is represented as a separate SVG file. ```csharp -ICollection svgFiles = document.GenerateSvgFiles(); +ICollection svgFiles = document.GenerateSvg(); ``` diff --git a/docs/concepts/length-unit-types.md b/docs/concepts/length-unit-types.md index fb4db44c..fa12dd15 100644 --- a/docs/concepts/length-unit-types.md +++ b/docs/concepts/length-unit-types.md @@ -14,12 +14,14 @@ Most Fluent API methods accept an optional unit parameter for specifying alterna | Unit | Size | |---------------------|------------------| | Unit.**Point** | 1/72 inch | -| Unit.**Meter** | 100 centimeters | -| Unit.**Inch** | 2.54 centimeters | -| Unit.**Centimeter** | 10 millimeters | +| Unit.**Inch** | 72 points | | Unit.**Feet** | 12 inches | | Unit.**Mil** | 1/1000 inch | -| Unit.**Inch** | 72 points | +| Unit.**Meter** | 100 centimeters | +| Unit.**Centimetre** | 10 millimeters | +| Unit.**Millimetre** | 1/1000 meter | + +Note the British spelling of the metric values: `Unit.Centimetre` and `Unit.Millimetre`. ## Example @@ -33,5 +35,5 @@ using QuestPDF.Infrastructure; .Padding(72) .Padding(1, Unit.Inch) .Padding(1/12f, Unit.Feet) -.Padding(1000, Unit.Mill) +.Padding(1000, Unit.Mil) ``` \ No newline at end of file diff --git a/docs/concepts/prototyping.md b/docs/concepts/prototyping.md index 063ffefc..081996c1 100644 --- a/docs/concepts/prototyping.md +++ b/docs/concepts/prototyping.md @@ -78,17 +78,24 @@ Placeholders.Color(); #### BackgroundColor example ```csharp{11} -.Grid(grid => +.Column(column => { - grid.Columns(5); - grid.Spacing(5); + column.Spacing(5); - foreach (var _ in Enumerable.Range(0, 25)) + foreach (var rowNumber in Enumerable.Range(0, 5)) { - grid.Item() - .Height(50) - .Width(50) - .Background(Placeholders.BackgroundColor()); + column.Item().Row(row => + { + row.Spacing(5); + + foreach (var columnNumber in Enumerable.Range(0, 5)) + { + row.RelativeItem() + .Height(50) + .Width(50) + .Background(Placeholders.BackgroundColor()); + } + }); } }); ``` diff --git a/docs/examples/zugferd.md b/docs/examples/zugferd.md index ae50b291..9a7db5d8 100644 --- a/docs/examples/zugferd.md +++ b/docs/examples/zugferd.md @@ -46,7 +46,7 @@ Document Subject = "ZUGFeRD Test Document", Language = "en-US" }) - .WithSettings(new DocumentSettings { PdfA = true }) // PDF/A-3b + .WithSettings(new DocumentSettings { PDFA_Conformance = PDFA_Conformance.PDFA_3B }) // PDF/A-3b .GeneratePdf("invoice-bbb.pdf"); DocumentOperation From f5adf42c2e7e8b82ad689a50c398044146d19898 Mon Sep 17 00:00:00 2001 From: Dawid Nowak Date: Wed, 21 Oct 2026 13:32:50 +0200 Subject: [PATCH 2/4] Shadow: blur, spread and offsets are in points, not pixels Verified by rendering: OffsetX = 50 moves the shadow by 100 px at 144 DPI. Co-Authored-By: Claude Opus 5.5 --- docs/api-reference/shadow.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/api-reference/shadow.md b/docs/api-reference/shadow.md index 3dad7701..cbe4505b 100644 --- a/docs/api-reference/shadow.md +++ b/docs/api-reference/shadow.md @@ -23,7 +23,7 @@ container ## Blur -Gets or sets the blur radius of the shadow in pixels. +Gets or sets the blur radius of the shadow in points. Higher values produce a more diffused shadow with softer edges. A value of 0 results in a sharp, unblurred shadow. @@ -57,7 +57,7 @@ Use with caution, especially in large documents or when rendering complex shadow ## Spread -Gets or sets the spread radius of the shadow in pixels. +Gets or sets the spread radius of the shadow in points. Positive values cause the shadow to expand, negative values cause it to contract. @@ -86,7 +86,7 @@ Positive values cause the shadow to expand, negative values cause it to contract ## Offset X -Gets or sets the horizontal offset of the shadow in pixels. +Gets or sets the horizontal offset of the shadow in points. Positive values move the shadow to the right, negative values move it to the left. @@ -115,7 +115,7 @@ Positive values move the shadow to the right, negative values move it to the lef ## Offset Y -Gets or sets the vertical offset of the shadow in pixels. +Gets or sets the vertical offset of the shadow in points. Positive values move the shadow downward, negative values move it upward. From 6765d89bc0f016341073b48581d1dc6d29213d99 Mon Sep 17 00:00:00 2001 From: Dawid Nowak Date: Wed, 21 Oct 2026 13:58:00 +0200 Subject: [PATCH 3/4] Text basics: point the PDF download link to the hyperlink example The fallback link of the embedded text-hyperlink.pdf pointed to document-merge-continuous.pdf. Co-Authored-By: Claude Opus 5.5 --- docs/api-reference/text/basics.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api-reference/text/basics.md b/docs/api-reference/text/basics.md index 841a2df0..ad4c0db8 100644 --- a/docs/api-reference/text/basics.md +++ b/docs/api-reference/text/basics.md @@ -139,5 +139,5 @@ Hyperlink is a clickable text that redirects the user to a specific webpage. ``` -

Unable to display PDF file. Download instead.

+

Unable to display PDF file. Download instead.

From 8b1f7ead4737871446847af8d43e236da11c8867 Mon Sep 17 00:00:00 2001 From: Dawid Nowak Date: Wed, 21 Oct 2026 15:05:51 +0200 Subject: [PATCH 4/4] Text style: use the bundled example fonts in the font family example Times New Roman and Courier New are system fonts, which QuestPDF 2026.9 no longer loads by default, so the example threw. The tests switched to Noto Serif and JetBrains Mono; the page, its image and the intro sentence now match and point to font management. Co-Authored-By: Claude Opus 5.5 --- docs/api-reference/text/text-style.md | 10 +++++----- .../api-reference/text-font-family.webp | Bin 17694 -> 18038 bytes 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/api-reference/text/text-style.md b/docs/api-reference/text/text-style.md index 935f8873..be35fa1a 100644 --- a/docs/api-reference/text/text-style.md +++ b/docs/api-reference/text/text-style.md @@ -32,7 +32,7 @@ It's worth noting that different fonts may render text with different visual siz A font family is a collection of related fonts that share a consistent design style but may vary in weight, style, or width. -Examples of font families include Arial, Times New Roman, and Calibri. +Examples of font families include Lato, Noto Serif and JetBrains Mono. Fonts other than the built-in Lato must be available to your application, see [font management](/api-reference/text/font-management). ```csharp{8,11} .Column(column => @@ -41,11 +41,11 @@ Examples of font families include Arial, Times New Roman, and Calibri. column.Item().Text("This is text with default font (Lato)"); - column.Item().Text("This is text with Times New Roman font") - .FontFamily("Times New Roman"); + column.Item().Text("This is text with Noto Serif font") + .FontFamily("Noto Serif"); - column.Item().Text("This is text with Courier New font") - .FontFamily("Courier New"); + column.Item().Text("This is text with JetBrains Mono font") + .FontFamily("JetBrains Mono"); }); ``` diff --git a/docs/public/api-reference/text-font-family.webp b/docs/public/api-reference/text-font-family.webp index 8ed9a9be1d4f784b578b4538cbe7dbbefd1c259b..202de2186a5a51e7fc98a32a285b943da421906b 100644 GIT binary patch literal 18038 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 N5&!@I000000023LOCbON literal 17694 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