示例#1
0
        public void EqualityTest()
        {
            var oneInch1 = PdfMeasurement.Inches(1.0);
            var oneInch2 = PdfMeasurement.Mm(25.4);

            Assert.Equal(oneInch1, oneInch2);
        }
示例#2
0
        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
");
        }
示例#3
0
        public void ConvertTest()
        {
            var oneInch = PdfMeasurement.Inches(1.0);

            Assert.Equal(72.0, oneInch.AsPoints());
            Assert.Equal(25.4, oneInch.ConvertTo(PdfMeasurementType.Mm).RawValue);
        }
示例#4
0
 public ConverterPdfRect()
 {
     Left   = PdfMeasurement.Zero;
     Right  = PdfMeasurement.Zero;
     Bottom = PdfMeasurement.Zero;
     Top    = PdfMeasurement.Zero;
 }
示例#5
0
 public DxfToPdfConverterOptions(PdfMeasurement pageWidth, PdfMeasurement pageHeight, double scale)
 {
     PageWidth           = pageWidth;
     PageHeight          = pageHeight;
     Scale               = scale;
     this.DxfSource      = null;
     this.PdfDestination = null;
 }
示例#6
0
 public DxfToPdfConverterOptions(PdfMeasurement pageWidth, PdfMeasurement pageHeight, ConverterDxfRect?dxfSource, ConverterPdfRect pdfDestination)
 {
     PageWidth           = pageWidth;
     PageHeight          = pageHeight;
     Scale               = 1d;
     this.DxfSource      = dxfSource ?? throw new ArgumentNullException(nameof(dxfSource));
     this.PdfDestination = pdfDestination ?? throw new ArgumentNullException(nameof(pdfDestination));
 }
示例#7
0
        public void BinaryOperatorTest()
        {
            var oneInch1 = PdfMeasurement.Inches(1.0);
            var oneInch2 = PdfMeasurement.Mm(25.4);

            Assert.Equal(2.0, (oneInch1 + oneInch2).RawValue);
            Assert.Equal(50.8, (oneInch2 + oneInch1).RawValue);
        }
示例#8
0
        private static string ConvertToString(DxfFile dxf, PdfMeasurement?pageWidth = null, PdfMeasurement?pageHeight = null, double scale = 1.0)
        {
            var options = new DxfToPdfConverterOptions(
                pageWidth ?? PdfMeasurement.Inches(8.5),
                pageHeight ?? PdfMeasurement.Inches(11.0),
                scale);

            return(ConvertToString(dxf, options));
        }
示例#9
0
        public (double scaleA, double scaleB) GetUnitAdjustedScale(DrawingSettings drawingSettings)
        {
            var drawingUnits      = drawingSettings.UnitFormat == UnitFormat.Architectural ? PdfMeasurementType.Inch : PdfMeasurementType.Mm;
            var scaleAValue       = DrawingSettings.TryParseUnits(ScaleA, out var parsedScaleA) ? parsedScaleA : 1.0;
            var scaleBValue       = DrawingSettings.TryParseUnits(ScaleB, out var parsedScaleB) ? parsedScaleB : 1.0;
            var scaleAMeasurement = new PdfMeasurement(scaleAValue, drawingUnits);

            return(scaleAMeasurement.ConvertTo(PdfMeasurementType.Point).RawValue, scaleBValue);
        }
示例#10
0
        private static PdfText ConvertText(DxfText text, DxfLayer layer, Matrix4 affine, Matrix4 scale)
        {
            // TODO horizontal and vertical justification (manual calculation for PDF, measure text?)
            // TODO Thickness, Rotation, TextStyleName, SecondAlignmentPoint
            // TODO IsTextUpsideDown, IsTextBackwards
            // TODO RelativeXScaleFactor
            // TODO TextHeight unit? Same as other scale?
            // TODO TextStyleName probably maps to something meaningfull (bold, italic, etc?)
            PdfMeasurement fontSize = scale.Transform(new Vector(0, text.TextHeight, 0))
                                      .ToPdfPoint(PdfMeasurementType.Point).Y;
            PdfPoint location       = affine.Transform(text.Location).ToPdfPoint(PdfMeasurementType.Point);
            var      pdfStreamState = new PdfStreamState(GetPdfColor(text, layer));

            return(new PdfText(text.Value, Font, fontSize, location, pdfStreamState));
        }
示例#11
0
 public ConverterPdfRect(PdfMeasurement left, PdfMeasurement right, PdfMeasurement bottom, PdfMeasurement top)
 {
     if (left.AsPoints() >= right.AsPoints())
     {
         throw new ArgumentOutOfRangeException(nameof(left), left, "left >= right");
     }
     if (bottom.AsPoints() >= top.AsPoints())
     {
         throw new ArgumentOutOfRangeException(nameof(bottom), bottom, "bottom >= top (PDF 'bottom' is zero)");
     }
     this.Left   = left;
     this.Right  = right;
     this.Bottom = bottom;
     this.Top    = top;
 }
示例#12
0
        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));
        }
示例#13
0
        /// <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));
        }
示例#14
0
        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
");
        }
示例#15
0
        public void VerifyGraphicsStreamTest()
        {
            var page = new PdfPage(PdfMeasurement.Inches(8.5), PdfMeasurement.Inches(11.0));

            var width       = 100;
            var height      = 100;
            var bpp         = 3;
            var imageBytes  = new byte[width * height * bpp]; // 0 is fine for this
            var imageObject = new PdfImageObject(width, height, PdfColorSpace.DeviceRGB, 8, imageBytes, new ASCIIHexEncoder());
            var xScale      = 400;
            var yScale      = 400;
            var xOffset     = 100;
            var yOffset     = 100;
            var transform   = PdfMatrix.ScaleThenTranslate(xScale, yScale, xOffset, yOffset);
            var imageItem   = new PdfImageItem(imageObject, transform);

            page.Items.Add(imageItem);

            // placement of image
            var expectedStream = @"
q
  400.00 0.00 0.00 400.00 100.00 100.00 cm
  /Im5 Do
Q
";

            AssertPageContains(page, expectedStream);

            // raw image data
            var expectedImageData = @"
<</Type /XObject
  /Subtype /Image
  /Width 100
  /Height 100
  /ColorSpace /DeviceRGB
  /BitsPerComponent 8
  /Length 60939
  /Filter [/ASCIIHexDecode]>>
stream
";

            AssertPageContains(page, expectedImageData);
        }
示例#16
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 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);
            }
        }
示例#18
0
        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);
        }
示例#19
0
        public override async Task Plot(Drawing drawing, ViewPort viewPort, Stream outputStream, Func <string, Task <byte[]> > contentResolver)
        {
            var converter    = new DxfToPdfConverter();
            var fileSettings = new DxfFileSettings()
            {
                FileVersion = DxfFileVersion.R2004,
            };
            var dxfFile       = DxfFileHandler.ToDxfFile(drawing, viewPort, fileSettings);
            var pageWidth     = new PdfMeasurement(ViewModel.DisplayWidth, ViewModel.DisplayUnit);
            var pageHeight    = new PdfMeasurement(ViewModel.DisplayHeight, ViewModel.DisplayUnit);
            var plotViewPort  = ViewModel.ViewPort;
            var viewPortWidth = ViewModel.DisplayWidth / ViewModel.DisplayHeight * plotViewPort.ViewHeight;
            var dxfRect       = new ConverterDxfRect(plotViewPort.BottomLeft.X, plotViewPort.BottomLeft.X + viewPortWidth, plotViewPort.BottomLeft.Y, plotViewPort.BottomLeft.Y + plotViewPort.ViewHeight);
            var pdfRect       = new ConverterPdfRect(
                new PdfMeasurement(0.0, ViewModel.DisplayUnit),
                new PdfMeasurement(ViewModel.DisplayWidth, ViewModel.DisplayUnit),
                new PdfMeasurement(0.0, ViewModel.DisplayUnit),
                new PdfMeasurement(ViewModel.DisplayHeight, ViewModel.DisplayUnit));
            var options = new DxfToPdfConverterOptions(pageWidth, pageHeight, dxfRect, pdfRect, contentResolver: contentResolver);
            var pdfFile = await converter.Convert(dxfFile, options);

            pdfFile.Save(outputStream);
        }
示例#20
0
        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);
        }
示例#21
0
        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));
        }
示例#22
0
 public PdfArc(PdfPoint center, PdfMeasurement radius, double startAngle, double endAngle, PdfStreamState state = default(PdfStreamState))
     : base(center, radius, radius, startAngle: startAngle, endAngle: endAngle, state: state)
 {
 }
示例#23
0
        public void RawPointsNoopTest()
        {
            var m = PdfMeasurement.Points(42.0);

            Assert.Equal(42.0, m.AsPoints());
        }
示例#24
0
        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");
        }
示例#25
0
        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()));
        }
示例#26
0
 public PdfStreamState(PdfColor?nonStrokeColor = null, PdfColor?strokeColor = null, PdfMeasurement?strokeWidth = null)
 {
     NonStrokeColor = nonStrokeColor ?? default(PdfColor);
     StrokeColor    = strokeColor ?? default(PdfColor);
     StrokeWidth    = strokeWidth ?? default(PdfMeasurement);
 }