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 System;
using System.Diagnostics;
using System.IO;
using System.Reflection;

public class Program
{
    public static string IDTFTool = Directory.GetParent(Assembly.GetExecutingAssembly().Location) + @"\\IDTFTool\\IDTFConverter.exe";

    static void Main(string[] args)
    {
        GenerateU3D(args[0], args[1]);
    }
    public static void GenerateU3D(string idtf, string pdf)
    {
        var temp = System.IO.Path.GetTempFileName();
        System.Diagnostics.Process exep = new System.Diagnostics.Process();
        System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
        startInfo.FileName = IDTFTool;
        startInfo.Arguments = $"-input \"{idtf}\" -output \"{temp}\"";
        startInfo.CreateNoWindow = true;
        startInfo.UseShellExecute = false;
        exep.StartInfo = startInfo;
        exep.Start();
        exep.WaitForExit();
        GeneratePDF(temp, pdf);

    }

    public static void GeneratePDF(string u3d, string pdf)
    {
        var writer = new PdfWriter(pdf);
        PdfDocument pdfDoc = new PdfDocument(writer);
        var size = PageSize.A4;

        Document doc = new Document(pdfDoc);
        Rectangle rect = new Rectangle(50, 50, size.GetWidth() - 100, size.GetHeight() - 100);

        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.SetCompressionLevel(CompressionConstants.DEFAULT_COMPRESSION);
        stream3D.Flush();

        PdfDictionary dict3D = new PdfDictionary();
        dict3D.Put(PdfName.Type, new PdfName("3DView"));
        dict3D.Put(new PdfName("XN"), new PdfString("Default"));
        dict3D.Put(new PdfName("IN"), new PdfString("Unnamed"));
        dict3D.Put(new PdfName("MS"), PdfName.M);
        dict3D.Put(new PdfName("C2W"),
                new PdfArray(new float[] { 1, 0, 0, 0, 0, -1, 0, 1, 0, 3, -235, 28 }));
        dict3D.Put(PdfName.CO, new PdfNumber(235));

        Pdf3DAnnotation annot = new Pdf3DAnnotation(rect, stream3D);
        annot.SetContents(new PdfString("3D Model"));
        annot.SetDefaultInitialView(dict3D);
        var page = pdfDoc.AddNewPage(size).SetRotation(90);
        page.AddAnnotation(annot);
        PdfCanvas canvas = new PdfCanvas(page);

        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();
    }
}
