Merge pull request #420 from MeVitae/writer-text-mode

Add `SetTextRenderingMode` method to `PdfPageBuilder`
This commit is contained in:
Eliot Jones
2022-02-16 08:25:09 -04:00
committed by GitHub
5 changed files with 82 additions and 4 deletions

View File

@@ -1,4 +1,4 @@
namespace UglyToad.PdfPig.Graphics.Core namespace UglyToad.PdfPig.Core
{ {
/// <summary> /// <summary>
/// The text rendering mode determines whether showing text causes glyph outlines to be stroked, filled, used as a clipping boundary, /// The text rendering mode determines whether showing text causes glyph outlines to be stroked, filled, used as a clipping boundary,
@@ -45,4 +45,4 @@
/// </summary> /// </summary>
NeitherClip = 7 NeitherClip = 7
} }
} }

View File

@@ -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] [Fact]
public void CanWriteSinglePageHelloWorld() public void CanWriteSinglePageHelloWorld()
{ {

View File

@@ -1,5 +1,7 @@
namespace UglyToad.PdfPig.Graphics.Core namespace UglyToad.PdfPig.Graphics.Core
{ {
using UglyToad.PdfPig.Core;
internal static class RenderingModeExtensions internal static class RenderingModeExtensions
{ {
public static bool IsFill(this TextRenderingMode mode) public static bool IsFill(this TextRenderingMode mode)
@@ -26,4 +28,4 @@
|| mode == TextRenderingMode.NeitherClip; || mode == TextRenderingMode.NeitherClip;
} }
} }
} }

View File

@@ -1,6 +1,7 @@
namespace UglyToad.PdfPig.Graphics.Operations.TextState namespace UglyToad.PdfPig.Graphics.Operations.TextState
{ {
using System.IO; using System.IO;
using PdfPig.Core;
using Core; using Core;
/// <inheritdoc /> /// <inheritdoc />
@@ -22,6 +23,14 @@
/// </summary> /// </summary>
public TextRenderingMode Mode { get; } public TextRenderingMode Mode { get; }
/// <summary>
/// Create a new <see cref="SetTextRenderingMode"/>.
/// </summary>
public SetTextRenderingMode(TextRenderingMode mode)
{
Mode = mode;
}
/// <summary> /// <summary>
/// Create a new <see cref="SetTextRenderingMode"/>. /// Create a new <see cref="SetTextRenderingMode"/>.
/// </summary> /// </summary>
@@ -48,4 +57,4 @@
return $"{Mode} {Symbol}"; return $"{Mode} {Symbol}";
} }
} }
} }

View File

@@ -340,6 +340,17 @@
return letters; return letters;
} }
/// <summary>
/// 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 <c>TextRenderingMode.Neither</c>.
/// </summary>
/// <param name="mode">Text rendering mode to set.</param>
public void SetTextRenderingMode(TextRenderingMode mode)
{
currentStream.Add(new SetTextRenderingMode(mode));
}
private NameToken GetAddedFont(PdfDocumentBuilder.AddedFont font) private NameToken GetAddedFont(PdfDocumentBuilder.AddedFont font)
{ {
if (!documentFonts.TryGetValue(font.Id, out NameToken value)) if (!documentFonts.TryGetValue(font.Id, out NameToken value))