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