----------------------------------------
> Date: Wed, 3 Mar 2010 23:17:47 -0800
> From: [email protected]
> To: [email protected]
> Subject: [iText-questions] Integration a 3D CAD drawing into a PDF
>
>
> Hello,
>
> I'm a rookie in iText and Java and need some help. I try to integrate a 3D
> CAD drawing into a PDF. The code you can see below. Unfortunatly shows the
> artwork from the bottom view. I don't undertstand the impact of the
> parameters to the view. Is there any description with examples how to use
> the iText solving that problem? Could anybody help me with that problem?
I was hoping Leonard would have replied to this- didn't you post this same thing
the other day? In fact, I think when claimed that PDF is just a bunch of pixels,
he pointed me to an example in which a PDF contained a 3D model of something.
I thought he may explain how you could put the model, not a 2D view, into the
PDF...
>
> Thank you in advance!
>
> Julia
>
> package com.lowagie.toolbox.plugins;
>
> import java.io.*;
>
> import javax.swing.*;
>
> import com.lowagie.text.*;
> import com.lowagie.text.pdf.*;
> import com.lowagie.toolbox.AbstractTool;
> import com.lowagie.toolbox.arguments.*;
> import com.lowagie.toolbox.arguments.filters.PdfFilter;
> import com.lowagie.toolbox.arguments.filters.U3DFilter;
>
> import java.net.*;
>
> /**
> * This tool lets you add a embedded u3d 3d annotation to the first page of
> a document. Look for
> * sample files at
> http://u3d.svn.sourceforge.net/viewvc/u3d/trunk/Source/Samples/Data/
> * @since 2.1.1 (imported from itexttoolbox project)
> */
> public class Add3D extends AbstractTool {
> static {
> addVersion("$Id: Add3D.java 3373 2008-05-12 16:21:24Z xlv $");
> }
>
> FileArgument destfile = null;
> public static final String PDF_NAME_3D = "3D";
> public static final String PDF_NAME_3DD = "3DD";
> public static final String PDF_NAME_3DV = "3DV";
> public static final String PDF_NAME_3DVIEW = "3DView";
> public static final String PDF_NAME_C2W = "C2W";
> public static final String PDF_NAME_IN = "IN";
> public static final String PDF_NAME_MS = "MS";
> public static final String PDF_NAME_U3D = "U3D";
> public static final String PDF_NAME_XN = "XN";
>
> /**
> * This tool lets you add a embedded u3d 3d annotation to the first page
> of a document.
> */
> public Add3D() {
> super();
> menuoptions = MENU_EXECUTE | MENU_EXECUTE_SHOW;
> FileArgument inputfile = new FileArgument(this, "srcfile",
> "The file you want to add
> the u3d File", false,
> new PdfFilter());
> arguments.add(inputfile);
> FileArgument u3dinputfile = new FileArgument(this, "srcu3dfile",
> "The u3d file you want to add", false,
> new U3DFilter());
> arguments.add(u3dinputfile);
> StringArgument pagenumber = new StringArgument(this, "pagenumber",
> "The pagenumber where to add the u3d
> annotation");
> pagenumber.setValue("1");
> arguments.add(pagenumber);
> destfile = new FileArgument(this, "destfile",
> "The file that contains the u3d
> annotation after processing",
> true, new PdfFilter());
> arguments.add(destfile);
> inputfile.addPropertyChangeListener(destfile);
> }
>
> /**
> * Creates the internal frame.
> *
> */
> protected void createFrame() {
> internalFrame = new JInternalFrame("Add3D", true, true, true);
> internalFrame.setSize(300, 80);
> internalFrame.setJMenuBar(getMenubar());
> System.out.println("=== Add3D OPENED ===");
> }
>
> /**
> * Executes the tool (in most cases this generates a PDF file).
> *
> */
> public void execute() {
> try {
> if (getValue("srcfile") == null) {
> throw new InstantiationException(
> "You need to choose a sourcefile");
> }
> if (getValue("srcu3dfile") == null) {
> throw new InstantiationException(
> "You need to choose a u3d file");
> }
> if (getValue("destfile") == null) {
> throw new InstantiationException(
> "You need to choose a destination file");
> }
> int pagenumber = Integer.parseInt( (String)
> getValue("pagenumber"));
> // Create 3D annotation
> // Required definitions
> PdfIndirectReference streamRef;
> PdfIndirectObject objRef;
> PdfReader reader = new PdfReader(((File) getValue("srcfile"))
> .getAbsolutePath());
>
> String u3dFileName = ((File) getValue("srcu3dfile"))
> .getAbsolutePath();
> PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(
> (File) getValue("destfile")));
>
> /*Add Infos to HashMap
> HashMap info = reader.getInfo();
> info.put("Author", "infolox");
> stamp.setMoreInfo(info);
> stamp.insertPage(reader.getNumberOfPages(),
> reader.getPageSize(pagenumber));*/
> PdfWriter wr = stamp.getWriter();
> PdfContentByte cb = stamp.getUnderContent(pagenumber);
> Rectangle rectori = reader.getCropBox(pagenumber);
> /*Rectangle rect = new Rectangle(new Rectangle(100,
> rectori.getHeight() - 550, rectori.getWidth() - 100,
> rectori.getHeight() - 150));
> */
> Rectangle rect = new Rectangle(new Rectangle(55,
> rectori.getHeight() - 675, rectori.getWidth() - 55,
> rectori.getHeight() - 175));
>
> PdfStream oni = new PdfStream(PdfEncodings.convertToBytes(
> "runtime.setCurrentTool(\"Rotate\");", null));
> oni.flateCompress();
>
> // Create stream to carry attachment
> PdfStream stream = new PdfStream(new
> FileInputStream(u3dFileName),
> wr);
> stream.put(new PdfName("OnInstantiate"),
> wr.addToBody(oni).getIndirectReference());
> stream.put(PdfName.TYPE, new PdfName(PDF_NAME_3D)); // Mandatory
> keys
> stream.put(PdfName.SUBTYPE, new PdfName(PDF_NAME_U3D));
> stream.flateCompress();
>
> streamRef = wr.addToBody(stream).getIndirectReference(); //
> Write stream contents, get reference to stream object, write actual stream
> length
> stream.writeLength();
>
> // Create 3D view dictionary
> // PDF documentation states that this can be left out, but
> without normally we will just get a blank 3D image because of wrong
> coordinate space transformations, etc.
> // Instead of providing camera-to-world transformation here, we
> could also reference view in U3D file itself (would be U3DPath key instead
> of C2W key, U3D value instead of M value for MS key), but i haven't tried up
> to now
> // We could also provide an activation dictionary (defining
> activation behavior), and field-of-view for P entry if needed
> PdfDictionary dict = new PdfDictionary(new
> PdfName(PDF_NAME_3DVIEW));
>
> dict.put(new PdfName(PDF_NAME_XN), new PdfString("Default"));
> dict.put(new PdfName(PDF_NAME_IN), new PdfString("Unnamed"));
> dict.put(new PdfName(PDF_NAME_MS), PdfName.M); // States that we
> have to provide camera-to-world coordinate transformation
> dict.put(new PdfName(PDF_NAME_C2W),
> new PdfArray(new float[] {0.5F, 0, 0, 0, 0.5F, 0, 0, 0,
> 0.5F, -0.2F, +0.1F, -2})); // 3d transformation matrix (demo for teapot)
> //new PdfArray(new float[] {1, 0, 0, 0, 0, -1, 0, 1, 0,
> 3,-235, 28F})); // 3d transformation matrix (demo for teapot)
> //new PdfArray(new float[] {0.1F, -0.06F, -0.07F, 0.33F, -0.2F,
> -0.23F, -0.4F, 0.23F, 0.27F, -0.22F, 0.13F, 0.15F})); // 3d transformation
> matrix (demo for teapot)
> //new PdfArray(new float[] {0, 0, 0, 0, 0, 0, 0, 0, 1, -0.2F,
> +0.1F, -2})); // 3d transformation matrix (demo for teapot)
> dict.put(PdfName.CO, new PdfNumber(235)); // Camera distance
> along z-axis (demo for teapot)
>
> objRef = wr.addToBody(dict); // Write view dictionary, get
> reference
>
> // Create appearance
> PdfAppearance ap = cb.createAppearance(rect.getRight() -
> rect.getLeft(),
> rect.getTop() - rect.getBottom());
>
> ap.setBoundingBox(rect);
>
> // Create annotation with reference to stream
> PdfAnnotation annot = new PdfAnnotation(wr, rect);
>
> annot.put(PdfName.CONTENTS, new PdfString("3D Model"));
> annot.put(PdfName.SUBTYPE, new PdfName(PDF_NAME_3D)); //
> Mandatory keys
> annot.put(PdfName.TYPE, PdfName.ANNOT);
> annot.put(new PdfName(PDF_NAME_3DD), streamRef); // Reference to
> stream object
> annot.put(new PdfName(PDF_NAME_3DV),
> objRef.getIndirectReference()); // Reference to view dictionary object
> annot.put(new PdfName("3DI"), PdfBoolean.PDFFALSE);
>
> PdfDictionary adi = new PdfDictionary();
> adi.put(PdfName.A, new PdfName("PO"));
> adi.put(new PdfName("DIS"), PdfName.I);
> annot.put(new PdfName("3DA"), adi);
>
> annot.setAppearance(PdfAnnotation.APPEARANCE_NORMAL, ap);//
> Assign appearance and page
> annot.setPage();
>
> // Actually write annotation
> stamp.addAnnotation(annot, pagenumber);
> AddButton(100, 100, "Rotate",
> "im =
> this.getAnnots3D(0)[0].context3D;\rim.runtime.setCurrentTool(\"Rotate\");",
> "rotate.png", wr);
> AddButton(150, 100, "Pan",
> "im =
> this.getAnnots3D(0)[0].context3D;\rim.runtime.setCurrentTool(\"Pan\");",
> "translate.png", wr);
> AddButton(200, 100, "Zoom",
> "im =
> this.getAnnots3D(0)[0].context3D;\rim.runtime.setCurrentTool(\"Zoom\");",
> "zoom.png", wr);
> stamp.close();
> } catch (Exception e) {
> JOptionPane.showMessageDialog(internalFrame, e.getMessage(), e
> .getClass().getName(),
> JOptionPane.ERROR_MESSAGE);
> System.err.println(e.getMessage());
> }
> }
>
> public static void AddButton(float x, float y, String fname, String js,
> String image, PdfWriter wr) {
> try {
> // URL url=Add3D.class.getResource(
> // image);
> // PdfFileSpecification
> fs=PdfFileSpecification.fileEmbedded(wr,image,image,null);
> // wr.addAnnotation(PdfAnnotation.createScreen(wr,new
> Rectangle(x, y, x + img.plainWidth(),
> // y + img.plainHeight())));
> Image img = Image.getInstance(image);
> PushbuttonField bt = new PushbuttonField(wr,
> new Rectangle(x, y, x + img.getPlainWidth(),
> y + img.getPlainHeight()), fname);
> bt.setLayout(PushbuttonField.LAYOUT_ICON_ONLY);
> bt.setImage(img);
> PdfFormField ff = bt.getField();
> PdfAction ac = PdfAction.javaScript(js, wr);
> ff.setAction(ac);
> wr.addAnnotation(ff);
> } catch (MalformedURLException ex) {
> } catch (IOException ex) {
> } catch (BadElementException ex) {
> } catch (DocumentException ex) {
> }
> }
>
> /**
> * Gets the PDF file that should be generated (or null if the output
> isn't a
> * PDF file).
> *
> * @return the PDF file that should be generated
> * @throws InstantiationException
> */
> protected File getDestPathPDF() throws InstantiationException {
> return (File) getValue("destfile");
> }
>
> /**
> * Indicates that the value of an argument has changed.
> *
> * @param arg
> * the argument that has changed
> */
> public void valueHasChanged(AbstractArgument arg) {
> if (internalFrame == null) {
> // if the internal frame is null, the tool was called from the
> // command line
> return;
> }
> if (destfile.getValue() == null &&
> arg.getName().equalsIgnoreCase("srcfile")) {
> String filename = arg.getValue().toString();
> String filenameout = filename.substring(0, filename.indexOf(".",
> filename.length() - 4)) + "_out.pdf";
> destfile.setValue(filenameout);
> }
> }
>
> /**
> * This methods helps you running this tool as a standalone application.
> * @param args the srcfile and destfile
> */
> public static void main(String[] args) {
> Add3D add3d = new Add3D();
> //String[] arg = {"input.pdf", "test.U3D", "1", "output.pdf"};
> //add3d.setMainArguments(arg);
> if (args.length != 4) {
> System.err.println(add3d.getUsage());
> }
> add3d.setMainArguments(args);
> add3d.execute();
> }
> }
> --
> View this message in context:
> http://old.nabble.com/Integration-a-3D-CAD-drawing-into-a-PDF-tp27777552p27777552.html
> Sent from the iText - General mailing list archive at Nabble.com.
>
>
> ------------------------------------------------------------------------------
> Download IntelĀ® Parallel Studio Eval
> Try the new software tools for yourself. Speed compiling, find bugs
> proactively, and fine-tune applications for parallel performance.
> See why Intel Parallel Studio got high marks during beta.
> http://p.sf.net/sfu/intel-sw-dev
> _______________________________________________
> iText-questions mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/itext-questions
>
> Buy the iText book: http://www.1t3xt.com/docs/book.php
> Check the site with examples before you ask questions:
> http://www.1t3xt.info/examples/
> You can also search the keywords list: http://1t3xt.info/tutorials/keywords/
_________________________________________________________________
Hotmail: Free, trusted and rich email service.
http://clk.atdmt.com/GBL/go/201469228/direct/01/
------------------------------------------------------------------------------
Download Intel® Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
iText-questions mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/itext-questions
Buy the iText book: http://www.1t3xt.com/docs/book.php
Check the site with examples before you ask questions:
http://www.1t3xt.info/examples/
You can also search the keywords list: http://1t3xt.info/tutorials/keywords/