public void VerifyPageTextAndFontTest() { var file = new PdfFile(); var page = PdfPage.NewLetter(); var text = new PdfText("foo", new PdfFontType1(PdfFontType1Type.Helvetica), PdfMeasurement.Points(12.0), new PdfPoint(PdfMeasurement.Inches(1.0), PdfMeasurement.Inches(2.0))); page.Items.Add(text); file.Pages.Add(page); AssertFileContains(file, @" BT /F1 12.00 Tf 72.00 144.00 Td [(foo)] TJ ET "); AssertFileContains(file, @" /Resources <</Font <</F1 5 0 R>>>> "); AssertFileContains(file, "<</Type /Font /Subtype /Type1 /BaseFont /Helvetica>>"); text.CharacterWidth = PdfMeasurement.Points(0.25); AssertFileContains(file, @" BT /F1 12.00 Tf 72.00 144.00 Td 0.25 Tc [(foo)] TJ ET "); }
private static IEnumerable <IPdfPathItem> ConvertPoint(DxfModelPoint point, DxfLayer layer, Matrix4 affine, Matrix4 scale) { var p = affine.Transform(point.Location).ToPdfPoint(PdfMeasurementType.Point); var thickness = scale.Transform(new Vector(point.Thickness, 0, 0)).ToPdfPoint(PdfMeasurementType.Point).X; if (thickness.RawValue < 1) { thickness = PdfMeasurement.Points(1); } // TODO fill circle? For now fake it via stroke thickness. var pdfStreamState = new PdfStreamState( strokeColor: GetPdfColor(point, layer), strokeWidth: thickness); yield return(new PdfCircle(p, thickness / 2, pdfStreamState)); }
/// <summary> /// Creates a PDF destination rectangle from the given DXF rectangle and keeps the aspect ratio. /// Optionally, a <paramref name="margin"/> can be defined. /// </summary> /// <param name="srcRect">The DXF source rectangle.</param> /// <param name="maxWidth">The maximum width of the PDF output including <paramref name="margin"/>.</param> /// <param name="maxHeight">The maximum height of the PDF output including <paramref name="margin"/>.</param> /// <param name="margin">[optional] The margin.</param> /// <returns>The PDF destination rectangle.</returns> public static ConverterPdfRect KeepAspectRatio(ConverterDxfRect srcRect, PdfMeasurement maxWidth, PdfMeasurement maxHeight, PdfMeasurement margin = default(PdfMeasurement)) { double maxWidthPts = maxWidth.AsPoints(); double maxHeightPts = maxHeight.AsPoints(); double marginPts = margin.AsPoints(); double scaleX = (maxWidthPts - 2 * marginPts) / srcRect.Width; double scaleY = (maxHeightPts - 2 * marginPts) / srcRect.Height; double scale = Math.Min(scaleX, scaleY); PdfMeasurement left = margin; PdfMeasurement right = PdfMeasurement.Points(marginPts + scale * srcRect.Width); PdfMeasurement bottom = margin; PdfMeasurement top = PdfMeasurement.Points(marginPts + scale * srcRect.Height); return(new ConverterPdfRect(left, right, bottom, top)); }
public void VerifyFillTest() { var builder = new PdfPathBuilder() { new PdfLine( new PdfPoint(PdfMeasurement.Points(0.0), PdfMeasurement.Points(0.0)), new PdfPoint(PdfMeasurement.Points(1.0), PdfMeasurement.Points(1.0))), new PdfLine( new PdfPoint(PdfMeasurement.Points(2.0), PdfMeasurement.Points(2.0)), new PdfPoint(PdfMeasurement.Points(3.0), PdfMeasurement.Points(3.0)), state: new PdfStreamState(strokeWidth: PdfMeasurement.Points(1.1))), new PdfLine( new PdfPoint(PdfMeasurement.Points(4.0), PdfMeasurement.Points(4.0)), new PdfPoint(PdfMeasurement.Points(5.0), PdfMeasurement.Points(5.0)), state: new PdfStreamState(nonStrokeColor: new PdfColor(1.0, 0.0, 0.0))), new PdfLine( new PdfPoint(PdfMeasurement.Points(6.0), PdfMeasurement.Points(6.0)), new PdfPoint(PdfMeasurement.Points(7.0), PdfMeasurement.Points(7.0)), state: new PdfStreamState(nonStrokeColor: new PdfColor(0.0, 1.0, 0.0), strokeWidth: PdfMeasurement.Points(2.2))) }; AssertPathBuilderContains(builder, @" 0 w 0 0 0 RG 0 0 0 rg 0.00 0.00 m 1.00 1.00 l S 1.1 w 2.00 2.00 m 3.00 3.00 l S 0 w 1 0 0 rg 4.00 4.00 m 5.00 5.00 l S 2.2 w 0 1 0 rg 6.00 6.00 m 7.00 7.00 l S "); }
public void AspectRatioIsKept(int maxWidth, int maxHeight) { ConverterDxfRect src = new ConverterDxfRect(0, 5, 0, 5); PdfMeasurement pdfMaxWidth = PdfMeasurement.Points(maxWidth); PdfMeasurement pdfMaxHeight = PdfMeasurement.Points(maxHeight); ConverterPdfRect sut = ConverterPdfRect.KeepAspectRatio(src, pdfMaxWidth, pdfMaxHeight); Assert.True(sut.Width.AsPoints() <= maxWidth); Assert.True(sut.Height.AsPoints() <= maxHeight); Assert.Equal(src.Width, src.Height); // otherwise test below is wrong if (maxWidth > maxHeight) { Assert.Equal(pdfMaxHeight, sut.Height); } else { Assert.Equal(pdfMaxWidth, sut.Width); } }
public void VerifyFontsAreReusedTest() { var file = new PdfFile(); var page = PdfPage.NewLetter(); var font = new PdfFontType1(PdfFontType1Type.Helvetica); // font used twice on one page page.Items.Add(new PdfText("foo", font, PdfMeasurement.Points(12.0), new PdfPoint())); page.Items.Add(new PdfText("foo", font, PdfMeasurement.Points(12.0), new PdfPoint())); file.Pages.Add(page); // font used a third time on another page page = PdfPage.NewLetter(); page.Items.Add(new PdfText("foo", font, PdfMeasurement.Points(12.0), new PdfPoint())); file.Pages.Add(page); // font objects should only be listed once AssertFileContains(file, "/Resources <</Font <</F1 5 0 R>>>>"); AssertFileDoesNotContain(file, "/Resources <</Font <</F1 5 0 R>> /Font <</F1 5 0 R>>"); // duplicate font resource object AssertFileDoesNotContain(file, "/Resources <</Font <</F1 5 0 R>> /Font <</F2 6 0 R>>"); // duplicate font resource AssertFileContainsCount(file, "<</Type /Font /Subtype /Type1 /BaseFont /Helvetica>>", 1); }
public void SourceDestinationTransformTest() { var dxf = new DxfFile(); // line from (2,2) to (3,3) dxf.Entities.Add(new DxfLine(new DxfPoint(2, 2, 0), new DxfPoint(3, 3, 0))); var options = new DxfToPdfConverterOptions(PdfMeasurement.Mm(210), PdfMeasurement.Mm(297), new ConverterDxfRect(2, 3, 2, 3), new ConverterPdfRect(PdfMeasurement.Points(100), PdfMeasurement.Points(200), PdfMeasurement.Points(300), PdfMeasurement.Points(400))); var pdf = ConvertToString(dxf, options); // expected line from (100,300)pt to (200,400)pt var expected = NormalizeCrLf(@" stream 0 w 0 0 0 RG 0 0 0 rg 100.00 300.00 m 200.00 400.00 l S endstream".Trim()); Assert.Contains(expected, pdf); }
private static PdfMeasurement GetStrokeWidth(DxfEntity entity, DxfLayer layer) { // TODO many entities have a Thickness property (which is often zero). DxfLineWeight lw = new DxfLineWeight { Value = entity.LineweightEnumValue }; DxfLineWeightType type = lw.LineWeightType; if (type == DxfLineWeightType.ByLayer) { lw = layer.LineWeight; } if (lw.Value == 0) { return(default(PdfMeasurement)); } if (lw.Value < 0) { return(PdfMeasurement.Points(1)); // smallest valid stroke width } // TODO What is the meaning of this short? Some default app-dependent table? DXF spec doesn't tell. // QCad 1mm => lw.Value==100 return(PdfMeasurement.Mm(lw.Value / 100.0)); }
public void VerifyStreamFilterTest() { var page = new PdfPage(PdfMeasurement.Inches(8.5), PdfMeasurement.Inches(11.0), new ASCIIHexEncoder()); var text = new PdfText("foo", new PdfFontType1(PdfFontType1Type.Helvetica), PdfMeasurement.Points(12.0), new PdfPoint(PdfMeasurement.Inches(1.0), PdfMeasurement.Inches(1.0))); page.Items.Add(text); var expected = @" <</Length 185 /Filter [/ASCIIHexDecode] >> stream 3020770D0A30203020302052470D0A30203020302072670D0A42540D0A202020202F46312031322E30302054660D0A2020202037322E30302037322E30302054 640D0A202020205B28666F6F295D20544A0D0A45540D0A530D0A> endstream endobj "; AssertPageContains(page, expected); }
public void VerifyFontsAreAddedOnSaveTest() { var file = new PdfFile(); var page = PdfPage.NewLetter(); var text = new PdfText("foo", new PdfFontType1(PdfFontType1Type.Helvetica), PdfMeasurement.Points(12.0), new PdfPoint()); page.Items.Add(text); file.Pages.Add(page); Assert.Equal(0, file.Fonts.Count); using (var ms = new MemoryStream()) { file.Save(ms); } Assert.True(ReferenceEquals(text.Font, file.Fonts.Single())); }
public void StringEscapeSequencesTest() { var page = PdfPage.NewLetter(); var text = new PdfText(@"outer (inner \backslash) after", new PdfFontType1(PdfFontType1Type.Helvetica), PdfMeasurement.Points(12.0), new PdfPoint()); page.Items.Add(text); AssertPageContains(page, @"[(outer \(inner \\backslash\) after)] TJ"); }
public void RawPointsNoopTest() { var m = PdfMeasurement.Points(42.0); Assert.Equal(42.0, m.AsPoints()); }