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
commit eac36ceae3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
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>
/// 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>
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]
public void CanWriteSinglePageHelloWorld()
{

View File

@ -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;
}
}
}
}

View File

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

View File

@ -340,6 +340,17 @@
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)
{
if (!documentFonts.TryGetValue(font.Id, out NameToken value))