Index: pdfbox/src/test/java/org/apache/pdfbox/pdmodel/common/TestEmbeddedFiles.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>ISO-8859-1
===================================================================
--- pdfbox/src/test/java/org/apache/pdfbox/pdmodel/common/TestEmbeddedFiles.java	(revision 1604843)
+++ pdfbox/src/test/java/org/apache/pdfbox/pdmodel/common/TestEmbeddedFiles.java	(revision )
@@ -16,8 +16,7 @@
  */
 package org.apache.pdfbox.pdmodel.common;
 
-import java.io.IOException;
-
+import junit.framework.TestCase;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.PDDocumentCatalog;
 import org.apache.pdfbox.pdmodel.PDDocumentNameDictionary;
@@ -26,7 +25,10 @@
 import org.apache.pdfbox.pdmodel.common.filespecification.PDEmbeddedFile;
 import org.junit.Test;
 
-import junit.framework.TestCase;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.util.List;
+import java.util.Map;
 
 public class TestEmbeddedFiles extends TestCase
 {
@@ -68,5 +70,54 @@
         assertNull("EmbeddedFile was correctly null", embeddedFile);
     }
 
+    @Test
+    public void testOSSpecificAttachments() throws IOException
+    {
+        PDEmbeddedFile nonOSFile = null;
+        PDEmbeddedFile macFile = null;
+        PDEmbeddedFile dosFile = null;
+        PDEmbeddedFile unixFile = null;
+
+        PDDocument doc = PDDocument.load(TestEmbeddedFiles.class.getResourceAsStream(
+                "testPDF_multiFormatEmbFiles.pdf"));
+
+        PDDocumentCatalog catalog = doc.getDocumentCatalog();
+        PDDocumentNameDictionary names = catalog.getNames();
+        PDEmbeddedFilesNameTreeNode treeNode = names.getEmbeddedFiles();
+        List<PDNameTreeNode> kids = treeNode.getKids();
+        for (PDNameTreeNode kid : kids)
+        {
+            Map<String, COSObjectable> tmpNames = kid.getNames();
+            COSObjectable obj = tmpNames.get("My first attachment");
+            if (obj instanceof PDComplexFileSpecification)
+            {
+                PDComplexFileSpecification spec = (PDComplexFileSpecification)obj;
+                nonOSFile = spec.getEmbeddedFile();
+                macFile = spec.getEmbeddedFileMac();
+                dosFile = spec.getEmbeddedFileDos();
+                unixFile = spec.getEmbeddedFileUnix();
-}
+            }
+        }
 
+        assertTrue("non os specific", byteArrayContainsLC("non os specific",
+                nonOSFile.getByteArray(), "ISO-8859-1"));
+
+        assertTrue("mac", byteArrayContainsLC("mac embedded",
+                macFile.getByteArray(), "ISO-8859-1"));
+
+        assertTrue("dos", byteArrayContainsLC("dos embedded",
+                dosFile.getByteArray(), "ISO-8859-1"));
+
+        assertTrue("unix", byteArrayContainsLC("unix embedded",
+                unixFile.getByteArray(), "ISO-8859-1"));
+
+    }
+
+    private boolean byteArrayContainsLC(String target, byte[] bytes, String encoding)
+            throws UnsupportedEncodingException
+    {
+        String s = new String(bytes, encoding);
+        return s.toLowerCase().contains(target);
+
+    }
+}
Index: pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/filespecification/PDComplexFileSpecification.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>ISO-8859-1
===================================================================
--- pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/filespecification/PDComplexFileSpecification.java	(revision 1604843)
+++ pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/filespecification/PDComplexFileSpecification.java	(revision )
@@ -280,7 +280,7 @@
      */
     public void setEmbeddedFileDos( PDEmbeddedFile file )
     {
-        COSDictionary ef = (COSDictionary)fs.getDictionaryObject( COSName.DOS );
+        COSDictionary ef = (COSDictionary)fs.getDictionaryObject( COSName.EF );
         if( ef == null && file != null )
         {
             ef = new COSDictionary();
@@ -315,7 +315,7 @@
      */
     public void setEmbeddedFileMac( PDEmbeddedFile file )
     {
-        COSDictionary ef = (COSDictionary)fs.getDictionaryObject( COSName.MAC );
+        COSDictionary ef = (COSDictionary)fs.getDictionaryObject( COSName.EF );
         if( ef == null && file != null )
         {
             ef = new COSDictionary();
@@ -350,7 +350,7 @@
      */
     public void setEmbeddedFileUnix( PDEmbeddedFile file )
     {
-        COSDictionary ef = (COSDictionary)fs.getDictionaryObject( COSName.UNIX );
+        COSDictionary ef = (COSDictionary)fs.getDictionaryObject( COSName.EF );
         if( ef == null && file != null )
         {
             ef = new COSDictionary();
Index: examples/src/main/java/org/apache/pdfbox/examples/pdmodel/MyEmbeddedFiles.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>ISO-8859-1
===================================================================
--- examples/src/main/java/org/apache/pdfbox/examples/pdmodel/MyEmbeddedFiles.java	(revision )
+++ examples/src/main/java/org/apache/pdfbox/examples/pdmodel/MyEmbeddedFiles.java	(revision )
@@ -0,0 +1,192 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.pdfbox.examples.pdmodel;
+
+import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.pdmodel.PDDocumentNameDictionary;
+import org.apache.pdfbox.pdmodel.PDEmbeddedFilesNameTreeNode;
+import org.apache.pdfbox.pdmodel.PDPage;
+import org.apache.pdfbox.pdmodel.common.filespecification.PDComplexFileSpecification;
+import org.apache.pdfbox.pdmodel.common.filespecification.PDEmbeddedFile;
+import org.apache.pdfbox.pdmodel.edit.PDPageContentStream;
+import org.apache.pdfbox.pdmodel.font.PDFont;
+import org.apache.pdfbox.pdmodel.font.PDType1Font;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.GregorianCalendar;
+import java.util.List;
+
+/**
+ * This is an example that creates a simple document and embeds a file into it..
+ *
+ * @author <a href="mailto:ben@benlitchfield.com">Ben Litchfield</a>
+ * @version $Revision: 1.2 $
+ */
+public class MyEmbeddedFiles
+{
+    /**
+     * Constructor.
+     */
+    public MyEmbeddedFiles()
+    {
+        super();
+    }
+
+    /**
+     * create the second sample document from the PDF file format specification.
+     *
+     * @param file The file to write the PDF to.
+     *
+     * @throws java.io.IOException If there is an error writing the data.
+     */
+    public void doIt( String file) throws IOException
+    {
+        // the document
+        PDDocument doc = null;
+        try
+        {
+            doc = new PDDocument();
+
+            PDPage page = new PDPage();
+            doc.addPage( page );
+            PDFont font = PDType1Font.HELVETICA_BOLD;
+
+            PDPageContentStream contentStream = new PDPageContentStream(doc, page);
+            contentStream.beginText();
+            contentStream.setFont( font, 12 );
+            contentStream.moveTextPositionByAmount( 100, 700 );
+            contentStream.drawString( "Go to Document->File Attachments to View Embedded Files" );
+            contentStream.endText();
+            contentStream.close();
+
+            //embedded files are stored in a named tree
+            PDEmbeddedFilesNameTreeNode efTree = new PDEmbeddedFilesNameTreeNode();
+
+            //first create the file specification, which holds the embedded file
+            PDComplexFileSpecification fs = new PDComplexFileSpecification();
+            fs.setFile( "Test.txt" );
+            fs.setFileDos("TestDos.txt");
+            fs.setFileMac("TestMac.txt");
+            fs.setFileUnix("TestUnix.txt");
+
+            //create a dummy file stream, this would probably normally be a FileInputStream
+            byte[] data = "This is the contents of a non os specific embedded file".getBytes("ISO-8859-1");
+            ByteArrayInputStream fakeFile =
+                new ByteArrayInputStream( data );
+            PDEmbeddedFile ef = new PDEmbeddedFile(doc, fakeFile );
+            //now lets some of the optional parameters
+            ef.setSubtype( "text/plain" );
+            ef.setSize( data.length );
+            ef.setCreationDate( new GregorianCalendar() );
+            fs.setEmbeddedFile( ef );
+
+            //create a dummy file stream, this would probably normally be a FileInputStream
+            byte[] dataMac = "This is the contents of a mac embedded file".getBytes("ISO-8859-1");
+            ByteArrayInputStream fakeFileMac =
+                    new ByteArrayInputStream( dataMac );
+            PDEmbeddedFile efMac = new PDEmbeddedFile(doc, fakeFileMac );
+            //now lets some of the optional parameters
+            efMac.setSubtype( "text/plain" );
+            efMac.setSize( dataMac.length );
+            efMac.setCreationDate( new GregorianCalendar() );
+            fs.setEmbeddedFileMac( efMac );
+
+            //create a dummy file stream, this would probably normally be a FileInputStream
+            byte[] dataDos = "This is the contents of a dos embedded file".getBytes("ISO-8859-1");
+            ByteArrayInputStream fakeFileDos =
+                    new ByteArrayInputStream( dataDos );
+            PDEmbeddedFile efDos = new PDEmbeddedFile(doc, fakeFileDos );
+            //now lets some of the optional parameters
+            efDos.setSubtype( "text/plain" );
+            efDos.setSize( data.length );
+            efDos.setCreationDate( new GregorianCalendar() );
+            fs.setEmbeddedFileDos( efDos );
+
+            //create a dummy file stream, this would probably normally be a FileInputStream
+            byte[] dataUnix = "This is the contents of a unix embedded file".getBytes("ISO-8859-1");
+            ByteArrayInputStream fakeFileUnix =
+                    new ByteArrayInputStream( dataUnix );
+            PDEmbeddedFile efUnix = new PDEmbeddedFile(doc, fakeFileUnix );
+            //now lets some of the optional parameters
+            efUnix.setSubtype( "text/plain" );
+            efUnix.setSize( data.length );
+            efUnix.setCreationDate( new GregorianCalendar() );
+            fs.setEmbeddedFileUnix( efUnix );
+
+
+            // create a new tree node and add the embedded file 
+            PDEmbeddedFilesNameTreeNode treeNode = new PDEmbeddedFilesNameTreeNode();
+            treeNode.setNames( Collections.singletonMap( "My first attachment",  fs ) );
+            // add the new node as kid to the root node
+            List<PDEmbeddedFilesNameTreeNode> kids = new ArrayList<PDEmbeddedFilesNameTreeNode>();
+            kids.add(treeNode);
+            efTree.setKids(kids);
+            // add the tree to the document catalog
+            PDDocumentNameDictionary names = new PDDocumentNameDictionary( doc.getDocumentCatalog() );
+            names.setEmbeddedFiles( efTree );
+            doc.getDocumentCatalog().setNames( names );
+
+
+            doc.save( file );
+        }
+        finally
+        {
+            if( doc != null )
+            {
+                doc.close();
+            }
+        }
+    }
+
+    /**
+     * This will create a hello world PDF document with an embedded file.
+     * <br />
+     * see usage() for commandline
+     *
+     * @param args Command line arguments.
+     */
+    public static void main(String[] args)
+    {
+        MyEmbeddedFiles app = new MyEmbeddedFiles();
+        try
+        {
+            if( args.length != 1 )
+            {
+                app.usage();
+            }
+            else
+            {
+                app.doIt( args[0] );
+            }
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * This will print out a message telling how to use this example.
+     */
+    private void usage()
+    {
+        System.err.println( "usage: " + this.getClass().getName() + " <output-file>" );
+    }
+}
