diff --git a/QRCoder/PdfByteQRCode.cs b/QRCoder/PdfByteQRCode.cs
index d534051e..84b7833f 100644
--- a/QRCoder/PdfByteQRCode.cs
+++ b/QRCoder/PdfByteQRCode.cs
@@ -174,7 +174,7 @@ public byte[] GetGraphic(int pixelsPerModule, string darkColorHtmlHex, string li
///
/// Creates a PDF path with rectangles for all dark modules in the QR code.
- /// Each dark module becomes a 1x1 rectangle in the path.
+ /// Uses Run-Length Encoding (RLE) to combine adjoining dark modules in each row into single rectangles.
///
/// PDF path commands as a string.
private string CreatePathFromModules()
@@ -185,14 +185,31 @@ private string CreatePathFromModules()
for (int y = 0; y < size; y++)
{
- for (int x = 0; x < size; x++)
+ int x = 0;
+ while (x < size)
{
- if (matrix[y][x])
+ // Skip light modules
+ if (!matrix[y][x])
{
- // Create a 1x1 rectangle for each dark module using the 're' (rectangle) operator
- // Format: x y width height re
- pathCommands.Append(ToStr(x) + " " + ToStr(y) + " 1 1 re\r\n");
+ x++;
+ continue;
}
+
+ // Found a dark module - find the run length
+ int startX = x;
+ while (x < size && matrix[y][x])
+ {
+ x++;
+ }
+
+ // Create a single rectangle for the entire run of dark modules
+ // Format: x y width height re
+ pathCommands.Append(ToStr(startX));
+ pathCommands.Append(' ');
+ pathCommands.Append(ToStr(y));
+ pathCommands.Append(' ');
+ pathCommands.Append(ToStr(x - startX));
+ pathCommands.Append(" 1 re\r\n");
}
}
diff --git a/QRCoderTests/PdfByteQRCodeRendererTests.can_render_pdfbyte_qrcode_blackwhite.approved.pdf b/QRCoderTests/PdfByteQRCodeRendererTests.can_render_pdfbyte_qrcode_blackwhite.approved.pdf
index 0913aec7..fde095c8 100644
Binary files a/QRCoderTests/PdfByteQRCodeRendererTests.can_render_pdfbyte_qrcode_blackwhite.approved.pdf and b/QRCoderTests/PdfByteQRCodeRendererTests.can_render_pdfbyte_qrcode_blackwhite.approved.pdf differ
diff --git a/QRCoderTests/PdfByteQRCodeRendererTests.can_render_pdfbyte_qrcode_color.approved.pdf b/QRCoderTests/PdfByteQRCodeRendererTests.can_render_pdfbyte_qrcode_color.approved.pdf
index 36bb806b..54874db3 100644
Binary files a/QRCoderTests/PdfByteQRCodeRendererTests.can_render_pdfbyte_qrcode_color.approved.pdf and b/QRCoderTests/PdfByteQRCodeRendererTests.can_render_pdfbyte_qrcode_color.approved.pdf differ
diff --git a/QRCoderTests/PdfByteQRCodeRendererTests.can_render_pdfbyte_qrcode_custom_dpi.approved.pdf b/QRCoderTests/PdfByteQRCodeRendererTests.can_render_pdfbyte_qrcode_custom_dpi.approved.pdf
index c18d645e..1012c199 100644
Binary files a/QRCoderTests/PdfByteQRCodeRendererTests.can_render_pdfbyte_qrcode_custom_dpi.approved.pdf and b/QRCoderTests/PdfByteQRCodeRendererTests.can_render_pdfbyte_qrcode_custom_dpi.approved.pdf differ
diff --git a/QRCoderTests/PdfByteQRCodeRendererTests.can_render_pdfbyte_qrcode_from_helper.approved.pdf b/QRCoderTests/PdfByteQRCodeRendererTests.can_render_pdfbyte_qrcode_from_helper.approved.pdf
index a18c06c9..f70a6e13 100644
Binary files a/QRCoderTests/PdfByteQRCodeRendererTests.can_render_pdfbyte_qrcode_from_helper.approved.pdf and b/QRCoderTests/PdfByteQRCodeRendererTests.can_render_pdfbyte_qrcode_from_helper.approved.pdf differ
diff --git a/QRCoderTests/PdfByteQRCodeRendererTests.can_render_pdfbyte_qrcode_from_helper_2.approved.pdf b/QRCoderTests/PdfByteQRCodeRendererTests.can_render_pdfbyte_qrcode_from_helper_2.approved.pdf
index 36bb806b..54874db3 100644
Binary files a/QRCoderTests/PdfByteQRCodeRendererTests.can_render_pdfbyte_qrcode_from_helper_2.approved.pdf and b/QRCoderTests/PdfByteQRCodeRendererTests.can_render_pdfbyte_qrcode_from_helper_2.approved.pdf differ
diff --git a/QRCoderTests/TransposeVerificationTests.pdf_renderer.approved.pdf b/QRCoderTests/TransposeVerificationTests.pdf_renderer.approved.pdf
index 51acbf02..085c1a5b 100644
Binary files a/QRCoderTests/TransposeVerificationTests.pdf_renderer.approved.pdf and b/QRCoderTests/TransposeVerificationTests.pdf_renderer.approved.pdf differ