如何使用带有C#的itext7将u3d添加到现有的pdf中

时间:2017-07-12 14:05:16

标签: c# .net pdf itext7 u3d

我正在使用iText7(C#)来创建pdf。我需要在exing pdf中添加一张u3d图片。我可以找到示例(http://developers.itextpdf.com/examples/itext-action-second-edition/chapter-16#619-pdf3d.java),但它是java。任何人都可以帮我在.net C#上给我一个例子吗?

5 个答案:

答案 0 :(得分:2)

链接示例适用于iText5,而非iText7。 在iText7中,这个例子看起来像这样

  public static final String DEST = "./target/test/resources/book/part4/chapter16/Listing_16_16_Pdf3D.pdf";
    public static String RESOURCE = "./src/test/resources/img/teapot.u3d";

    public static void main(String args[]) throws Exception {
        new Listing_16_16_Pdf3D().manipulatePdf(DEST);
    }

    public void manipulatePdf(String dest) throws Exception {
        PdfDocument pdfDoc = new PdfDocument(new PdfWriter(dest));

        Document doc = new Document(pdfDoc);
        Rectangle rect = new Rectangle(100, 400, 400, 400);

        PdfStream stream3D = new PdfStream(pdfDoc, new FileInputStream(RESOURCE));
        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);
        pdfDoc.addNewPage().addAnnotation(annot);
        doc.close();
    }

或者,如果你想在C#中使用它(避免在本地运行它,但是visual studio并没有抱怨语法)

    public void manipulatePdf(String dest) {
        PdfDocument pdfDoc = new PdfDocument(new PdfWriter(dest));

        Document doc = new Document(pdfDoc);
        Rectangle rect = new Rectangle(100, 400, 400, 400);

        PdfStream stream3D = new PdfStream(pdfDoc, new FileInputStream(RESOURCE));
        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);
        pdfDoc.AddNewPage().AddAnnotation(annot);
        doc.Close();
    }

答案 1 :(得分:0)

.net的iText代码库被设计成一个(几乎)精确的java镜像。

除了代码约定(例如以大写字母开头的方法名称)之外,您应该能够在.net中使用java代码。

这也解释了为什么我们通常不发布.net的代码。 我建议您只需复制/粘贴java代码,更改方法名称以考虑代码约定,并尝试编译它。

如果有的话,它会给你一个代码样本,你可以在这里发帖,让你发帖更合理。

答案 2 :(得分:0)

这是使用c#将u3d文件打印为pdf的工作代码

FileStream stream = new FileStream("E:\\Testingfolder\\u3dpdf\\DoctoPdf.pdf", FileMode.Open, FileAccess.Read);
        String RESOURCE;
        RESOURCE = "E:\\Testingfolder\\u3dpdf\\Testu3d.u3d";

        iTextSharp.text.Rectangle rect;
        using (iTextSharp.text.Document document = new iTextSharp.text.Document())
        {
            PdfWriter pdfwriter = PdfWriter.GetInstance(document, stream);

            // step 3
            document.Open();
            // step 4
            rect = new iTextSharp.text.Rectangle(100, 400, 500, 800);
            rect.Border = iTextSharp.text.Rectangle.BOX;
            rect.BorderWidth = 0.5f;
            rect.BorderColor = new BaseColor(0xFF, 0x00, 0x00);
            document.Add(rect);
            document.SetMargins(129,259,647,1416);
            PdfIndirectObject streamObject = null;
            using (FileStream fs =
                new FileStream(RESOURCE, FileMode.Open, FileAccess.Read))
            {
                PdfStream stream3D = new PdfStream(fs, pdfwriter);

                stream3D.Put(PdfName.TYPE, new PdfName("3D"));
                stream3D.Put(PdfName.SUBTYPE, new PdfName("U3D"));
                stream3D.FlateCompress();
                streamObject = pdfwriter.AddToBody(stream3D);
                stream3D.WriteLength();
            }
            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));

            PdfIndirectObject dictObject = pdfwriter.AddToBody(dict3D);


            PdfAnnotation annot = new PdfAnnotation(pdfwriter, rect);
            annot.Put(PdfName.CONTENTS, new PdfString("3D Model"));
            annot.Put(PdfName.SUBTYPE, new PdfName("3D"));
            annot.Put(PdfName.TYPE, PdfName.ANNOT);
            annot.Put(new PdfName("3DD"), streamObject.IndirectReference);
            annot.Put(new PdfName("3DV"), dictObject.IndirectReference);
            PdfAppearance ap = pdfwriter.DirectContent.CreateAppearance(
                rect.Width, rect.Height
            );
            annot.SetAppearance(PdfAnnotation.APPEARANCE_NORMAL, ap);
            annot.SetPage();

            pdfwriter.AddAnnotation(annot);

        }

答案 3 :(得分:0)

您也可以在使用spirepdf的c#中尝试以下代码

//步骤1:初始化PdfDocuemnt的新对象,并将空白页添加到PDF文档中。

        PdfDocument doc = new PdfDocument();
        PdfPageBase page = doc.Pages.Add();
        //Step 2: Draw a rectangle on the page to define the canvas area for the 3D file.


        Rectangle rt = new Rectangle(0, 80, 200, 200);
        //Step 3: Initialize a new object of Pdf3DAnnotation, load the.u3d file as 3D annotation.


        Pdf3DAnnotation annotation = new Pdf3DAnnotation(rt, "E:\\Testingfolder\\u3dpdf\\BRO_JR_6910K Femur - Bone Model.stl");
        annotation.Activation = new Pdf3DActivation();
        annotation.Activation.ActivationMode = Pdf3DActivationMode.PageOpen;
        //Step 4: Define a 3D view mode.

        Pdf3DView View = new Pdf3DView();
        View.Background = new Pdf3DBackground(new PdfRGBColor());
        View.ViewNodeName = "test";
        View.RenderMode = new Pdf3DRendermode(Pdf3DRenderStyle.Solid);
        View.InternalName = "test";
        View.LightingScheme = new Pdf3DLighting();
        View.LightingScheme.Style = Pdf3DLightingStyle.Day;
        //Step 5: Set the 3D view mode for the annotation.


        annotation.Views.Add(View);
        //Step 6: Add the annotation to PDF.

        page.AnnotationsWidget.Add(annotation);
        //Step 7: Save the file.

        doc.SaveToFile("E:\\Testingfolder\\u3dpdf\\Create3DPdf.pdf", FileFormat.PDF);

答案 4 :(得分:-2)

你的问题得到解决了吗?如果没有,您可能也对这个替代解决方案感兴趣 - 使用C#中的Spire.PDF将3D交互式图形嵌入到PDF文档中。

PdfDocument doc = new PdfDocument();
PdfPageBase page = doc.Pages.Add();

Rectangle rt = new Rectangle(0, 80, 200, 200); 
Pdf3DAnnotation annotation = new Pdf3DAnnotation(rt, "teapot.u3d");
annotation.Activation = new Pdf3DActivation();
annotation.Activation.ActivationMode = Pdf3DActivationMode.PageOpen; 
Pdf3DView View= new Pdf3DView();
View.Background = new Pdf3DBackground(new PdfRGBColor(Color.Purple));
View.ViewNodeName = "test";
View.RenderMode = new Pdf3DRendermode(Pdf3DRenderStyle.Solid);
View.InternalName = "test";
View.LightingScheme = new Pdf3DLighting();
View.LightingScheme.Style = Pdf3DLightingStyle.Day;
annotation.Views.Add(View);

page.AnnotationsWidget.Add(annotation);
doc.SaveToFile("Create3DPdf.pdf", FileFormat.PDF);