Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
c19244b
Read jpeg drawings for pdf export.
AdrianEPPlus Aug 18, 2026
27f8f52
#2477 - Fonts: Configurable font embedding policy (fsType / OnFontEmb…
swmal Aug 19, 2026
cc48b5d
Skip embedding decision now falls back to font chain (#2473)
swmal Aug 19, 2026
7b119d2
Layoutint image.
AdrianEPPlus Aug 19, 2026
1aca478
render to pdf.
AdrianEPPlus Aug 19, 2026
9fd57a6
jpegs can now overlap several pages
AdrianEPPlus Aug 20, 2026
9a67e5b
WIP
swmal Aug 20, 2026
94101b2
fixed width issue
AdrianEPPlus Aug 21, 2026
40388a8
support for absolute anchor
AdrianEPPlus Aug 24, 2026
5804d68
Move font subsetting to document-wide DocumentFontSubsetBuilder
swmal Aug 24, 2026
501a2df
Merged from develop9
swmal Aug 24, 2026
9c651be
unhardcoded jpg
AdrianEPPlus Aug 24, 2026
0a86142
Fixed some merge conflicts
swmal Aug 25, 2026
6a9ef16
WIP
karlkallman Aug 25, 2026
159b638
Added png. working on supporting png with alpha
AdrianEPPlus Aug 25, 2026
b694baa
transparent png in pdf progress
AdrianEPPlus Aug 26, 2026
d1a4386
Fix font nameID pairing so Arial Black resolves correctly (#2476)
Aug 26, 2026
ce421c9
png progress
AdrianEPPlus Aug 26, 2026
5031a1f
WIP
karlkallman Aug 26, 2026
69ad648
Keep bundled fallback fonts embeddable when OnFontEmbedding skips
Aug 26, 2026
7061a74
WIP
karlkallman Aug 27, 2026
12a6fb4
WIP
karlkallman Aug 27, 2026
7e9dd12
Added functionality for centered content horiziontally and vertically…
karlkallman Aug 27, 2026
9c63117
Fix for bug #2485
karlkallman Aug 27, 2026
eb88e31
Fixed header footer issue & performance for table style.
AdrianEPPlus Aug 27, 2026
9e6a5e4
Added simple support for distibuter, justify and centered continious …
AdrianEPPlus Aug 27, 2026
51db119
if row height has not bee explicilty set, we do autofit on that row w…
AdrianEPPlus Aug 28, 2026
7412c9a
fixed comments and notes not having header and footer.
AdrianEPPlus Aug 28, 2026
6061b90
Added test
karlkallman Aug 28, 2026
4a54ce8
Changed radial gradients to box gradients.
AdrianEPPlus Aug 28, 2026
4428c35
double border fix progress
AdrianEPPlus Aug 31, 2026
2a0bf9e
double border progress
AdrianEPPlus Aug 31, 2026
6c04f61
progress
AdrianEPPlus Aug 31, 2026
1d5af53
WIP
karlkallman Aug 31, 2026
f4d3c21
WIP
karlkallman Sep 1, 2026
c8cafbc
Fix #2845: infinite loop and off-page content for oversized columns
karlkallman Sep 1, 2026
c3a63bc
double borders done for now.
AdrianEPPlus Sep 1, 2026
cf0e70b
Merge branch 'feature/i2476' into feature/pdf-to-develop9
AdrianEPPlus Sep 1, 2026
b0fc806
Merge branch 'feature/PdfCenterContentOnPage' of https://github.com/e…
AdrianEPPlus Sep 1, 2026
39fc47f
fixed missing fill, content and borders in merged cells.
AdrianEPPlus Sep 2, 2026
ea48e78
Merge branch 'bug/i2485' into feature/pdf-to-develop9
AdrianEPPlus Sep 2, 2026
c9b6b2f
Merge branch 'feature/pdf-to-develop9' into feature/pdf_images
AdrianEPPlus Sep 2, 2026
044ba1d
image in header footer progress.
AdrianEPPlus Sep 2, 2026
55d1363
fixed issue where every other row of table did not get a fill
AdrianEPPlus Sep 2, 2026
0c769e0
fixed image in header footer positioning.
AdrianEPPlus Sep 3, 2026
4ae68ad
Merge branch 'develop9' into feature/pdf_images
AdrianEPPlus Sep 3, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions src/EPPlus.Export.Pdf.Tests/PdfTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -671,6 +671,17 @@ public void TableDiff()
wb.SaveAsPdf(path, ws0);
}

[TestMethod]
public void PictureOutside()
{
using var p = OpenTemplatePackage("Pdf_picture_outside.xlsx");
var wb = p.Workbook;
var ws0 = wb.Worksheets[0];
ws0.PrinterSettings.ShowGridLines = true;
string path = _pdfPath + "PictureOutside.pdf";
wb.SaveAsPdf(path, ws0);
}

[TestMethod]
public void EPPlusToPdf()
{
Expand Down Expand Up @@ -931,5 +942,15 @@ public void GetClampedCellWidth_CellFitsWithinPage_ReturnsCellWidthUnchanged()
Assert.AreEqual(51.71d, PdfLayout.GetClampedCellWidth(s, 126.31d, 51.71d), 0.0001);
}

[TestMethod]
public void LargeTableTest1()
{
using var p = OpenTemplatePackage("BlazorSample1 (12).xlsx");
var ws = p.Workbook.Worksheets[1];
string path = _pdfPath + "LargeTableTest.pdf";
ws.SaveAsPdf(path);
Assert.IsTrue(File.Exists(path), "PDF file was not created.");
AssertLooksLikePdf(File.ReadAllBytes(path));
}
}
}
11 changes: 6 additions & 5 deletions src/EPPlus.Export.Pdf/DocumentObjects/Fonts/PdfCIDFont.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ Date Author Change
*************************************************************************************************
27/11/2025 EPPlus Software AB EPPlus 9
*************************************************************************************************/
using EPPlus.Export.Pdf.Helpers;
using EPPlus.Fonts.OpenType;
using System;
using System.Collections.Generic;
Expand Down Expand Up @@ -63,10 +64,10 @@ internal override string RenderDictionary()
$" /Subtype /{Subtype.ToString()}\n" +
$" /BaseFont /{BaseFont}\n" +
$" /CIDSystemInfo << /Registry ({CIDInfoObject.Registry}) /Ordering ({CIDInfoObject.Ordering}) /Supplement {CIDInfoObject.Supplement} >>\n" +
$" /FontDescriptor {FontDescriptorObjectNumber} 0 R");
$" /FontDescriptor {FontDescriptorObjectNumber.ToPdfStringF0()} 0 R");
if (DW != null)
{
sb.AppendFormat($"\n /DW {DW}");
sb.AppendFormat($"\n /DW {DW.ToPdfStringF0()}");
}
if (Gids != null)
{
Expand Down Expand Up @@ -99,10 +100,10 @@ internal override void RenderDictionary(BinaryWriter bw)
$" /Subtype /{Subtype.ToString()}\n" +
$" /BaseFont /{BaseFont}\n" +
$" /CIDSystemInfo << /Registry ({CIDInfoObject.Registry}) /Ordering ({CIDInfoObject.Ordering}) /Supplement {CIDInfoObject.Supplement} >>\n" +
$" /FontDescriptor {FontDescriptorObjectNumber} 0 R");
$" /FontDescriptor {FontDescriptorObjectNumber.ToPdfStringF0()} 0 R");
if (DW != null)
{
sb.AppendFormat($"\n /DW {DW}");
sb.AppendFormat($"\n /DW {DW.ToPdfStringF0()}");
}
if (Gids != null)
{
Expand Down Expand Up @@ -146,7 +147,7 @@ private string BuildWidthsArray()
i++;
}
sb.Append($"{startGid} [");
sb.Append(string.Join(" ", widths.Select(w => w.ToString()).ToArray()));
sb.Append(string.Join(" ", widths.Select(w => w.ToPdfStringF0()).ToArray()));
sb.Append("] ");
}
return sb.ToString();
Expand Down
6 changes: 3 additions & 3 deletions src/EPPlus.Export.Pdf/DocumentObjects/Fonts/PdfCidSet.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,20 +26,20 @@ public PdfCidSet(int objectNumber, byte[] cidSet , int version = 0) : base(objec

internal override string RenderDictionary()
{
return $"<< /Length {CidSet.Length} >>\n" + $"stream\n|BINARY DATA|\nendstream";
return $"<< /Length {CidSet.Length.ToPdfStringF0()} >>\n" + $"stream\n|BINARY DATA|\nendstream";
}

internal override void RenderDictionary(BinaryWriter bw)
{
var body = PdfFlate.Compress(CidSet);
if (body.Length < CidSet.Length)
{
WriteAscii(bw, $"<< /Filter /FlateDecode /Length {body.Length} >>\nstream\n");
WriteAscii(bw, $"<< /Filter /FlateDecode /Length {body.Length.ToPdfStringF0()} >>\nstream\n");
bw.Write(body);
}
else
{
WriteAscii(bw, $"<< /Length {CidSet.Length} >>\nstream\n");
WriteAscii(bw, $"<< /Length {CidSet.Length.ToPdfStringF0()} >>\nstream\n");
bw.Write(CidSet);
}
WriteAscii(bw, "\nendstream");
Expand Down
17 changes: 9 additions & 8 deletions src/EPPlus.Export.Pdf/DocumentObjects/Fonts/PdfFont.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ Date Author Change
*************************************************************************************************
27/11/2025 EPPlus Software AB EPPlus 9
*************************************************************************************************/
using EPPlus.Export.Pdf.Helpers;
using System.IO;
using System.Text;

Expand Down Expand Up @@ -72,19 +73,19 @@ internal override string RenderDictionary()
}
if (firstChar > -1)
{
sb.AppendFormat($" /FirstChar {firstChar}\n");
sb.AppendFormat($" /FirstChar {firstChar.ToPdfStringF0()}\n");
}
if(lastChar > -1)
{
sb.AppendFormat($" /LastChar {lastChar}\n");
sb.AppendFormat($" /LastChar {lastChar.ToPdfStringF0()}\n");
}
if (widthObjectNumber > -1)
{
sb.AppendFormat($" /Widths {widthObjectNumber } 0 R\n");
sb.AppendFormat($" /Widths {widthObjectNumber.ToPdfStringF0()} 0 R\n");
}
if (fontDescriptorObjectNumber > -1)
{
sb.AppendFormat($" /FontDescriptor {fontDescriptorObjectNumber} 0 R\n");
sb.AppendFormat($" /FontDescriptor {fontDescriptorObjectNumber.ToPdfStringF0()} 0 R\n");
}
sb.AppendFormat($" /Encoding /{encoding} >>");
return sb.ToString();
Expand All @@ -108,19 +109,19 @@ internal override void RenderDictionary(BinaryWriter bw)
}
if (firstChar > -1)
{
sb.AppendFormat($" /FirstChar {firstChar}\n");
sb.AppendFormat($" /FirstChar {firstChar.ToPdfStringF0()}\n");
}
if (lastChar > -1)
{
sb.AppendFormat($" /LastChar {lastChar}\n");
sb.AppendFormat($" /LastChar {lastChar.ToPdfStringF0()}\n");
}
if (widthObjectNumber > -1)
{
sb.AppendFormat($" /Widths {widthObjectNumber} 0 R\n");
sb.AppendFormat($" /Widths {widthObjectNumber.ToPdfStringF0()} 0 R\n");
}
if (fontDescriptorObjectNumber > -1)
{
sb.AppendFormat($" /FontDescriptor {fontDescriptorObjectNumber} 0 R\n");
sb.AppendFormat($" /FontDescriptor {fontDescriptorObjectNumber.ToPdfStringF0()} 0 R\n");
}
sb.AppendFormat($" /Encoding /{encoding} >>");
WriteAscii(bw, sb.ToString());
Expand Down
20 changes: 10 additions & 10 deletions src/EPPlus.Export.Pdf/DocumentObjects/Fonts/PdfFontDescriptor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -69,20 +69,20 @@ internal override string RenderDictionary()
StringBuilder sb = new StringBuilder();
sb.AppendFormat($"<< /Type /FontDescriptor\n" +
$" /FontName /{fontName.Replace(" ", "")}\n" +
$" /Flags {flags}\n" +
$" /Flags {flags.ToPdfStringF0()}\n" +
$" /FontBBox [{fontBBox.X.ToPdfStringF0()} {fontBBox.Y.ToPdfStringF0()} {fontBBox.Width.ToPdfStringF0()} {fontBBox.Height.ToPdfStringF0()}]\n" +
$" /Ascent {ascent}\n" +
$" /Descent {descent}\n" +
$" /CapHeight {capheight}\n" +
$" /ItalicAngle {(int)italicAngle}\n" +
$" /StemV {(int)stemV}");
$" /Ascent {ascent.ToPdfStringF0()}\n" +
$" /Descent {descent.ToPdfStringF0()}\n" +
$" /CapHeight {capheight.ToPdfStringF0()}\n" +
$" /ItalicAngle {((int)italicAngle).ToPdfStringF0()}\n" +
$" /StemV {((int)stemV).ToPdfStringF0()}");
if (CidSetObjectNumber > 0)
{
sb.AppendFormat($"\n /CIDSet {CidSetObjectNumber} 0 R");
sb.AppendFormat($"\n /CIDSet {CidSetObjectNumber.ToPdfStringF0()} 0 R");
}
if (FontFile2ObjectNumber > 0)
{
sb.AppendFormat($"\n /FontFile2 {FontFile2ObjectNumber} 0 R");
sb.AppendFormat($"\n /FontFile2 {FontFile2ObjectNumber.ToPdfStringF0()} 0 R");
}
sb.AppendFormat(" >>");
return sb.ToString();
Expand All @@ -93,7 +93,7 @@ internal override void RenderDictionary(BinaryWriter bw)
StringBuilder sb = new StringBuilder();
sb.AppendFormat($"<< /Type /FontDescriptor\n" +
$" /FontName /{fontName.Replace(" ", "")}\n" +
$" /Flags {flags}\n" +
$" /Flags {flags.ToPdfStringF0()}\n" +
$" /FontBBox [{fontBBox.X.ToPdfStringF0()} {fontBBox.Y.ToPdfStringF0()} {fontBBox.Width.ToPdfStringF0()} {fontBBox.Height.ToPdfStringF0()}]\n" +
$" /Ascent {ascent.ToPdfStringF0()}\n" +
$" /Descent {descent.ToPdfStringF0()}\n" +
Expand All @@ -102,7 +102,7 @@ internal override void RenderDictionary(BinaryWriter bw)
$" /StemV {((int)stemV).ToPdfStringF0()}");
if (FontFile2ObjectNumber > 0)
{
sb.AppendFormat($"\n /FontFile2 {FontFile2ObjectNumber} 0 R");
sb.AppendFormat($"\n /FontFile2 {FontFile2ObjectNumber.ToPdfStringF0()} 0 R");
}
sb.AppendFormat(" >>");
WriteAscii(bw, sb.ToString());
Expand Down
4 changes: 2 additions & 2 deletions src/EPPlus.Export.Pdf/DocumentObjects/Fonts/PdfFontStream.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,14 @@ internal override string RenderDictionary()
{
var fontBytes = FontData.Serialize();
var fontData = Encoding.ASCII.GetString(fontBytes);
return $"<< /Length {fontBytes.Length} /Length1 {fontBytes.Length} >>\n" + $"stream\n|BINARY DATA|\nendstream";
return $"<< /Length {fontBytes.Length.ToPdfStringF0()} /Length1 {fontBytes.Length.ToPdfStringF0()} >>\n" + $"stream\n|BINARY DATA|\nendstream";
}

internal override void RenderDictionary(BinaryWriter bw)
{
var fontBytes = FontData.Serialize();
var body = PdfFlate.Compress(fontBytes);
WriteAscii(bw, $"<< /Filter /FlateDecode /Length {body.Length} /Length1 {fontBytes.Length} >>\nstream\n");
WriteAscii(bw, $"<< /Filter /FlateDecode /Length {body.Length.ToPdfStringF0()} /Length1 {fontBytes.Length.ToPdfStringF0()} >>\nstream\n");
bw.Write(body);
WriteAscii(bw, "\nendstream");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ internal override string RenderDictionary()
var cmapContent = GenerateCMapContent();
var length = Encoding.UTF8.GetByteCount(cmapContent);
var sb = new StringBuilder();
sb.AppendLine(string.Format("<< /Length {0} >>", length));
sb.AppendLine(string.Format("<< /Length {0} >>", length.ToPdfStringF0()));
sb.AppendLine("stream");
sb.Append(cmapContent);
sb.Append("\nendstream");
Expand All @@ -59,7 +59,7 @@ internal override void RenderDictionary(BinaryWriter bw)
var cmapContent = GenerateCMapContent();
var cmapBytes = Encoding.ASCII.GetBytes(cmapContent);
var body = PdfFlate.Compress(cmapBytes);
WriteAscii(bw, $"<< /Filter /FlateDecode /Length {body.Length} >>\nstream\n");
WriteAscii(bw, $"<< /Filter /FlateDecode /Length {body.Length.ToPdfStringF0()} >>\nstream\n");
bw.Write(body);
WriteAscii(bw, "\nendstream");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ Date Author Change
*************************************************************************************************
27/11/2025 EPPlus Software AB EPPlus 9
*************************************************************************************************/
using EPPlus.Export.Pdf.Helpers;
using System.IO;
using System.Linq;
using System.Text;
Expand Down Expand Up @@ -40,10 +41,10 @@ internal override string RenderDictionary()
$" /Subtype /Type0\n" +
$" /BaseFont /{BaseFont}\n" +
$" /Encoding /{Encoding}\n" +
$" /DescendantFonts [{DescendantFontsObjectNumbers} 0 R]");
$" /DescendantFonts [{DescendantFontsObjectNumbers.ToPdfStringF0()} 0 R]");
if (ToUnicodeObjectNumber > 0)
{
sb.AppendFormat($"\n /ToUnicode {ToUnicodeObjectNumber} 0 R");
sb.AppendFormat($"\n /ToUnicode {ToUnicodeObjectNumber.ToPdfStringF0()} 0 R");
}
sb.Append(" >>");
return sb.ToString();
Expand All @@ -57,10 +58,10 @@ internal override void RenderDictionary(BinaryWriter bw)
$" /Subtype /Type0\n" +
$" /BaseFont /{BaseFont}\n" +
$" /Encoding /{Encoding}\n" +
$" /DescendantFonts [{DescendantFontsObjectNumbers} 0 R]");
$" /DescendantFonts [{DescendantFontsObjectNumbers.ToPdfStringF0()} 0 R]");
if (ToUnicodeObjectNumber > 0)
{
sb.AppendFormat($"\n /ToUnicode {ToUnicodeObjectNumber} 0 R");
sb.AppendFormat($"\n /ToUnicode {ToUnicodeObjectNumber.ToPdfStringF0()} 0 R");
}
sb.Append(" >>");
WriteAscii(bw, sb.ToString());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ internal override void RenderDictionary(BinaryWriter bw)
{
var bytes = Encoding.ASCII.GetBytes(_code);
WriteAscii(bw, "<< /FunctionType 4 /Domain [ 0 1 0 1 ] /Range [ 0 1 0 1 0 1 ] " +
$"/Length {bytes.Length} >>\nstream\n");
$"/Length {bytes.Length.ToPdfStringF0()} >>\nstream\n");
bw.Write(bytes);
WriteAscii(bw, "\nendstream");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ internal override string RenderDictionary()
var sb = new StringBuilder();
sb.AppendFormat($"<< /Type /Pattern\n" +
$" /PatternType 2\n" +
$" /Shading {shadingObjectNumber} 0 R");
$" /Shading {shadingObjectNumber.ToPdfStringF0()} 0 R");
if (Matrix != null)
{
var matrixStr = string.Join(" ", Matrix.Select(w => w.ToPdfStringF4()).ToArray());
Expand All @@ -49,7 +49,7 @@ internal override void RenderDictionary(BinaryWriter bw)
var sb = new StringBuilder();
sb.AppendFormat($"<< /Type /Pattern\n" +
$" /PatternType 2\n" +
$" /Shading {shadingObjectNumber} 0 R");
$" /Shading {shadingObjectNumber.ToPdfStringF0()} 0 R");
if (Matrix != null)
{
var matrixStr = string.Join(" ", Matrix.Select(w => w.ToPdfStringF4()).ToArray());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ internal override string RenderDictionary()
{
var streamContent = fill.CreatePatternResource();
var bytes = Encoding.ASCII.GetBytes(streamContent);
sb.AppendFormat($"\n /Length {bytes.Length}");
sb.AppendFormat($"\n /Length {bytes.Length.ToPdfStringF0()}");
sb.Append(" >>");
sb.AppendFormat($"\nstream\n{streamContent}\nendstream");
}
Expand Down Expand Up @@ -86,7 +86,7 @@ internal override void RenderDictionary(BinaryWriter bw)
{
var streamContent = fill.CreatePatternResource();
var body = PdfFlate.Compress(Encoding.ASCII.GetBytes(streamContent));
sb.AppendFormat($"\n /Filter /FlateDecode /Length {body.Length}");
sb.AppendFormat($"\n /Filter /FlateDecode /Length {body.Length.ToPdfStringF0()}");
sb.Append(" >>");
WriteAscii(bw, sb.ToString());
WriteAscii(bw, "\nstream\n");
Expand Down
5 changes: 3 additions & 2 deletions src/EPPlus.Export.Pdf/DocumentObjects/PdfCatalog.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ Date Author Change
*************************************************************************************************
10/07/2025 EPPlus Software AB EPPlus.Fonts.OpenType 1.0
*************************************************************************************************/
using EPPlus.Export.Pdf.Helpers;
using System.IO;

namespace EPPlus.Export.Pdf.DocumentObjects
Expand All @@ -27,13 +28,13 @@ public PdfCatalog(int objectNumber, int pagesObjectNumber, int version = 0)
internal override string RenderDictionary()
{
return $"<< /Type /Catalog\n" +
$" /Pages {pagesObjectNumber} 0 R >>";
$" /Pages {pagesObjectNumber.ToPdfStringF0()} 0 R >>";
}

internal override void RenderDictionary(BinaryWriter bw)
{
WriteAscii(bw, $"<< /Type /Catalog\n" +
$" /Pages {pagesObjectNumber} 0 R >>");
$" /Pages {pagesObjectNumber.ToPdfStringF0()} 0 R >>");
}
}
}
13 changes: 11 additions & 2 deletions src/EPPlus.Export.Pdf/DocumentObjects/PdfContentStream.cs
Original file line number Diff line number Diff line change
Expand Up @@ -312,6 +312,15 @@ public void AddInnerGridLines(Transform pageLayout)
commands.Add($"% Gridlines End");
}

public void AddImage(string label, double x, double y, double width, double height)
{
commands.Add($"% Image Start: {label}");
commands.Add("q");
commands.Add($"{width.ToPdfString()} 0 0 {height.ToPdfString()} {x.ToPdfString()} {y.ToPdfString()} cm");
commands.Add($"/{label} Do");
commands.Add("Q");
commands.Add($"% Image End: {label}");
}
public void AddPrintTitleGridLines(Transform pageLayout)
{
if (pageLayout is not PdfPageLayout pl) return;
Expand Down Expand Up @@ -398,14 +407,14 @@ internal override string RenderDictionary()
{
var content = string.Join("\n", commands.ToArray()) + "\n";
var bytes = Encoding.ASCII.GetBytes(content);
return $"<< /Length {bytes.Length} >>\n" + $"stream\n{content}endstream";
return $"<< /Length {bytes.Length.ToPdfStringF0()} >>\n" + $"stream\n{content}endstream";
}

internal override void RenderDictionary(BinaryWriter bw)
{
var content = string.Join("\n", commands.ToArray()) + "\n";
var body = PdfFlate.Compress(Encoding.ASCII.GetBytes(content));
WriteAscii(bw, $"<< /Filter /FlateDecode /Length {body.Length} >>\nstream\n");
WriteAscii(bw, $"<< /Filter /FlateDecode /Length {body.Length.ToPdfStringF0()} >>\nstream\n");
bw.Write(body);
WriteAscii(bw, "\nendstream");
}
Expand Down
Loading
Loading