diff --git a/src/UglyToad.PdfPig/Graphics/Core/TextRenderingMode.cs b/src/UglyToad.PdfPig.Core/TextRenderingMode.cs similarity index 97% rename from src/UglyToad.PdfPig/Graphics/Core/TextRenderingMode.cs rename to src/UglyToad.PdfPig.Core/TextRenderingMode.cs index fd1749a1..58c3b0db 100644 --- a/src/UglyToad.PdfPig/Graphics/Core/TextRenderingMode.cs +++ b/src/UglyToad.PdfPig.Core/TextRenderingMode.cs @@ -1,4 +1,4 @@ -namespace UglyToad.PdfPig.Graphics.Core +namespace UglyToad.PdfPig.Core { /// /// The text rendering mode determines whether showing text causes glyph outlines to be stroked, filled, used as a clipping boundary, @@ -45,4 +45,4 @@ /// NeitherClip = 7 } -} \ No newline at end of file +} diff --git a/src/UglyToad.PdfPig.Tests/Writer/PdfDocumentBuilderTests.cs b/src/UglyToad.PdfPig.Tests/Writer/PdfDocumentBuilderTests.cs index fbadf78e..84a0f02f 100644 --- a/src/UglyToad.PdfPig.Tests/Writer/PdfDocumentBuilderTests.cs +++ b/src/UglyToad.PdfPig.Tests/Writer/PdfDocumentBuilderTests.cs @@ -189,6 +189,62 @@ } } + [Fact] + public void CanWriteSinglePageInvisibleHelloWorld() + { + var builder = new PdfDocumentBuilder(); + + PdfPageBuilder page = builder.AddPage(PageSize.A4); + + PdfDocumentBuilder.AddedFont font = builder.AddStandard14Font(Standard14Font.Helvetica); + + page.SetTextRenderingMode(TextRenderingMode.Neither); + + page.AddText("Hello World!", 12, new PdfPoint(25, 520), font); + + var b = builder.Build(); + + WriteFile(nameof(CanWriteSinglePageInvisibleHelloWorld), b); + + using (var document = PdfDocument.Open(b)) + { + var page1 = document.GetPage(1); + + Assert.Equal(new[] { "Hello", "World!" }, page1.GetWords().Select(x => x.Text)); + } + } + + [Fact] + public void CanWriteSinglePageMixedRenderingMode() + { + var builder = new PdfDocumentBuilder(); + + PdfPageBuilder page = builder.AddPage(PageSize.A4); + + PdfDocumentBuilder.AddedFont font = builder.AddStandard14Font(Standard14Font.Helvetica); + + page.AddText("Hello World!", 12, new PdfPoint(25, 520), font); + + page.SetTextRenderingMode(TextRenderingMode.Neither); + + page.AddText("Invisible!", 12, new PdfPoint(25, 500), font); + + page.SetTextRenderingMode(TextRenderingMode.Fill); + + page.AddText("Filled again!", 12, new PdfPoint(25, 480), font); + + var b = builder.Build(); + + WriteFile(nameof(CanWriteSinglePageMixedRenderingMode), b); + + using (var document = PdfDocument.Open(b)) + { + var page1 = document.GetPage(1); + + Assert.Equal(new[] { "Hello", "World!", "Invisible!", "Filled", "again!" }, page1.GetWords().Select(x => x.Text)); + } + } + [Fact] public void CanWriteSinglePageHelloWorld() { diff --git a/src/UglyToad.PdfPig/Graphics/Core/RenderingModeExtensions.cs b/src/UglyToad.PdfPig/Graphics/Core/RenderingModeExtensions.cs index b5db796e..88fafb64 100644 --- a/src/UglyToad.PdfPig/Graphics/Core/RenderingModeExtensions.cs +++ b/src/UglyToad.PdfPig/Graphics/Core/RenderingModeExtensions.cs @@ -1,5 +1,7 @@ namespace UglyToad.PdfPig.Graphics.Core { + using UglyToad.PdfPig.Core; + internal static class RenderingModeExtensions { public static bool IsFill(this TextRenderingMode mode) @@ -26,4 +28,4 @@ || mode == TextRenderingMode.NeitherClip; } } -} \ No newline at end of file +} diff --git a/src/UglyToad.PdfPig/Graphics/Operations/TextState/SetTextRenderingMode.cs b/src/UglyToad.PdfPig/Graphics/Operations/TextState/SetTextRenderingMode.cs index 8e4119cb..c7279566 100644 --- a/src/UglyToad.PdfPig/Graphics/Operations/TextState/SetTextRenderingMode.cs +++ b/src/UglyToad.PdfPig/Graphics/Operations/TextState/SetTextRenderingMode.cs @@ -1,6 +1,7 @@ namespace UglyToad.PdfPig.Graphics.Operations.TextState { using System.IO; + using PdfPig.Core; using Core; /// @@ -22,6 +23,14 @@ /// public TextRenderingMode Mode { get; } + /// + /// Create a new . + /// + public SetTextRenderingMode(TextRenderingMode mode) + { + Mode = mode; + } + /// /// Create a new . /// @@ -48,4 +57,4 @@ return $"{Mode} {Symbol}"; } } -} \ No newline at end of file +} diff --git a/src/UglyToad.PdfPig/Writer/PdfPageBuilder.cs b/src/UglyToad.PdfPig/Writer/PdfPageBuilder.cs index a16230e9..2279ed7c 100644 --- a/src/UglyToad.PdfPig/Writer/PdfPageBuilder.cs +++ b/src/UglyToad.PdfPig/Writer/PdfPageBuilder.cs @@ -340,6 +340,17 @@ return letters; } + /// + /// Set the text rendering mode. This will apply to all future calls to AddText until called again. + /// + /// To insert invisible text, for example output of OCR, use TextRenderingMode.Neither. + /// + /// Text rendering mode to set. + public void SetTextRenderingMode(TextRenderingMode mode) + { + currentStream.Add(new SetTextRenderingMode(mode)); + } + private NameToken GetAddedFont(PdfDocumentBuilder.AddedFont font) { if (!documentFonts.TryGetValue(font.Id, out NameToken value))