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 2015/07/13 21:22:38 UTC

svn commit: r1690799 - in /pdfbox/trunk: examples/src/main/java/org/apache/pdfbox/examples/pdmodel/ pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/

Author: jahewson
Date: Mon Jul 13 19:22:38 2015
New Revision: 1690799

URL: http://svn.apache.org/r1690799
Log:
private_annotations_flags

Modified:
    pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/HelloWorldType1.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1Font.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1FontEmbedder.java

Modified: pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/HelloWorldType1.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/HelloWorldType1.java?rev=1690799&r1=1690798&r2=1690799&view=diff
==============================================================================
--- pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/HelloWorldType1.java (original)
+++ pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/HelloWorldType1.java Mon Jul 13 19:22:38 2015
@@ -26,7 +26,7 @@ import org.apache.pdfbox.pdmodel.font.PD
 import org.apache.pdfbox.pdmodel.font.PDType1Font;
 
 /**
- * Creates a simple document with a Type 1 font (.afm + .pfb).
+ * Creates a simple document with a Type 1 font (.pfb).
  */
 public class HelloWorldType1
 {
@@ -35,13 +35,13 @@ public class HelloWorldType1
         if (args.length != 3)
         {
             System.err.println("usage: " + HelloWorldType1.class.getName() +
-                    " <output-file> <Message> <afm-file>");
+                    " <output-file> <Message> <pfb-file>");
             System.exit(1);
         }
 
         String file = args[0];
         String message = args[1];
-        String afmPath = args[2];
+        String pfbPath = args[2];
         
         PDDocument doc = new PDDocument();
         try
@@ -49,8 +49,7 @@ public class HelloWorldType1
             PDPage page = new PDPage();
             doc.addPage(page);
 
-            PDFont font = new PDType1Font(doc, new FileInputStream(afmPath),
-                    new FileInputStream(afmPath.replace(".afm", ".pfb")));
+            PDFont font = new PDType1Font(doc, new FileInputStream(pfbPath));
 
             PDPageContentStream contents = new PDPageContentStream(doc, page);
             contents.beginText();

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1Font.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1Font.java?rev=1690799&r1=1690798&r2=1690799&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1Font.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1Font.java Mon Jul 13 19:22:38 2015
@@ -133,13 +133,12 @@ public class PDType1Font extends PDSimpl
      * Creates a new Type 1 font for embedding.
      *
      * @param doc PDF document to write to
-     * @param afmIn AFM file stream
      * @param pfbIn PFB file stream
      * @throws IOException
      */
-    public PDType1Font(PDDocument doc, InputStream afmIn, InputStream pfbIn) throws IOException
+    public PDType1Font(PDDocument doc, InputStream pfbIn) throws IOException
     {
-        PDType1FontEmbedder embedder = new PDType1FontEmbedder(doc, dict, afmIn, pfbIn, null);
+        PDType1FontEmbedder embedder = new PDType1FontEmbedder(doc, dict, pfbIn, null);
         encoding = embedder.getFontEncoding();
         glyphList = embedder.getGlyphList();
         type1font = embedder.getType1Font();
@@ -153,14 +152,12 @@ public class PDType1Font extends PDSimpl
      * Creates a new Type 1 font for embedding.
      *
      * @param doc PDF document to write to
-     * @param afmIn AFM file stream
      * @param pfbIn PFB file stream
      * @throws IOException
      */
-    public PDType1Font(PDDocument doc, InputStream afmIn, InputStream pfbIn, Encoding encoding)
-            throws IOException
+    public PDType1Font(PDDocument doc, InputStream pfbIn, Encoding encoding) throws IOException
     {
-        PDType1FontEmbedder embedder = new PDType1FontEmbedder(doc, dict, afmIn, pfbIn, encoding);
+        PDType1FontEmbedder embedder = new PDType1FontEmbedder(doc, dict, pfbIn, encoding);
         this.encoding = encoding;
         glyphList = embedder.getGlyphList();
         type1font = embedder.getType1Font();

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1FontEmbedder.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1FontEmbedder.java?rev=1690799&r1=1690798&r2=1690799&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1FontEmbedder.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1FontEmbedder.java Mon Jul 13 19:22:38 2015
@@ -21,20 +21,16 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.List;
-import org.apache.fontbox.afm.AFMParser;
 import org.apache.fontbox.afm.FontMetrics;
 import org.apache.fontbox.pfb.PfbParser;
 import org.apache.fontbox.type1.Type1Font;
-import org.apache.pdfbox.cos.COSArray;
 import org.apache.pdfbox.cos.COSDictionary;
-import org.apache.pdfbox.cos.COSInteger;
 import org.apache.pdfbox.cos.COSName;
 import org.apache.pdfbox.io.IOUtils;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.common.COSArrayList;
 import org.apache.pdfbox.pdmodel.common.PDRectangle;
 import org.apache.pdfbox.pdmodel.common.PDStream;
-import org.apache.pdfbox.pdmodel.font.encoding.DictionaryEncoding;
 import org.apache.pdfbox.pdmodel.font.encoding.Encoding;
 import org.apache.pdfbox.pdmodel.font.encoding.GlyphList;
 import org.apache.pdfbox.pdmodel.font.encoding.Type1Encoding;
@@ -47,42 +43,37 @@ import org.apache.pdfbox.pdmodel.font.en
 class PDType1FontEmbedder
 {
     private final Encoding fontEncoding;
-    private final FontMetrics metrics;
     private final Type1Font type1;
     
     /**
-     * This will load a afm and pfb to be embedding into a document.
+     * This will load a PFB to be embedded into a document.
      *
      * @param doc The PDF document that will hold the embedded font.
      * @param dict The Font dictionary to write to.
-     * @param afmStream The afm input.
      * @param pfbStream The pfb input.
      * @throws IOException If there is an error loading the data.
      */
-    PDType1FontEmbedder(PDDocument doc, COSDictionary dict, InputStream afmStream,
-                               InputStream pfbStream, Encoding encoding) throws IOException
+    PDType1FontEmbedder(PDDocument doc, COSDictionary dict, InputStream pfbStream,
+                        Encoding encoding) throws IOException
     {
         dict.setItem(COSName.SUBTYPE, COSName.TYPE1);
 
-        // read the afm
-        AFMParser afmParser = new AFMParser(afmStream);
-        metrics = afmParser.parse();
+        // read the pfb
+        byte[] pfbBytes = IOUtils.toByteArray(pfbStream);
+        PfbParser pfbParser = new PfbParser(new ByteArrayInputStream(pfbBytes));
+        type1 = Type1Font.createWithPFB(new ByteArrayInputStream(pfbBytes));
+        
         if (encoding == null)
         {
-            this.fontEncoding = encodingFromAFM(metrics);
+            fontEncoding = Type1Encoding.fromFontBox(type1.getEncoding());
         }
         else
         {
-            this.fontEncoding = encoding;
+            fontEncoding = encoding;
         }
 
         // build font descriptor
-        PDFontDescriptor fd = buildFontDescriptor(metrics);
-
-        // read the pfb
-        byte[] pfbBytes = IOUtils.toByteArray(pfbStream);
-        PfbParser pfbParser = new PfbParser(new ByteArrayInputStream(pfbBytes));
-        type1 = Type1Font.createWithPFB(new ByteArrayInputStream(pfbBytes));
+        PDFontDescriptor fd = buildFontDescriptor(type1);
 
         PDStream fontStream = new PDStream(doc, pfbParser.getInputStream(), false);
         fontStream.getStream().setInt("Length", pfbParser.size());
@@ -95,14 +86,14 @@ class PDType1FontEmbedder
 
         // set the values
         dict.setItem(COSName.FONT_DESC, fd);
-        dict.setName(COSName.BASE_FONT, metrics.getFontName());
+        dict.setName(COSName.BASE_FONT, type1.getName());
 
         // widths
         List<Integer> widths = new ArrayList<Integer>(256);
         for (int code = 0; code <= 255; code++)
         {
             String name = fontEncoding.getName(code);
-            int width = Math.round(metrics.getCharacterWidth(name));
+            int width = Math.round(type1.getWidth(name));
             widths.add(width);
         }
         
@@ -112,7 +103,30 @@ class PDType1FontEmbedder
     }
 
     /**
-     * Returns a PDFontDescriptor for the given AFM.
+     * Returns a PDFontDescriptor for the given PFB.
+     */
+    static PDFontDescriptor buildFontDescriptor(Type1Font type1)
+    {
+        boolean isSymbolic = type1.getEncoding()
+                instanceof org.apache.fontbox.encoding.BuiltInEncoding;
+
+        PDFontDescriptor fd = new PDFontDescriptor();
+        fd.setFontName(type1.getName());
+        fd.setFontFamily(type1.getFamilyName());
+        fd.setNonSymbolic(!isSymbolic);
+        fd.setSymbolic(isSymbolic);
+        fd.setFontBoundingBox(new PDRectangle(type1.getFontBBox()));
+        fd.setItalicAngle(type1.getItalicAngle());
+        fd.setAscent(type1.getFontBBox().getUpperRightY());
+        fd.setDescent(type1.getFontBBox().getLowerLeftY());
+        fd.setCapHeight(type1.getBlueValues().get(2).floatValue());
+        fd.setStemV(0); // for PDF/A
+        return fd;
+    }
+
+
+    /**
+     * Returns a PDFontDescriptor for the given AFM. Used only for Standard 14 fonts.
      *
      * @param metrics AFM
      */
@@ -136,34 +150,7 @@ class PDType1FontEmbedder
         fd.setStemV(0); // for PDF/A
         return fd;
     }
-
-    // This will generate a Encoding from the AFM-Encoding, because the AFM-Enconding isn't exported
-    // to the pdf and consequently the StandardEncoding is used so that any special character is
-    // missing I've copied the code from the pdfbox-forum posted by V0JT4 and made some additions
-    // concerning german umlauts see also https://sourceforge.net/forum/message.php?msg_id=4705274
-    private DictionaryEncoding encodingFromAFM(FontMetrics metrics) throws IOException
-    {
-        Type1Encoding encoding = new Type1Encoding(metrics);
-
-        COSArray differences = new COSArray();
-        differences.add(COSInteger.ZERO);
-        for (int i = 0; i < 256; i++)
-        {
-            differences.add(COSName.getPDFName(encoding.getName(i)));
-        }
-        // my AFMPFB-Fonts has no character-codes for german umlauts
-        // so that I've to add them here by hand
-        differences.set(0337 + 1, COSName.getPDFName("germandbls"));
-        differences.set(0344 + 1, COSName.getPDFName("adieresis"));
-        differences.set(0366 + 1, COSName.getPDFName("odieresis"));
-        differences.set(0374 + 1, COSName.getPDFName("udieresis"));
-        differences.set(0304 + 1, COSName.getPDFName("Adieresis"));
-        differences.set(0326 + 1, COSName.getPDFName("Odieresis"));
-        differences.set(0334 + 1, COSName.getPDFName("Udieresis"));
-
-        return new DictionaryEncoding(COSName.STANDARD_ENCODING, differences);
-    }
-
+    
     /**
      * Returns the font's encoding.
      */
@@ -181,14 +168,6 @@ class PDType1FontEmbedder
     }
 
     /**
-     * Returns the font's metrics.
-     */
-    public FontMetrics getFontMetrics()
-    {
-        return metrics;
-    }
-
-    /**
      * Returns the Type 1 font.
      */
     public Type1Font getType1Font()