diff --git a/src/UglyToad.PdfPig.DocumentLayoutAnalysis/DuplicateOverlappingTextProcessor.cs b/src/UglyToad.PdfPig.DocumentLayoutAnalysis/DuplicateOverlappingTextProcessor.cs index b3e3e2b1..e6900dfe 100644 --- a/src/UglyToad.PdfPig.DocumentLayoutAnalysis/DuplicateOverlappingTextProcessor.cs +++ b/src/UglyToad.PdfPig.DocumentLayoutAnalysis/DuplicateOverlappingTextProcessor.cs @@ -77,7 +77,9 @@ letter.Width, letter.FontSize, fontDetails, - letter.Color, + letter.RenderingMode, + letter.StrokeColor, + letter.FillColor, letter.PointSize, letter.TextSequence); diff --git a/src/UglyToad.PdfPig.DocumentLayoutAnalysis/TextExtractor/ContentOrderTextExtractor.cs b/src/UglyToad.PdfPig.DocumentLayoutAnalysis/TextExtractor/ContentOrderTextExtractor.cs index 8766a694..80f5f58a 100644 --- a/src/UglyToad.PdfPig.DocumentLayoutAnalysis/TextExtractor/ContentOrderTextExtractor.cs +++ b/src/UglyToad.PdfPig.DocumentLayoutAnalysis/TextExtractor/ContentOrderTextExtractor.cs @@ -65,7 +65,9 @@ letter.Width, letter.FontSize, letter.Font, - letter.Color, + letter.RenderingMode, + letter.StrokeColor, + letter.FillColor, letter.PointSize, letter.TextSequence); } diff --git a/src/UglyToad.PdfPig/Content/Letter.cs b/src/UglyToad.PdfPig/Content/Letter.cs index b15ea4f3..08abfcd3 100644 --- a/src/UglyToad.PdfPig/Content/Letter.cs +++ b/src/UglyToad.PdfPig/Content/Letter.cs @@ -61,12 +61,33 @@ /// Details about the font for this letter. /// public FontDetails Font { get; } + + /// + /// Text rendering mode that indicates whether we should draw this letter's strokes, + /// fill, both, neither (in case of hidden text), etc. + /// If it calls for stroking the is used. + /// If it calls for filling, the is used. + /// In modes that perform both filling and stroking, the effect is as if each glyph outline were filled and then stroked in separate operations. + /// + public TextRenderingMode RenderingMode { get; } /// - /// The color of the letter. + /// The primary color of the letter, which is either the in case + /// is , or otherwise + /// it is the . /// public IColor Color { get; } + /// + /// Stroking color + /// + public IColor StrokeColor { get; } + + /// + /// Non-stroking (fill) color + /// + public IColor FillColor { get; } + /// /// The size of the font in points. /// @@ -86,7 +107,9 @@ double width, double fontSize, FontDetails font, - IColor color, + TextRenderingMode renderingMode, + IColor strokeColor, + IColor fillColor, double pointSize, int textSequence) { @@ -97,7 +120,17 @@ Width = width; FontSize = fontSize; Font = font; - Color = color ?? GrayColor.Black; + RenderingMode = renderingMode; + if (renderingMode == TextRenderingMode.Stroke) + { + Color = StrokeColor = strokeColor ?? GrayColor.Black; + FillColor = fillColor; + } + else + { + Color = FillColor = fillColor ?? GrayColor.Black; + StrokeColor = strokeColor; + } PointSize = pointSize; TextSequence = textSequence; TextOrientation = GetTextOrientation(); diff --git a/src/UglyToad.PdfPig/Graphics/ContentStreamProcessor.cs b/src/UglyToad.PdfPig/Graphics/ContentStreamProcessor.cs index 1e5efffd..7759c9cc 100644 --- a/src/UglyToad.PdfPig/Graphics/ContentStreamProcessor.cs +++ b/src/UglyToad.PdfPig/Graphics/ContentStreamProcessor.cs @@ -292,14 +292,7 @@ var transformedPdfBounds = PerformantRectangleTransformer .Transform(renderingMatrix, textMatrix, transformationMatrix, new PdfRectangle(0, 0, boundingBox.Width, 0)); - // If the text rendering mode calls for filling, the current nonstroking color in the graphics state is used; - // if it calls for stroking, the current stroking color is used. - // In modes that perform both filling and stroking, the effect is as if each glyph outline were filled and then stroked in separate operations. - // TODO: expose color as something more advanced - var color = currentState.FontState.TextRenderingMode != TextRenderingMode.Stroke - ? currentState.CurrentNonStrokingColor - : currentState.CurrentStrokingColor; - + Letter letter = null; if (Diacritics.IsInCombiningDiacriticRange(unicode) && bytes.CurrentOffset > 0 && letters.Count > 0) { @@ -319,26 +312,16 @@ attachTo.Width, attachTo.FontSize, attachTo.Font, - attachTo.Color, + attachTo.RenderingMode, + attachTo.StrokeColor, + attachTo.FillColor, attachTo.PointSize, attachTo.TextSequence); } - else - { - letter = new Letter( - unicode, - transformedGlyphBounds, - transformedPdfBounds.BottomLeft, - transformedPdfBounds.BottomRight, - transformedPdfBounds.Width, - fontSize, - font.Details, - color, - pointSize, - textSequence); - } } - else + + // If we did not create a letter for a combined diacritic, create one here. + if (letter == null) { letter = new Letter( unicode, @@ -348,7 +331,9 @@ transformedPdfBounds.Width, fontSize, font.Details, - color, + currentState.FontState.TextRenderingMode, + currentState.CurrentStrokingColor, + currentState.CurrentNonStrokingColor, pointSize, textSequence); } diff --git a/src/UglyToad.PdfPig/Writer/PdfPageBuilder.cs b/src/UglyToad.PdfPig/Writer/PdfPageBuilder.cs index c814f75b..7552a9ac 100644 --- a/src/UglyToad.PdfPig/Writer/PdfPageBuilder.cs +++ b/src/UglyToad.PdfPig/Writer/PdfPageBuilder.cs @@ -895,7 +895,16 @@ var documentSpace = textMatrix.Transform(renderingMatrix.Transform(fontMatrix.Transform(rect))); - var letter = new Letter(c.ToString(), documentSpace, advanceRect.BottomLeft, advanceRect.BottomRight, width, (double)fontSize, FontDetails.GetDefault(name), + var letter = new Letter( + c.ToString(), + documentSpace, + advanceRect.BottomLeft, + advanceRect.BottomRight, + width, + (double)fontSize, + FontDetails.GetDefault(name), + TextRenderingMode.Fill, + GrayColor.Black, GrayColor.Black, (double)fontSize, textSequence);