如何使用带有 C# 的 itext7 将 u3d 添加到现有 pdf 中
How to add u3d into existing pdf using itext7 with C#
我正在使用 iText7 (C#) 创建 pdf。我需要将 u3d 图片添加到现有的 pdf 中。我可以找到示例 (http://developers.itextpdf.com/examples/itext-action-second-edition/chapter-16#619-pdf3d.java),但它是 java 一个。谁能帮我举个 .net C# 的例子?
.net 的 iText 代码库被设计成(几乎)与 java 完全相同的镜像。
除了代码约定(例如以大写字母开头的方法名称)之外,您应该能够在 .net 中使用 java 代码。
这也解释了为什么我们通常不 post .net 的代码。
我建议您简单地 copy/paste java 代码,更改方法名称以说明代码约定,然后尝试编译它。
如果有的话,它会给你一个代码示例,你可以在这里 post 让你 post 更明智。
链接示例适用于 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();
}
你的问题解决了吗?如果没有,您可能也对这个替代解决方案感兴趣 - 在 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);
这是使用 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);
}
您也可以在 c# 中尝试以下代码,它使用的是 spire pdf
//第一步:初始化一个新的Pdf Document对象,并在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);
我正在使用 iText7 (C#) 创建 pdf。我需要将 u3d 图片添加到现有的 pdf 中。我可以找到示例 (http://developers.itextpdf.com/examples/itext-action-second-edition/chapter-16#619-pdf3d.java),但它是 java 一个。谁能帮我举个 .net C# 的例子?
.net 的 iText 代码库被设计成(几乎)与 java 完全相同的镜像。
除了代码约定(例如以大写字母开头的方法名称)之外,您应该能够在 .net 中使用 java 代码。
这也解释了为什么我们通常不 post .net 的代码。 我建议您简单地 copy/paste java 代码,更改方法名称以说明代码约定,然后尝试编译它。
如果有的话,它会给你一个代码示例,你可以在这里 post 让你 post 更明智。
链接示例适用于 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();
}
你的问题解决了吗?如果没有,您可能也对这个替代解决方案感兴趣 - 在 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);
这是使用 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);
}
您也可以在 c# 中尝试以下代码,它使用的是 spire pdf
//第一步:初始化一个新的Pdf Document对象,并在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);