Java Mailing List Archive

http://www.junlu.com/

Home » Home (12/2007) » iText »

Re: [iText-questions] 3D PDF and JavaScript

Paulo Soares

2007-06-13


Have a look at the Add3D plugin in the toolbox.

Paulo

----- Original Message -----
From: <AHeckmeier@(protected)>
To: <itext-questions@(protected)>
Sent: Tuesday, June 12, 2007 8:02 AM
Subject: [iText-questions] 3D PDF and JavaScript


> Hello,
>
> I have a strange behaviour with iText.
>
> I've added a 3d modell programmatically with iText (see code below).
> When I add the JavaScript with Acrobat, I get the JavaScript message "host
> is undefined".
>
> If I add the 3D modell and script manually, it works fine ...
>
> An example pdf can be found on
> http://www.bct-technology.com/fileadmin/pdf/bct_report/example.pdf (1.9
> MB)
> The upper model was added with iText, the lower manually.
> If you select a part, the partname should be shown in the textfield.
>
> Any clue? Thanks in advance!
>
> Toni
>
>
> (PS: how to add the JavaScript pro)
>
>
>
>
> Here is the java code of iText:
> (Based on the code of Paulo)
>
> public class PDF3DObject extends PdfAnnotation
> {
>   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"; // Transformation
> matrix (optional)
>   public static final String PDF_NAME_IN = "IN"; // internal name of the
> view (optional)
>   public static final String PDF_NAME_MS = "MS"; //
>   public static final String PDF_NAME_XN = "XN"; // The external name of
> the view (required)
>
>   public static final String PDF_NAME_U3D = "U3D";
>   public static final String PDF_NAME_U3DPATH = "U3DPath";
>   public static final String PDF_NAME_ONINSTANTIATE = "OnInstantiate";
>
>
>   public PDF3DObject(PdfStamper stamper, File u3dFile, Rectangle
> rectangle, int page)
>   {
>     super(stamper.getWriter(), rectangle);
>
>     try
>     {
>        PdfWriter writer = stamper.getWriter();
>
>        PdfIndirectReference streamRef;
>        PdfIndirectObject objRef;
>
>        PdfContentByte cb = stamper.getOverContent(page);
>
>        // Create stream to carry attachment
>        FileInputStream fistrm = new FileInputStream(u3dFile);
>        PdfStream stream = new PdfStream(fistrm, writer);
>
>        // Mandatory keys
>        stream.put(PdfName.TYPE, new PdfName(PDF_NAME_3D));
>        stream.put(PdfName.SUBTYPE, new PdfName(PDF_NAME_U3D));
>        stream.flateCompress();
>
>        // Write stream contents, get reference to stream object,
> write actual stream length
>        streamRef = writer.addToBody(stream,
> false).getIndirectReference();
>        stream.writeLength();
>
>
> /* JavaScript Stream
>        FileInputStream jsFiStream = new FileInputStream(new
> File("C:\\TEMP\\_techdoc\\SelectPart1.js"));
>        PdfStream jsStream = new PdfStream(jsFiStream, writer);
>        jsStream.flateCompress();
>        jsStream.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("DefaultView"));
>        dict.put(new PdfName(PDF_NAME_IN), new PdfString("Unnamed"));
>
>        dict.put(new PdfName(PDF3DObject.PDF_NAME_MS), new
> PdfName(PDF3DObject.PDF_NAME_U3D));
>
>        // NOTE: The initial release of Acrobat 7.0 does not correctly
> display the default view in the U3D data.
>        //     This behavior is expected to be corrected in future
> releases and hence.
>        dict.put(new PdfName(PDF3DObject.PDF_NAME_U3DPATH), new
> PdfString("DefaultView"));
>
>        // Manual camera
>        // States that we have to provide camera-to-world coordinate
> transformation
>        // dict.put(new PdfName(PDF_NAME_MS), PdfName.M);
>        // dict.put(new PdfName(PDF_NAME_C2W), new PdfArray(new
> float[] {1, 0, 0, 0, 0, -1, 0, 1, 0, 3, -235, 28F}));
>
>        // Camera distance along z-axis
>        // dict.put(PdfName.CO, new PdfNumber(235));
>
> //        dict.put(new PdfName(PDF_NAME_ONINSTANTIATE), jsStream);
>
>        // Write view dictionary, get reference
>        objRef = writer.addToBody(dict, false);
>
>        //
>        // Create appearance
>        PdfAppearance ap = cb.createAppearance(rectangle.getWidth(),
> rectangle.getHeight());
>        ap.setBoundingBox(rectangle);
>
>        put(PdfName.CONTENTS, new PdfString("3D Model"));
>
>        // Mandatory keys
>        put(PdfName.TYPE, PdfName.ANNOT);
>        put(PdfName.SUBTYPE, new PdfName(PDF_NAME_3D));
>
>        // Reference to stream object
>        put(new PdfName(PDF_NAME_3DD), streamRef);
>
>        // Reference to view dictionary object
>        put(new PdfName(PDF_NAME_3DV), objRef.getIndirectReference());
>
>        // Assign appearance and page
>        setAppearance(PdfAnnotation.APPEARANCE_NORMAL, ap);
>
>     }
>     catch (IOException ex)
>     {
>        Debug.error("Internal Error: ", ex);
>     }
>   }
> }
>
>
>
>
>
> And the Java Script
>
>
>
> var mouseDragged = true;
> var selectedMesh = null;
>
> //------------------------------------------------------------------------------
> // function used by the Mouse Event Handler
> //------------------------------------------------------------------------------
>
> myMouseHandlingFunction = function( event )
> {
> if( event.isMouseDown )
>   mouseDragged = false;
>
> //-----------------------------------------------
> // mouse UP
> //-----------------------------------------------
> if ( event.isMouseUp )
> {
>   var clickedMesh = null;
>   if(event.hits.length > 0)
>   {
>    clickedMesh = event.hits[0].target;
>   }
>
>   if(selectedMesh == clickedMesh || mouseDragged)
>    return;
>
>   if (selectedMesh != null)
>    if(clickedMesh != null)
>    {
>     host.getField("TeilMouseDown").value = clickedMesh.name;
>    }
>    else
>    {
>     host.getField("TeilMouseDown").value = "";
>    }
>
>   selectedMesh = clickedMesh.name;
> }
>
> if ( event.isMouseMove )
>   mouseDragged = true;
> }
>
> var mouseEventHandler = new MouseEventHandler();
> mouseEventHandler.onMouseDown = true;
> mouseEventHandler.onMouseMove = true;
> mouseEventHandler.onMouseUp = true;
> mouseEventHandler.onEvent = myMouseHandlingFunction;
> runtime.addEventHandler( mouseEventHandler );


-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
iText-questions mailing list
iText-questions@(protected)
https://lists.sourceforge.net/lists/listinfo/itext-questions
Buy the iText book: http://itext.ugent.be/itext-in-action/
©2008 junlu.com - Jax Systems, LLC, U.S.A.