You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ja...@apache.org on 2014/12/14 03:45:41 UTC

svn commit: r1645377 - in /pdfbox/trunk: fontbox/src/main/java/org/apache/fontbox/ttf/OS2WindowsMetricsTable.java pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/TrueTypeEmbedder.java

Author: jahewson
Date: Sun Dec 14 02:45:40 2014
New Revision: 1645377

URL: http://svn.apache.org/r1645377
Log:
PDFBOX-2524: Check whether embedding is permitted, thanks to Keiji Suzuki

Modified:
    pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/OS2WindowsMetricsTable.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/TrueTypeEmbedder.java

Modified: pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/OS2WindowsMetricsTable.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/OS2WindowsMetricsTable.java?rev=1645377&r1=1645376&r2=1645377&view=diff
==============================================================================
--- pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/OS2WindowsMetricsTable.java (original)
+++ pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/OS2WindowsMetricsTable.java Sun Dec 14 02:45:40 2014
@@ -147,6 +147,37 @@ public class OS2WindowsMetricsTable exte
     public static final int FAMILY_CLASS_SYMBOLIC = 12;
 
     /**
+     * Restricted License embedding: must not be modified, embedded or exchanged in any manner.
+     *
+     * <p>For Restricted License embedding to take effect, it must be the only level of embedding
+     * selected.
+     */
+    public static final short FSTYPE_RESTRICTED = 0x0001;
+
+    /**
+     * Preview & Print embedding: the font may be embedded, and temporarily loaded on the
+     * remote system. No edits can be applied to the document.
+     */
+    public static final short FSTYPE_PREVIEW_AND_PRINT = 0x0004;
+
+    /**
+     * Editable embedding: the font may be embedded but must only be installed temporarily on other
+     * systems. Documents may be editied and changes saved.
+     */
+    public static final short FSTYPE_EDITIBLE = 0x0004;
+
+    /**
+     * No subsetting: the font must not be subsetted prior to embedding.
+     */
+    public static final short FSTYPE_NO_SUBSETTING = 0x0100;
+
+    /**
+     * Bitmap embedding only: only bitmaps contained in the font may be embedded. No outline data
+     * may be embedded. Other embedding restrictions specified in bits 0-3 and 8 also apply.
+     */
+    public static final short FSTYPE_BITMAP_ONLY = 0x0200;
+
+    /**
      * @return Returns the achVendId.
      */
     public String getAchVendId()

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/TrueTypeEmbedder.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/TrueTypeEmbedder.java?rev=1645377&r1=1645376&r2=1645377&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/TrueTypeEmbedder.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/TrueTypeEmbedder.java Sun Dec 14 02:45:40 2014
@@ -67,6 +67,10 @@ abstract class TrueTypeEmbedder
         {
             stream2 = stream.createInputStream();
             ttf = new TTFParser().parse(stream2);
+            if (!isEmbeddingPermitted(ttf))
+            {
+                throw new IOException("This font does not permit embedding");
+            }
             fd = createFontDescriptor(ttf);
         }
         finally
@@ -84,6 +88,32 @@ abstract class TrueTypeEmbedder
     }
 
     /**
+     * Returns true if the fsType in the OS/2 table permits embedding.
+     */
+    private boolean isEmbeddingPermitted(TrueTypeFont ttf) throws IOException
+    {
+        if (ttf.getOS2Windows() != null)
+        {
+            int fsType = ttf.getOS2Windows().getFsType();
+            int exclusive = fsType & 0x8; // bits 0-3 are a set of exclusive bits
+
+            if ((exclusive & OS2WindowsMetricsTable.FSTYPE_RESTRICTED) ==
+                             OS2WindowsMetricsTable.FSTYPE_RESTRICTED)
+            {
+                // restricted License embedding
+                return false;
+            }
+            else if ((exclusive & OS2WindowsMetricsTable.FSTYPE_BITMAP_ONLY) ==
+                                 OS2WindowsMetricsTable.FSTYPE_BITMAP_ONLY)
+            {
+                // bitmap embedding only
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
      * Creates a new font descriptor dictionary for the given TTF.
      */
     private PDFontDescriptor createFontDescriptor(TrueTypeFont ttf) throws IOException