using iText.IO.Image; using iText.Kernel.Geom; using iText.Kernel.Pdf; using iText.Kernel.Pdf.Annot; using iText.Kernel.Pdf.Canvas; using iText.Layout; using iText.Layout.Element; using Newtonsoft.Json; using Org.BouncyCastle.Utilities.IO; using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; public class Program { public static string IDTFTool = Directory.GetParent(Assembly.GetExecutingAssembly().Location) + @"\\IDTFTool\\IDTFConverter.exe"; static void Main(string[] args) { GeneratePDF(args[0], args[1], args[2]); } public static void GenerateU3D(string idtf, string u3d) { System.Diagnostics.Process exep = new System.Diagnostics.Process(); System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(); startInfo.FileName = IDTFTool; startInfo.Arguments = $"-input \"{idtf}\" -output \"{u3d}\""; startInfo.CreateNoWindow = true; startInfo.UseShellExecute = false; exep.StartInfo = startInfo; exep.Start(); exep.WaitForExit(); } public static void GeneratePDF(string idtf, string view, string pdf) { var u3d = System.IO.Path.GetRandomFileName(); GenerateU3D(idtf, u3d); var writer = new PdfWriter(pdf); PdfDocument pdfDoc = new PdfDocument(writer); var size = PageSize.A4; Document doc = new Document(pdfDoc); var views = Generate3DView(view); PdfStream stream3D = new PdfStream(pdfDoc, new FileStream(u3d, FileMode.Open)); stream3D.Put(PdfName.Type, new PdfName("3D")); stream3D.Put(PdfName.Subtype, new PdfName("U3D")); stream3D.Put(new PdfName("VA"), new PdfArray(views.ToArray())); stream3D.SetCompressionLevel(CompressionConstants.DEFAULT_COMPRESSION); stream3D.Flush(); Rectangle rect = new Rectangle(50, 50, size.GetWidth() - 100, size.GetHeight() - 100); Pdf3DAnnotation annot = new Pdf3DAnnotation(rect, stream3D); annot.SetContents(new PdfString("3D Model")); annot.Put(PdfName._3DV, PdfName.L);//default view var page = pdfDoc.AddNewPage(size).SetRotation(90); page.AddAnnotation(annot); //logo ImageData imageData = ImageDataFactory.Create(System.IO.Directory.GetParent(Assembly.GetExecutingAssembly().Location) + "\\logo.png"); Image image = new Image(imageData); image.SetHeight(25); image.SetMarginLeft(-20); image.SetMarginTop(-20); image.SetRotationAngle(Math.PI / 2); doc.Add(image); // 关闭文档 pdfDoc.Close(); doc.Close(); } private static List Generate3DView(string view) { List list = new List(); string viewStr = File.ReadAllText(view); var views = JsonConvert.DeserializeObject>(viewStr); foreach (var item in views) { if (item.Parents.Any()) { PdfDictionary dict3D = new PdfDictionary(); dict3D.Put(PdfName.Type, new PdfName("3DView")); dict3D.Put(new PdfName("XN"), new PdfString(item.Name)); dict3D.Put(new PdfName("IN"), new PdfString(item.Name)); dict3D.Put(new PdfName("RM"), RenderMode()); dict3D.Put(new PdfName("LS"), RenderLight()); dict3D.Put(new PdfName("MS"), PdfName.M); dict3D.Put(new PdfName("C2W"), new PdfArray(new double[] { item.Parents[0].Transform.c0r0, item.Parents[0].Transform.c0r1, item.Parents[0].Transform.c0r2, item.Parents[0].Transform.c1r0, item.Parents[0].Transform.c1r1, item.Parents[0].Transform.c1r2, item.Parents[0].Transform.c2r0, item.Parents[0].Transform.c2r1, item.Parents[0].Transform.c2r2, item.Parents[0].Transform.c3r0, item.Parents[0].Transform.c3r1, item.Parents[0].Transform.c3r2 })); dict3D.Put(new PdfName("C2W"), new PdfArray(new double[] { item.Parents[0].Transform.c0r0, item.Parents[0].Transform.c1r0, item.Parents[0].Transform.c2r0, item.Parents[0].Transform.c0r1, item.Parents[0].Transform.c1r1, item.Parents[0].Transform.c2r1, item.Parents[0].Transform.c0r2, item.Parents[0].Transform.c1r2, item.Parents[0].Transform.c2r2, item.Parents[0].Transform.c3r0, item.Parents[0].Transform.c3r1, item.Parents[0].Transform.c3r2 })); dict3D.Flush(); list.Add(dict3D); } } return list; } private static PdfDictionary RenderMode() { PdfDictionary dict3D = new PdfDictionary(); dict3D.Put(PdfName.Type, new PdfName("3DRenderMode")); dict3D.Put(PdfName.Subtype, new PdfName("SolidOutline")); return dict3D; } private static PdfDictionary RenderLight() { PdfDictionary dict3D = new PdfDictionary(); dict3D.Put(PdfName.Type, new PdfName("3DLightingScheme")); dict3D.Put(PdfName.Subtype, new PdfName("Day")); return dict3D; } }