Skip to content

Commit 8201ef1

Browse files
committed
add clipping rectangles
1 parent 8ffd8a4 commit 8201ef1

File tree

4 files changed

+80
-2
lines changed

4 files changed

+80
-2
lines changed

src/IxMilia.Pdf.Test/IxMilia.Pdf.Test.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<PropertyGroup>
44
<OutputType>Exe</OutputType>
55
<TargetFramework>net8.0</TargetFramework>
6-
<LangVersion>10</LangVersion>
6+
<LangVersion>11</LangVersion>
77
<Nullable>enable</Nullable>
88
</PropertyGroup>
99

src/IxMilia.Pdf.Test/PdfWriterTests.cs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -532,5 +532,55 @@ 400.00 0.00 0.00 400.00 100.00 100.00 cm
532532
";
533533
AssertPageContains(page, expectedImageData);
534534
}
535+
536+
[Fact]
537+
public void ClipTest()
538+
{
539+
var path = new PdfPath();
540+
var builder = new PdfPathBuilder()
541+
{
542+
new PdfLine(
543+
new PdfPoint(PdfMeasurement.Zero, PageHeight / 2.0), // left middle
544+
new PdfPoint(PageWidth / 2.0, PageHeight)), // top middle
545+
new PdfLine(
546+
new PdfPoint(PageWidth / 2.0, PageHeight), // top middle
547+
new PdfPoint(PageWidth, PageHeight / 2.0)), // right middle
548+
new PdfLine(
549+
new PdfPoint(PageWidth, PageHeight / 2.0), // right middle
550+
new PdfPoint(PageWidth / 2.0, PdfMeasurement.Zero)), // bottom middle
551+
new PdfLine(
552+
new PdfPoint(PageWidth / 2.0, PdfMeasurement.Zero), // bottom middle
553+
new PdfPoint(PdfMeasurement.Zero, PageHeight / 2.0)), // left middle
554+
};
555+
556+
path.Commands.Add(new PdfClip(
557+
new PdfMeasurement(0.25, PdfMeasurementType.Inch),
558+
new PdfMeasurement(0.25, PdfMeasurementType.Inch),
559+
PageWidth - new PdfMeasurement(0.5, PdfMeasurementType.Inch),
560+
PageHeight - new PdfMeasurement(0.5, PdfMeasurementType.Inch)));
561+
path.Commands.AddRange(builder.ToPath().Commands);
562+
563+
var page = PdfPage.NewLetter();
564+
page.Items.Add(path);
565+
var file = new PdfFile();
566+
file.Pages.Add(page);
567+
568+
// first 4 lines are the clipping rectable; remaining are the lines
569+
AssertPageContains(page, """
570+
n
571+
18.00 18.00 576.00 756.00 re
572+
W
573+
n
574+
0.00 396.00 m
575+
306.00 792.00 l
576+
306.00 792.00 m
577+
612.00 396.00 l
578+
612.00 396.00 m
579+
306.00 0.00 l
580+
306.00 0.00 m
581+
0.00 396.00 l
582+
S
583+
""");
584+
}
535585
}
536586
}

src/IxMilia.Pdf/PdfClip.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
using IxMilia.Pdf.Extensions;
2+
3+
namespace IxMilia.Pdf
4+
{
5+
public class PdfClip : PdfPathCommand
6+
{
7+
public PdfMeasurement X { get; set; }
8+
public PdfMeasurement Y { get; set; }
9+
public PdfMeasurement Width { get; set; }
10+
public PdfMeasurement Height { get; set; }
11+
12+
public PdfClip(PdfMeasurement x, PdfMeasurement y, PdfMeasurement width, PdfMeasurement height)
13+
{
14+
X = x;
15+
Y = y;
16+
Width = width;
17+
Height = height;
18+
}
19+
20+
internal override void Write(PdfStreamWriter writer)
21+
{
22+
writer.WriteLine("n"); // end previous path
23+
writer.WriteLine($"{X.AsPoints().AsFixed()} {Y.AsPoints().AsFixed()} {Width.AsPoints().AsFixed()} {Height.AsPoints().AsFixed()} re");
24+
writer.WriteLine("W"); // clip
25+
writer.WriteLine("n"); // end this path
26+
}
27+
}
28+
}

src/IxMilia.Pdf/PdfPath.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ namespace IxMilia.Pdf
44
{
55
public class PdfPath : PdfStreamItem
66
{
7-
public IList<PdfPathCommand> Commands { get; } = new List<PdfPathCommand>();
7+
public List<PdfPathCommand> Commands { get; } = new List<PdfPathCommand>();
88

99
internal override void Write(PdfStreamWriter writer)
1010
{

0 commit comments

Comments
 (0)