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/10/09 07:15:26 UTC
svn commit: r1630284 - in /pdfbox/trunk:
pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/
preflight/src/main/java/org/apache/pdfbox/preflight/content/
preflight/src/main/java/org/apache/pdfbox/preflight/font/
preflight/src/main/java/org/apache/pdfb...
Author: jahewson
Date: Thu Oct 9 05:15:25 2014
New Revision: 1630284
URL: http://svn.apache.org/r1630284
Log:
PDFBOX-2299: Update preflight to use 2.0 font handing
- Removes preflight legacy Type1Parser and associated classes, uses Type 1 parser from FontBox 2.0
- Replaces FontContainer#getFontProgramWidth() with PDFont#getWidthFromFont()
- Removes most of the functionality of FontContainer subclasses, as PDFont and its various subclasses now handle these checks
- Added PDFont#isDamaged() to gain access to PDFBox font parsing status
-Removed preflight FontLike and replaced with PDFontLike from 2.0
Removed:
pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/util/CIDToGIDMap.java
pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/util/FontLike.java
pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/util/GlyphDescription.java
pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/util/PeekInputStream.java
pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/util/Type1.java
pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/util/Type1Parser.java
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType0.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType2.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFont.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFontLike.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType0Font.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.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/PDType3Font.java
pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/content/PreflightContentStream.java
pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/CIDType2FontValidator.java
pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/DescendantFontValidator.java
pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/Type1FontValidator.java
pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/Type3FontValidator.java
pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/CIDType0Container.java
pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/CIDType2Container.java
pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/FontContainer.java
pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/TrueTypeContainer.java
pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/Type0Container.java
pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/Type1Container.java
pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/Type3Container.java
pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/CIDType0DescriptorHelper.java
pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/CIDType2DescriptorHelper.java
pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/TrueTypeDescriptorHelper.java
pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/Type1DescriptorHelper.java
pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/util/GlyphDetail.java
pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/util/GlyphException.java
pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/process/reflect/FontValidationProcess.java
pdfbox/trunk/preflight/src/test/java/org/apache/pdfbox/preflight/TestIsartor.java
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType0.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType0.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType0.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType0.java Thu Oct 9 05:15:25 2014
@@ -52,6 +52,7 @@ public class PDCIDFontType0 extends PDCI
private final Map<Integer, Float> glyphHeights = new HashMap<Integer, Float>();
private final boolean isEmbedded;
+ private final boolean isDamaged;
private Float avgWidth = null;
private Matrix fontMatrix;
@@ -81,7 +82,18 @@ public class PDCIDFontType0 extends PDCI
{
// embedded
CFFParser cffParser = new CFFParser();
- CFFFont cffFont = cffParser.parse(bytes).get(0);
+ boolean fontIsDamaged = false;
+ CFFFont cffFont = null;
+ try
+ {
+ cffFont = cffParser.parse(bytes).get(0);
+ }
+ catch (IOException e)
+ {
+ LOG.error("Can't read the embedded CFF font " + fd.getFontName(), e);
+ fontIsDamaged = true;
+ }
+
if (cffFont instanceof CFFCIDFont)
{
cidFont = (CFFCIDFont)cffFont;
@@ -93,6 +105,7 @@ public class PDCIDFontType0 extends PDCI
t1Font = (CFFType1Font)cffFont;
}
isEmbedded = true;
+ isDamaged = fontIsDamaged;
}
else
{
@@ -135,6 +148,7 @@ public class PDCIDFontType0 extends PDCI
}
}
isEmbedded = false;
+ isDamaged = false;
}
fontMatrixTransform = getFontMatrix().createAffineTransform();
fontMatrixTransform.scale(1000, 1000);
@@ -261,6 +275,12 @@ public class PDCIDFontType0 extends PDCI
}
@Override
+ public boolean isDamaged()
+ {
+ return isDamaged;
+ }
+
+ @Override
public float getHeight(int code) throws IOException
{
int cid = codeToCID(code);
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType2.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType2.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType2.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType2.java Thu Oct 9 05:15:25 2014
@@ -52,6 +52,7 @@ public class PDCIDFontType2 extends PDCI
private final int[] cid2gid;
private final boolean hasIdentityCid2Gid;
private final boolean isEmbedded;
+ private final boolean isDamaged;
private Matrix fontMatrix;
/**
@@ -67,22 +68,25 @@ public class PDCIDFontType2 extends PDCI
PDStream ff2Stream = fd.getFontFile2();
PDStream ff3Stream = fd.getFontFile3();
+ TrueTypeFont ttfFont = null;
+ boolean fontIsDamaged = false;
if (ff2Stream != null)
{
try
{
// embedded
TTFParser ttfParser = new TTFParser(true);
- ttf = ttfParser.parse(ff2Stream.createInputStream());
- isEmbedded = true;
+ ttfFont = ttfParser.parse(ff2Stream.createInputStream());
}
catch (NullPointerException e) // TTF parser is buggy
{
- throw new IOException("Could not read embedded TTF for font " + getBaseFont(), e);
+ LOG.warn("Could not read embedded TTF for font " + getBaseFont(), e);
+ fontIsDamaged = true;
}
catch (IOException e)
{
- throw new IOException("Could not read embedded TTF for font " + getBaseFont(), e);
+ LOG.warn("Could not read embedded TTF for font " + getBaseFont(), e);
+ fontIsDamaged = true;
}
}
else if (ff3Stream != null)
@@ -92,8 +96,7 @@ public class PDCIDFontType2 extends PDCI
// embedded
OTFParser otfParser = new OTFParser(true);
OpenTypeFont otf = otfParser.parse(ff3Stream.createInputStream());
- ttf = otf;
- isEmbedded = true;
+ ttfFont = otf;
if (otf.isPostScript())
{
@@ -110,40 +113,38 @@ public class PDCIDFontType2 extends PDCI
}
catch (NullPointerException e) // TTF parser is buggy
{
- throw new IOException("Could not read embedded OTF for font " + getBaseFont(), e);
+ fontIsDamaged = true;
+ LOG.warn("Could not read embedded OTF for font " + getBaseFont(), e);
}
catch (IOException e)
{
- throw new IOException("Could not read embedded OTF for font " + getBaseFont(), e);
+ fontIsDamaged = true;
+ LOG.warn("Could not read embedded OTF for font " + getBaseFont(), e);
}
}
- else
+ isEmbedded = ttfFont != null;
+ isDamaged = fontIsDamaged;
+
+ if (ttfFont == null)
{
// substitute
TrueTypeFont ttfSubstitute = ExternalFonts.getTrueTypeFont(getBaseFont());
if (ttfSubstitute != null)
{
- ttf = ttfSubstitute;
+ ttfFont = ttfSubstitute;
}
else
{
// fallback
LOG.warn("Using fallback font for " + getBaseFont());
- ttf = ExternalFonts.getTrueTypeFallbackFont(getFontDescriptor());
+ ttfFont = ExternalFonts.getTrueTypeFallbackFont(getFontDescriptor());
}
- isEmbedded = false;
}
+ ttf = ttfFont;
cid2gid = readCIDToGIDMap();
COSBase map = dict.getDictionaryObject(COSName.CID_TO_GID_MAP);
- if (map instanceof COSName && ((COSName) map).getName().equals("Identity"))
- {
- hasIdentityCid2Gid = true;
- }
- else
- {
- hasIdentityCid2Gid = false;
- }
+ hasIdentityCid2Gid = map instanceof COSName && ((COSName) map).getName().equals("Identity");
}
@Override
@@ -375,6 +376,12 @@ public class PDCIDFontType2 extends PDCI
return isEmbedded;
}
+ @Override
+ public boolean isDamaged()
+ {
+ return isDamaged;
+ }
+
/**
* Returns the embedded or substituted TrueType font.
*/
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFont.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFont.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFont.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFont.java Thu Oct 9 05:15:25 2014
@@ -518,6 +518,9 @@ public abstract class PDFont implements
}
@Override
+ public abstract boolean isDamaged();
+
+ @Override
public boolean equals(Object other)
{
return other instanceof PDFont && ((PDFont) other).getCOSObject() == this.getCOSObject();
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFontLike.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFontLike.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFontLike.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFontLike.java Thu Oct 9 05:15:25 2014
@@ -89,6 +89,11 @@ public interface PDFontLike
public abstract boolean isEmbedded();
/**
+ * Returns true if the embedded font file is damaged.
+ */
+ public abstract boolean isDamaged();
+
+ /**
* This will get the average font width for all characters.
*
* @return The width is in 1000 unit of text space, ie 333 or 777
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java Thu Oct 9 05:15:25 2014
@@ -98,6 +98,7 @@ public class PDTrueTypeFont extends PDSi
private final TrueTypeFont ttf;
private final boolean isEmbedded;
+ private final boolean isDamaged;
/**
* Creates a new TrueType font from a Font dictionary.
@@ -109,6 +110,7 @@ public class PDTrueTypeFont extends PDSi
super(fontDictionary);
TrueTypeFont ttfFont = null;
+ boolean fontIsDamaged = false;
if (getFontDescriptor() != null)
{
PDFontDescriptor fd = super.getFontDescriptor();
@@ -123,15 +125,18 @@ public class PDTrueTypeFont extends PDSi
}
catch (NullPointerException e) // TTF parser is buggy
{
- throw new IOException("Could not read embedded TTF for font " + getBaseFont(), e);
+ LOG.warn("Could not read embedded TTF for font " + getBaseFont(), e);
+ fontIsDamaged = true;
}
catch (IOException e)
{
- throw new IOException("Could not read embedded TTF for font " + getBaseFont(), e);
+ LOG.warn("Could not read embedded TTF for font " + getBaseFont(), e);
+ fontIsDamaged = true;
}
}
}
isEmbedded = ttfFont != null;
+ isDamaged = fontIsDamaged;
// substitute
if (ttfFont == null)
@@ -174,6 +179,7 @@ public class PDTrueTypeFont extends PDSi
encoding = embedder.getFontEncoding();
ttf = embedder.getTrueTypeFont();
isEmbedded = true;
+ isDamaged = false;
}
@Override
@@ -194,6 +200,12 @@ public class PDTrueTypeFont extends PDSi
return ttf.getFontBBox();
}
+ @Override
+ public boolean isDamaged()
+ {
+ return isDamaged;
+ }
+
/**
* Returns the embedded or substituted TrueType font.
*/
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType0Font.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType0Font.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType0Font.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType0Font.java Thu Oct 9 05:15:25 2014
@@ -326,6 +326,12 @@ public class PDType0Font extends PDFont
}
@Override
+ public boolean isDamaged()
+ {
+ return descendantFont.isDamaged();
+ }
+
+ @Override
public String toString()
{
String descendant = null;
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java Thu Oct 9 05:15:25 2014
@@ -28,6 +28,7 @@ import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.apache.fontbox.cff.CFFFont;
import org.apache.fontbox.cff.CFFParser;
import org.apache.fontbox.cff.CFFType1Font;
import org.apache.fontbox.ttf.Type1Equivalent;
@@ -60,6 +61,7 @@ public class PDType1CFont extends PDSimp
private final CFFType1Font cffFont; // embedded font
private final Type1Equivalent type1Equivalent; // embedded or system font for rendering
private final boolean isEmbedded;
+ private final boolean isDamaged;
/**
* Constructor.
@@ -82,9 +84,21 @@ public class PDType1CFont extends PDSimp
}
}
- // note: this could be an OpenType file, fortunately CFFParser can handle that
- CFFParser cffParser = new CFFParser();
- cffFont = (CFFType1Font)cffParser.parse(bytes).get(0);
+ boolean fontIsDamaged = false;
+ CFFType1Font cffEmbedded = null;
+ try
+ {
+ // note: this could be an OpenType file, fortunately CFFParser can handle that
+ CFFParser cffParser = new CFFParser();
+ cffEmbedded = (CFFType1Font)cffParser.parse(bytes).get(0);
+ }
+ catch (IOException e)
+ {
+ LOG.error("Can't read the embedded Type1C font " + getName(), e);
+ fontIsDamaged = true;
+ }
+ isDamaged = fontIsDamaged;
+ cffFont = cffEmbedded;
if (cffFont != null)
{
@@ -189,6 +203,12 @@ public class PDType1CFont extends PDSimp
}
@Override
+ public boolean isDamaged()
+ {
+ return isDamaged;
+ }
+
+ @Override
public float getWidthFromFont(int code) throws IOException
{
if (getStandard14AFM() != null)
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=1630284&r1=1630283&r2=1630284&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 Thu Oct 9 05:15:25 2014
@@ -84,6 +84,7 @@ public class PDType1Font extends PDSimpl
private final Type1Font type1font; // embedded font
private final Type1Equivalent type1Equivalent; // embedded or system font for rendering
private final boolean isEmbedded;
+ private final boolean isDamaged;
private Matrix fontMatrix;
/**
@@ -102,6 +103,7 @@ public class PDType1Font extends PDSimpl
type1font = null;
type1Equivalent = ExternalFonts.getType1EquivalentFont(getBaseFont());
isEmbedded = false;
+ isDamaged = false;
}
/**
@@ -119,6 +121,7 @@ public class PDType1Font extends PDSimpl
type1font = embedder.getType1Font();
type1Equivalent = embedder.getType1Font();
isEmbedded = true;
+ isDamaged = false;
}
/**
@@ -132,6 +135,7 @@ public class PDType1Font extends PDSimpl
PDFontDescriptor fd = getFontDescriptor();
Type1Font t1 = null;
+ boolean fontIsDamaged = false;
if (fd != null)
{
// a Type1 font may contain a Type1C font
@@ -164,14 +168,17 @@ public class PDType1Font extends PDSimpl
catch (DamagedFontException e)
{
LOG.warn("Can't read damaged embedded Type1 font " + fd.getFontName());
+ fontIsDamaged = true;
}
catch (IOException e)
{
LOG.error("Can't read the embedded Type1 font " + fd.getFontName(), e);
+ fontIsDamaged = true;
}
}
}
isEmbedded = t1 != null;
+ isDamaged = fontIsDamaged;
// try to find a suitable .pfb font to substitute
if (t1 == null)
@@ -431,4 +438,10 @@ public class PDType1Font extends PDSimpl
}
return fontMatrix;
}
+
+ @Override
+ public boolean isDamaged()
+ {
+ return isDamaged;
+ }
}
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType3Font.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType3Font.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType3Font.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType3Font.java Thu Oct 9 05:15:25 2014
@@ -178,6 +178,13 @@ public class PDType3Font extends PDSimpl
return fontMatrix;
}
+ @Override
+ public boolean isDamaged()
+ {
+ // there's no font file to load
+ return false;
+ }
+
/**
* Returns the optional resources of the type3 stream.
*
Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/content/PreflightContentStream.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/content/PreflightContentStream.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/content/PreflightContentStream.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/content/PreflightContentStream.java Thu Oct 9 05:15:25 2014
@@ -324,7 +324,7 @@ public class PreflightContentStream exte
else if (!fontContainer.isValid() && !fontContainer.errorsAleadyMerged())
{
context.addValidationErrors(fontContainer.getAllErrors());
- fontContainer.setErrorsAleadyMerged(true);
+ fontContainer.setErrorsAlreadyMerged(true);
return;
}
if (!fontContainer.isValid() && fontContainer.errorsAleadyMerged())
Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/CIDType2FontValidator.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/CIDType2FontValidator.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/CIDType2FontValidator.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/CIDType2FontValidator.java Thu Oct 9 05:15:25 2014
@@ -26,11 +26,9 @@ import org.apache.pdfbox.pdmodel.font.PD
import org.apache.pdfbox.preflight.PreflightContext;
import org.apache.pdfbox.preflight.font.container.CIDType2Container;
import org.apache.pdfbox.preflight.font.descriptor.CIDType2DescriptorHelper;
-import org.apache.pdfbox.preflight.font.util.CIDToGIDMap;
public class CIDType2FontValidator extends DescendantFontValidator<CIDType2Container>
{
-
public CIDType2FontValidator(PreflightContext context, PDCIDFontType2 font)
{
super(context, font, new CIDType2Container(font));
@@ -39,8 +37,7 @@ public class CIDType2FontValidator exten
@Override
protected void checkCIDToGIDMap(COSBase ctog)
{
- CIDToGIDMap cidToGid = checkCIDToGIDMap(ctog, true);
- this.fontContainer.setCidToGid(cidToGid);
+ checkCIDToGIDMap(ctog, true);
}
@Override
@@ -48,5 +45,4 @@ public class CIDType2FontValidator exten
{
this.descriptorHelper = new CIDType2DescriptorHelper(context, font, fontContainer);
}
-
}
Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/DescendantFontValidator.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/DescendantFontValidator.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/DescendantFontValidator.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/DescendantFontValidator.java Thu Oct 9 05:15:25 2014
@@ -26,8 +26,11 @@ import static org.apache.pdfbox.prefligh
import static org.apache.pdfbox.preflight.PreflightConstants.ERROR_FONTS_DICTIONARY_INVALID;
import static org.apache.pdfbox.preflight.PreflightConstants.FONT_DICTIONARY_VALUE_CMAP_IDENTITY;
+
+import java.io.ByteArrayOutputStream;
import java.io.IOException;
+import java.io.InputStream;
import org.apache.pdfbox.cos.COSBase;
import org.apache.pdfbox.cos.COSDictionary;
import org.apache.pdfbox.cos.COSDocument;
@@ -37,7 +40,6 @@ import org.apache.pdfbox.pdmodel.font.PD
import org.apache.pdfbox.preflight.PreflightContext;
import org.apache.pdfbox.preflight.ValidationResult.ValidationError;
import org.apache.pdfbox.preflight.font.container.FontContainer;
-import org.apache.pdfbox.preflight.font.util.CIDToGIDMap;
import org.apache.pdfbox.preflight.utils.COSUtils;
public abstract class DescendantFontValidator<T extends FontContainer> extends SimpleFontValidator<T>
@@ -123,10 +125,8 @@ public abstract class DescendantFontVali
* @param mandatory true for CIDType2 , false for CIDType0
* @return
*/
- protected CIDToGIDMap checkCIDToGIDMap(COSBase ctog, boolean mandatory)
+ protected void checkCIDToGIDMap(COSBase ctog, boolean mandatory)
{
- CIDToGIDMap cidToGidMap = null;
-
if (COSUtils.isString(ctog, cosDocument))
{
// ---- valid only if the string is Identity
@@ -141,9 +141,12 @@ public abstract class DescendantFontVali
{
try
{
- COSStream ctogMap = COSUtils.getAsStream(ctog, cosDocument);
- cidToGidMap = new CIDToGIDMap();
- cidToGidMap.parseStream(ctogMap);
+ COSStream stream = COSUtils.getAsStream(ctog, cosDocument);
+
+ // todo: check the map's content? (won't pdfbox do this?)
+ InputStream is = stream.getUnfilteredStream();
+ ByteArrayOutputStream os = new ByteArrayOutputStream();
+ byte[] map = os.toByteArray();
}
catch (IOException e)
{
@@ -155,6 +158,5 @@ public abstract class DescendantFontVali
{
this.fontContainer.push(new ValidationError(ERROR_FONTS_CIDKEYED_CIDTOGID));
}
- return cidToGidMap;
}
}
Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/Type1FontValidator.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/Type1FontValidator.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/Type1FontValidator.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/Type1FontValidator.java Thu Oct 9 05:15:25 2014
@@ -33,6 +33,7 @@ import org.apache.pdfbox.cos.COSDictiona
import org.apache.pdfbox.cos.COSDocument;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.pdmodel.font.PDSimpleFont;
+import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.apache.pdfbox.preflight.PreflightContext;
import org.apache.pdfbox.preflight.ValidationResult.ValidationError;
import org.apache.pdfbox.preflight.font.container.Type1Container;
@@ -42,7 +43,7 @@ import org.apache.pdfbox.preflight.utils
public class Type1FontValidator extends SimpleFontValidator<Type1Container>
{
- public Type1FontValidator(PreflightContext context, PDSimpleFont font)
+ public Type1FontValidator(PreflightContext context, PDType1Font font)
{
super(context, font, font.getCOSObject(), new Type1Container(font));
}
@@ -50,7 +51,7 @@ public class Type1FontValidator extends
@Override
protected void createFontDescriptorHelper()
{
- this.descriptorHelper = new Type1DescriptorHelper(context, (PDSimpleFont) font, fontContainer);
+ this.descriptorHelper = new Type1DescriptorHelper(context, (PDType1Font) font, fontContainer);
}
@Override
Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/Type3FontValidator.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/Type3FontValidator.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/Type3FontValidator.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/Type3FontValidator.java Thu Oct 9 05:15:25 2014
@@ -307,13 +307,13 @@ public class Type3FontValidator extends
if (width == fontProgamWidth)
{
// Glyph is OK, we keep the CID.
- this.fontContainer.markCIDAsValid(cid);
+ this.fontContainer.markAsValid(cid);
}
else
{
GlyphException glyphEx = new GlyphException(ERROR_FONTS_METRICS, cid,
"The character with CID\"" + cid + "\" should have a width equals to " + width);
- this.fontContainer.markCIDAsInvalid(cid, glyphEx);
+ this.fontContainer.markAsInvalid(cid, glyphEx);
}
}
catch (ContentStreamException e)
@@ -374,7 +374,7 @@ public class Type3FontValidator extends
*/
GlyphException glyphEx = new GlyphException(ERROR_FONTS_METRICS, cid, "The CharProcs \"" + charName
+ "\" doesn't exist");
- this.fontContainer.markCIDAsInvalid(cid, glyphEx);
+ this.fontContainer.markAsInvalid(cid, glyphEx);
}
return charStream;
}
Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/CIDType0Container.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/CIDType0Container.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/CIDType0Container.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/CIDType0Container.java Thu Oct 9 05:15:25 2014
@@ -22,41 +22,18 @@
package org.apache.pdfbox.preflight.font.container;
import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.fontbox.cff.CFFCIDFont;
-import org.apache.fontbox.cff.CFFFont;
import org.apache.pdfbox.pdmodel.font.PDCIDFontType0;
-import org.apache.pdfbox.preflight.font.util.FontLike;
-public class CIDType0Container extends FontContainer
+public class CIDType0Container extends FontContainer<PDCIDFontType0>
{
- protected List<CFFFont> lCFonts = new ArrayList<CFFFont>();
-
public CIDType0Container(PDCIDFontType0 font)
{
- super(new FontLike(font));
+ super(font);
}
@Override
- protected float getFontProgramWidth(int cid)
- {
- CFFCIDFont cffFont = (CFFCIDFont)lCFonts.get(0);
- try
- {
- // fixme: this does not take into account the PDF's CMap or the FontDescriptor's default width
- return cffFont.getType2CharString(cid).getWidth();
- }
- catch (IOException e)
- {
- return -1;
- }
- }
-
- public void setlCFonts(List<CFFFont> lCFonts)
+ public boolean hasGlyph(int code) throws IOException
{
- this.lCFonts = lCFonts;
+ return font.codeToGID(code) != 0;
}
-
}
Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/CIDType2Container.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/CIDType2Container.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/CIDType2Container.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/CIDType2Container.java Thu Oct 9 05:15:25 2014
@@ -21,87 +21,19 @@
package org.apache.pdfbox.preflight.font.container;
-import org.apache.fontbox.ttf.TrueTypeFont;
-import org.apache.pdfbox.pdmodel.font.PDCIDFontType2;
-import org.apache.pdfbox.preflight.PreflightConstants;
-import org.apache.pdfbox.preflight.font.util.CIDToGIDMap;
-import org.apache.pdfbox.preflight.font.util.FontLike;
-import org.apache.pdfbox.preflight.font.util.GlyphException;
-
import java.io.IOException;
+import org.apache.pdfbox.pdmodel.font.PDCIDFontType2;
-public class CIDType2Container extends FontContainer
+public class CIDType2Container extends FontContainer<PDCIDFontType2>
{
- protected CIDToGIDMap cidToGid = null;
- protected TrueTypeFont ttf = null;
-
public CIDType2Container(PDCIDFontType2 font)
{
- super(new FontLike(font));
+ super(font);
}
@Override
- protected float getFontProgramWidth(int cid) throws GlyphException
- {
- float foundWidth = -1;
- final int glyphIndex = getGlyphIndex(cid);
-
- try
- {
- // if glyph exists we can check the width
- if (this.ttf != null && this.ttf.getMaximumProfile().getNumGlyphs() > glyphIndex)
- {
- /*
- * In a Mono space font program, the length of the AdvanceWidth array must be one. According to the TrueType
- * font specification, the Last Value of the AdvanceWidth array is apply to the subsequent glyphs. So if the
- * GlyphId is greater than the length of the array the last entry is used.
- */
- int numberOfLongHorMetrics = ttf.getHorizontalHeader().getNumberOfHMetrics();
- int unitsPerEm = ttf.getHeader().getUnitsPerEm();
- int[] advanceGlyphWidths = ttf.getHorizontalMetrics().getAdvanceWidth();
- float glypdWidth = advanceGlyphWidths[numberOfLongHorMetrics - 1];
- if (glyphIndex < numberOfLongHorMetrics)
- {
- glypdWidth = advanceGlyphWidths[glyphIndex];
- }
- foundWidth = ((glypdWidth * 1000) / unitsPerEm);
- }
- return foundWidth;
- }
- catch (IOException e)
- {
- throw new GlyphException(PreflightConstants.ERROR_FONTS_GLYPH, cid, "Unexpected error during the width validation for the character CID(" + cid+") : " + e.getMessage());
- }
- }
-
- /**
- * If CIDToGID map is Identity, the GID equals to the CID. Otherwise the conversion is done by the CIDToGID map
- *
- * @param cid
- * @return -1 CID doesn't match with a GID
- */
- private int getGlyphIndex(int cid)
+ public boolean hasGlyph(int code) throws IOException
{
- int glyphIndex = cid;
- if (this.cidToGid != null)
- {
- glyphIndex = cidToGid.getGID(cid);
- if (glyphIndex == cidToGid.NOTDEF_GLYPH_INDEX)
- {
- glyphIndex = -14;
- }
- }
- return glyphIndex;
+ return font.codeToGID(code) != 0;
}
-
- public void setCidToGid(CIDToGIDMap cidToGid)
- {
- this.cidToGid = cidToGid;
- }
-
- public void setTtf(TrueTypeFont ttf)
- {
- this.ttf = ttf;
- }
-
}
Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/FontContainer.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/FontContainer.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/FontContainer.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/FontContainer.java Thu Oct 9 05:15:25 2014
@@ -27,40 +27,34 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import org.apache.pdfbox.pdmodel.font.PDFont;
+import org.apache.pdfbox.pdmodel.font.PDFontLike;
import org.apache.pdfbox.preflight.PreflightConstants;
import org.apache.pdfbox.preflight.ValidationResult.ValidationError;
-import org.apache.pdfbox.preflight.font.util.FontLike;
import org.apache.pdfbox.preflight.font.util.GlyphDetail;
import org.apache.pdfbox.preflight.font.util.GlyphException;
-public abstract class FontContainer
+public abstract class FontContainer<T extends PDFontLike>
{
/**
* List of validation errors that occur during the font validation. If the font is used by an object in the PDF, all
* these errors will be appended to the Error list of the PreflightContext.
*/
protected List<ValidationError> errorBuffer = new ArrayList<ValidationError>();
+
/**
* Boolean used to known if the font is embedded.
*/
protected boolean embeddedFont = true;
+ private final Map<Integer, GlyphDetail> codeToDetail = new HashMap<Integer, GlyphDetail>();
+ private boolean errorsAlreadyMerged = false;
+
/**
- * Link CID to an Object that contain information about the Glyph state (Valid or no)
+ * Font-like object.
*/
- protected Map<Integer, GlyphDetail> computedCid = new HashMap<Integer, GlyphDetail>();
-
- protected boolean errorsAleadyMerged = false;
-
- protected FontLike font;
-
- public FontContainer(PDFont font)
- {
- this.font = new FontLike(font);
- }
+ protected final T font;
- public FontContainer(FontLike font)
+ public FontContainer(T font)
{
this.font = font;
}
@@ -82,17 +76,17 @@ public abstract class FontContainer
public boolean isValid()
{
- return (this.errorBuffer.isEmpty() && isEmbeddedFont());
+ return this.errorBuffer.isEmpty() && isEmbeddedFont();
}
public boolean errorsAleadyMerged()
{
- return errorsAleadyMerged;
+ return errorsAlreadyMerged;
}
- public void setErrorsAleadyMerged(boolean errorsAleadyMerged)
+ public void setErrorsAlreadyMerged(boolean errorsAlreadyMerged)
{
- this.errorsAleadyMerged = errorsAleadyMerged;
+ this.errorsAlreadyMerged = errorsAlreadyMerged;
}
public boolean isEmbeddedFont()
@@ -106,98 +100,100 @@ public abstract class FontContainer
}
/**
- *
- * @param cid todo: not a CID, this is actually a char code!
+ * Check that the Width or W entry in the PDF matches the widths in the embedded font program.
+ *
+ * @param code character code
* @throws GlyphException
*/
- public void checkGlyphWidth(int cid) throws GlyphException
+ public void checkGlyphWidth(int code) throws GlyphException
{
- if (isAlreadyComputedCid(cid))
+ if (isAlreadyProcessed(code))
{
return;
}
+
try
{
- final float expectedWidth = this.font.getWidth(cid);
- final float foundWidth = getFontProgramWidth(cid);
- checkWidthsConsistency(cid, expectedWidth, foundWidth);
+ // check for missing glyphs
+ if (!hasGlyph(code))
+ {
+ GlyphException e = new GlyphException(PreflightConstants.ERROR_FONTS_GLYPH_MISSING, code, "The character \""
+ + code + "\" in the font program \"" + font.getName()
+ + "\" is missing from the Character Encoding.");
+ markAsInvalid(code, e);
+ throw e;
+ }
+
+ // check widths
+ float expectedWidth = font.getWidth(code);
+ float foundWidth = font.getWidthFromFont(code);
+ checkWidthsConsistency(code, expectedWidth, foundWidth);
}
catch (IOException e)
{
- throw new GlyphException(PreflightConstants.ERROR_FONTS_GLYPH, cid, "Unexpected error during the width validation for the character CID(" + cid+") : " + e.getMessage());
+ throw new GlyphException(PreflightConstants.ERROR_FONTS_GLYPH, code,
+ "Unexpected error during the width validation for the character code " + code +
+ " : " + e.getMessage());
}
}
/**
- * Check if the given CID is already computed
+ * Checks if the embedded font contains a glyph for the given character code.
+ *
+ * @param code character code
+ */
+ protected abstract boolean hasGlyph(int code) throws IOException;
+
+ /**
+ * Check if the given character code has already been processed.
*
- * @param cid
- * the CID to check
+ * @param code character code
* @return true if the CID has previously been marked as valid, false otherwise
- * @throws GlyphException
- * if the CID has previously been marked as invalid // TODO useful ??
+ * @throws GlyphException if the code has previously been marked as invalid // TODO useful ??
*/
- protected boolean isAlreadyComputedCid(int cid) throws GlyphException
+ private boolean isAlreadyProcessed(int code) throws GlyphException
{
boolean already = false;
- GlyphDetail gdetail = this.computedCid.get(cid);
- if (gdetail != null)
+ GlyphDetail detail = codeToDetail.get(code);
+ if (detail != null)
{
- gdetail.throwExceptionIfNotValid();
+ detail.throwExceptionIfNotValid();
already = true;
}
return already;
}
/**
- * Extract the Glyph width for the given CID.
- *
- * @param cid
- * @return The Glyph width in 'em' unit.
- * @throws GlyphException
- */
- protected abstract float getFontProgramWidth(int cid) throws GlyphException;
-
- /**
* Test if both widths are consistent. At the end of this method, the CID is
* marked as valid or invalid.
*
- * @param cid
- * @param expectedWidth
+ * @param code character code
+ * @param expectedWidth expected with given in the PDF file
* @param foundWidth the glyph width found in the font program, a negative
* value if the CID is missing from the font.
* @throws GlyphException the appropriate exception if the CID is invalid.
*/
- protected void checkWidthsConsistency(int cid, float expectedWidth, float foundWidth) throws GlyphException
+ private void checkWidthsConsistency(int code, float expectedWidth, float foundWidth) throws GlyphException
{
- if (foundWidth < 0)
- {
- GlyphException e = new GlyphException(PreflightConstants.ERROR_FONTS_GLYPH_MISSING, cid, "The character \""
- + cid + "\" in the font program \"" + this.font.getBaseFont()
- + "\" is missing from the Charater Encoding.");
- markCIDAsInvalid(cid, e);
- throw e;
- }
-
// consistent is defined to be a difference of no more than 1/1000 unit.
if (Math.abs(foundWidth - expectedWidth) > 1)
{
- GlyphException e = new GlyphException(PreflightConstants.ERROR_FONTS_METRICS, cid,
- "Width (" + foundWidth + ") of the character \"" + cid + "\" in the font program \"" + this.font.getBaseFont()
+ GlyphException e = new GlyphException(PreflightConstants.ERROR_FONTS_METRICS, code,
+ "Width (" + foundWidth + ") of the character \"" + code + "\" in the font program \"" + this.font.getName()
+ "\" is inconsistent with the width (" + expectedWidth + ") in the PDF dictionary.");
- markCIDAsInvalid(cid, e);
+ markAsInvalid(code, e);
throw e;
}
- markCIDAsValid(cid);
+ markAsValid(code);
}
- public final void markCIDAsValid(int cid)
+ public final void markAsValid(int code)
{
- this.computedCid.put(cid, new GlyphDetail(cid));
+ this.codeToDetail.put(code, new GlyphDetail(code));
}
- public final void markCIDAsInvalid(int cid, GlyphException gex)
+ public final void markAsInvalid(int code, GlyphException e)
{
- this.computedCid.put(cid, new GlyphDetail(cid, gex));
+ this.codeToDetail.put(code, new GlyphDetail(code, e));
}
}
Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/TrueTypeContainer.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/TrueTypeContainer.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/TrueTypeContainer.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/TrueTypeContainer.java Thu Oct 9 05:15:25 2014
@@ -22,191 +22,23 @@
package org.apache.pdfbox.preflight.font.container;
import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.fontbox.ttf.CmapSubtable;
-import org.apache.fontbox.ttf.CmapTable;
-import org.apache.fontbox.ttf.TrueTypeFont;
-import org.apache.pdfbox.pdmodel.font.encoding.Encoding;
-import org.apache.pdfbox.pdmodel.font.encoding.GlyphList;
import org.apache.pdfbox.pdmodel.font.PDTrueTypeFont;
-import org.apache.pdfbox.preflight.PreflightConstants;
-import org.apache.pdfbox.preflight.font.util.GlyphException;
-public class TrueTypeContainer extends FontContainer
+public class TrueTypeContainer extends FontContainer<PDTrueTypeFont>
{
- protected TrueTypeFont ttFont;
- private CmapSubtable[] cmapEncodingEntries = null;
- private PDTrueTypeFont trueTypeFont;
-
public TrueTypeContainer(PDTrueTypeFont font)
{
super(font);
- this.trueTypeFont = font;
- }
-
- public void setTrueTypeFont(TrueTypeFont ttFont)
- {
- this.ttFont = ttFont;
- initCMapEncodingEntries(); // TODO appel sur le checkWidth
- }
-
- /**
- * Initialize the {@linkplain #cmapEncodingEntries} with CMaps that belong to the TrueType Font Program.
- *
- * Here the selection rules :
- * <UL>
- * <li>For a Symbolic TrueType, the Font Program has only one CMap (Checked in the checkFontFileElement method)
- * <li>For a Non-Symbolic TrueType, the list of CMap is reordered to provide WinAnsi CMap first (plateformId : 3 /
- * encodingId : 1) followed by MacRoman CMap (plateformId : 1 / encodingId : 0). This CMap returns the CMap which
- * corresponds to the Encoding value of the FontDescriptor dictionary.
- * </UL>
- */
- protected void initCMapEncodingEntries()
- {
- if (this.cmapEncodingEntries != null)
- return;
-
- try
- {
- CmapTable cmap = this.ttFont.getCmap();
- if (this.trueTypeFont.getFontDescriptor().isSymbolic())
- {
- this.cmapEncodingEntries = cmap.getCmaps();
- }
- else
- {
- this.cmapEncodingEntries = orderCMapEntries(cmap);
- }
- }
- catch (IOException e)
- {
- return;
- }
- }
-
- private CmapSubtable[] orderCMapEntries(CmapTable cmap)
- {
- List<CmapSubtable> res = new ArrayList<CmapSubtable>();
- boolean firstIs31 = false;
- for (CmapSubtable cmapEntry : cmap.getCmaps())
- {
- // WinAnsi
- if ((cmapEntry.getPlatformId() == 3) && (cmapEntry.getPlatformEncodingId() == 1))
- {
- res.add(0, cmapEntry);
- firstIs31 = true;
- }
- else if ((cmapEntry.getPlatformId() == 1) && (cmapEntry.getPlatformEncodingId() == 0))
- {
- // MacRoman
- if (firstIs31)
- {
- // WinAnsi is present, MacRoman is set in second position
- res.add(1, cmapEntry);
- }
- else
- {
- // WinAnsi is missing, MacRoman has the priority
- res.add(0, cmapEntry);
- }
- }
- else
- {
- res.add(cmapEntry);
- }
- }
- return res.toArray(new CmapSubtable[res.size()]);
}
@Override
- protected float getFontProgramWidth(int cid) throws GlyphException
- {
- try
- {
- float result = -1f;
- if (cmapEncodingEntries != null)
- {
- for (CmapSubtable entry : cmapEncodingEntries)
- {
- int glyphID = extractGlyphID(cid, entry);
- if (glyphID > 0)
- {
- result = extractGlyphWidth(glyphID);
- break;
- }
- }
- }
- return result;
- }
- catch (IOException e)
- {
- throw new GlyphException(PreflightConstants.ERROR_FONTS_GLYPH, cid, "Unexpected error during the width validation for the character CID(" + cid+") : " + e.getMessage());
- }
- }
-
- /**
- * TrueType has internal CMap that map the CID used in the PDF file with an internal character identifier. This
- * method converts the given CID in the internal font program identifier. (0 if no match found)
- *
- * @param cid
- * @param cmap
- * @return
- */
- private int extractGlyphID(int cid, CmapSubtable cmap)
- {
- int notFoundGlyphID = 0;
-
- int innerFontCid = cid;
- if (cmap.getPlatformEncodingId() == 1 && cmap.getPlatformId() == 3)
- {
- Encoding fontEncoding = this.trueTypeFont.getEncoding();
- String name = fontEncoding.getName(cid);
- String character = GlyphList.getAdobeGlyphList().toUnicode(name);
- if (character == null)
- {
- return notFoundGlyphID;
- }
-
- char[] characterArray = character.toCharArray();
- if (characterArray.length == 1)
- {
- innerFontCid = (int) characterArray[0];
- }
- else
- {
- // TODO OD-PDFA-87 A faire?
- innerFontCid = (int) characterArray[0];
- for (int i = 1; i < characterArray.length; ++i)
- {
- if (cmap.getGlyphId((int) characterArray[i]) == 0)
- {
- return notFoundGlyphID; // TODO what we have to do here ???
- }
- }
- }
- }
-
- // search glyph
- return cmap.getGlyphId(innerFontCid);
- }
-
- private float extractGlyphWidth(int glyphID) throws IOException
+ public boolean hasGlyph(int code) throws IOException
{
- int unitsPerEm = this.ttFont.getHeader().getUnitsPerEm();
- int[] glyphWidths = this.ttFont.getHorizontalMetrics().getAdvanceWidth();
- /*
- * In a Mono space font program, the length of the AdvanceWidth array must be one. According to the TrueType
- * font specification, the Last Value of the AdvanceWidth array is apply to the subsequent glyphs. So if the
- * GlyphId is greater than the length of the array the last entry is used.
- */
- int numberOfLongHorMetrics = this.ttFont.getHorizontalHeader().getNumberOfHMetrics();
- float glypdWidth = glyphWidths[numberOfLongHorMetrics - 1];
- if (glyphID < numberOfLongHorMetrics)
+ if (font.isEmbedded())
{
- glypdWidth = glyphWidths[glyphID];
+ int gid = font.codeToGID(code);
+ return gid != 0;
}
- return ((glypdWidth * 1000) / unitsPerEm);
+ return false;
}
}
Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/Type0Container.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/Type0Container.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/Type0Container.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/Type0Container.java Thu Oct 9 05:15:25 2014
@@ -21,33 +21,21 @@
package org.apache.pdfbox.preflight.font.container;
+import java.io.IOException;
import java.util.List;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.preflight.ValidationResult.ValidationError;
-import org.apache.pdfbox.preflight.font.util.GlyphException;
public class Type0Container extends FontContainer
{
-
- protected FontContainer delegateFontContainer;
+ private FontContainer delegateFontContainer;
public Type0Container(PDFont font)
{
super(font);
}
- @Override
- protected float getFontProgramWidth(int cid) throws GlyphException
- {
- float width = 0;
- if (this.delegateFontContainer != null)
- {
- width = this.delegateFontContainer.getFontProgramWidth(cid);
- }
- return width;
- }
-
public void setDelegateFontContainer(FontContainer delegateFontContainer)
{
this.delegateFontContainer = delegateFontContainer;
@@ -81,4 +69,10 @@ public class Type0Container extends Font
}
return result;
}
+
+ @Override
+ public boolean hasGlyph(int code) throws IOException
+ {
+ return this.delegateFontContainer.hasGlyph(code);
+ }
}
Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/Type1Container.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/Type1Container.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/Type1Container.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/Type1Container.java Thu Oct 9 05:15:25 2014
@@ -22,89 +22,23 @@
package org.apache.pdfbox.preflight.font.container;
import java.io.IOException;
-import java.util.List;
+import org.apache.pdfbox.pdmodel.font.PDType1Font;
-import org.apache.fontbox.cff.CFFFont;
-import org.apache.fontbox.cff.CFFType1Font;
-import org.apache.pdfbox.pdmodel.font.PDSimpleFont;
-import org.apache.pdfbox.preflight.PreflightConstants;
-import org.apache.pdfbox.preflight.font.util.GlyphException;
-import org.apache.pdfbox.preflight.font.util.Type1;
-
-public class Type1Container extends FontContainer
+public class Type1Container extends FontContainer<PDType1Font>
{
- /**
- * Represent the missingWidth value of the FontDescriptor dictionary. According to the PDF Reference, if this value
- * is missing, the default one is 0.
- */
- private float defaultGlyphWidth = 0;
-
- /**
- * true if information come from the FontFile1 Stream, false if they come from the FontFile3
- */
- protected boolean isFontFile1 = true;
-
- protected Type1 type1Font;
- protected List<CFFFont> lCFonts;
-
- private PDSimpleFont simpleFont;
-
- public Type1Container(PDSimpleFont font)
+ public Type1Container(PDType1Font font)
{
super(font);
- this.simpleFont = font;
}
@Override
- protected float getFontProgramWidth(int cid) throws GlyphException
+ public boolean hasGlyph(int code) throws IOException
{
- // fixme: Type 1 fonts don't use CIDs, so this method makes little sense,
- // when making changes I've assumed that "cid" is actually the character code
- // from the PDF content stream.
-
- float widthResult = -1;
- try
+ if (font.isEmbedded())
{
- if (isFontFile1)
- {
- if (type1Font != null)
- {
- widthResult = this.type1Font.getWidthOfCID(cid);
- }
- }
- else
- {
- // assuming that "cid" is actually the character code
- String name = simpleFont.getEncoding().getName(cid);
- if (name.equals(".notdef"))
- {
- throw new GlyphException(PreflightConstants.ERROR_FONTS_GLYPH_MISSING, cid, "Unknown character CID(" + cid+")");
- }
-
- CFFType1Font cffFont = (CFFType1Font)lCFonts.get(0);
- widthResult = cffFont.getType1CharString(name).getWidth();
- }
+ String name = font.codeToName(code);
+ return font.getType1Font().hasGlyph(name);
}
- catch (IOException e)
- {
- throw new GlyphException(PreflightConstants.ERROR_FONTS_GLYPH, cid, "Unexpected error during the width validation for the character CID(" + cid+") : " + e.getMessage());
- }
-
- return widthResult;
- }
-
- public void setType1Font(Type1 type1Font)
- {
- this.type1Font = type1Font;
- }
-
- public void setFontFile1(boolean isFontFile1)
- {
- this.isFontFile1 = isFontFile1;
- }
-
- public void setCFFFontObjects(List<CFFFont> lCFonts)
- {
- this.lCFonts = lCFonts;
+ return false;
}
}
Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/Type3Container.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/Type3Container.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/Type3Container.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/Type3Container.java Thu Oct 9 05:15:25 2014
@@ -21,24 +21,23 @@
package org.apache.pdfbox.preflight.font.container;
-import org.apache.pdfbox.pdmodel.font.PDFont;
+import java.io.IOException;
+import org.apache.pdfbox.pdmodel.font.PDType3Font;
/**
* Because Type3 font program is an inner type of the PDF file, this font container is quite different from the other
* because all character/glyph are already checked.
*/
-public class Type3Container extends FontContainer
+public class Type3Container extends FontContainer<PDType3Font>
{
-
- public Type3Container(PDFont font)
+ public Type3Container(PDType3Font font)
{
super(font);
}
@Override
- protected float getFontProgramWidth(int cid)
+ public boolean hasGlyph(int code) throws IOException
{
- return 0;
+ return font.getCharStream(code) != null;
}
-
}
Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/CIDType0DescriptorHelper.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/CIDType0DescriptorHelper.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/CIDType0DescriptorHelper.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/CIDType0DescriptorHelper.java Thu Oct 9 05:15:25 2014
@@ -49,7 +49,6 @@ import org.apache.pdfbox.preflight.utils
public class CIDType0DescriptorHelper extends FontDescriptorHelper<CIDType0Container>
{
-
public CIDType0DescriptorHelper(PreflightContext context, PDFontLike font, CIDType0Container fontContainer)
{
super(context, font, fontContainer);
@@ -61,9 +60,7 @@ public class CIDType0DescriptorHelper ex
PDStream ff3 = fontDescriptor.getFontFile3();
if (ff3 != null)
{
- /*
- * Stream validation should be done by the StreamValidateHelper. Process font specific check
- */
+ // Stream validation should be done by the StreamValidateHelper. Process font specific check
COSStream stream = ff3.getStream();
if (stream == null)
{
@@ -73,10 +70,8 @@ public class CIDType0DescriptorHelper ex
}
else
{
- /*
- * Lengthx aren't mandatory for this type of font But the Subtype is a mandatory field with specific
- * values
- */
+ // Length1/2/3 aren't mandatory for this type of font
+ // But the Subtype is a mandatory field with specific values
String st = stream.getNameAsString(COSName.SUBTYPE);
if (!(FONT_DICTIONARY_VALUE_TYPE0C.equals(st) || FONT_DICTIONARY_VALUE_TYPE1C.equals(st)))
{
@@ -113,23 +108,9 @@ public class CIDType0DescriptorHelper ex
@Override
protected void processFontFile(PDFontDescriptor fontDescriptor, PDStream fontFile)
{
- /*
- * try to load the font using the java.awt.font object. if the font is invalid, an exception will be thrown
- */
- try
- {
- CFFParser cffParser = new CFFParser();
- List<CFFFont> lCFonts = cffParser.parse(fontFile.getByteArray());
- if (lCFonts == null || lCFonts.isEmpty())
- {
- this.fContainer.push(new ValidationError(ERROR_FONTS_CID_DAMAGED, "The FontFile can't be read"));
- }
- fContainer.setlCFonts(lCFonts);
- }
- catch (IOException e)
+ if (font.isDamaged())
{
- this.fContainer.push(new ValidationError(ERROR_FONTS_CID_DAMAGED, "The FontFile can't be read", e));
+ this.fContainer.push(new ValidationError(ERROR_FONTS_CID_DAMAGED, "The FontFile can't be read"));
}
}
-
}
Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/CIDType2DescriptorHelper.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/CIDType2DescriptorHelper.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/CIDType2DescriptorHelper.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/CIDType2DescriptorHelper.java Thu Oct 9 05:15:25 2014
@@ -26,10 +26,6 @@ import static org.apache.pdfbox.prefligh
import static org.apache.pdfbox.preflight.PreflightConstants.ERROR_FONTS_FONT_FILEX_INVALID;
import static org.apache.pdfbox.preflight.PreflightConstants.FONT_DICTIONARY_KEY_CIDSET;
-import java.io.ByteArrayInputStream;
-
-import org.apache.fontbox.ttf.TTFParser;
-import org.apache.fontbox.ttf.TrueTypeFont;
import org.apache.pdfbox.cos.COSBase;
import org.apache.pdfbox.cos.COSDocument;
import org.apache.pdfbox.cos.COSName;
@@ -78,9 +74,7 @@ public class CIDType2DescriptorHelper ex
PDStream ff2 = fontDescriptor.getFontFile2();
if (ff2 != null)
{
- /*
- * Stream validation should be done by the StreamValidateHelper. Process font specific check
- */
+ // Stream validation should be done by the StreamValidateHelper. Process font specific check
COSStream stream = ff2.getStream();
if (stream == null)
{
@@ -96,26 +90,9 @@ public class CIDType2DescriptorHelper ex
@Override
protected void processFontFile(PDFontDescriptor fontDescriptor, PDStream fontFile)
{
- /*
- * try to load the font using the java.awt.font object. if the font is invalid, an exception will be thrown
- */
- TrueTypeFont ttf = null;
- try
- {
- /*
- * According to PDF Reference, CIDFontType2 is a TrueType font. Remark : Java.awt.Font throws exception when
- * a CIDFontType2 is parsed even if it is valid.
- */
- ttf = new TTFParser(true).parse(new ByteArrayInputStream(fontFile.getByteArray()));
- this.fContainer.setTtf(ttf);
- }
- catch (Exception e)
+ if (font.isDamaged())
{
- /*
- * Exceptionally, Exception is catched Here because of damaged font can throw NullPointer Exception...
- */
this.fContainer.push(new ValidationError(ERROR_FONTS_CID_DAMAGED, "The FontFile can't be read"));
}
}
-
}
Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/TrueTypeDescriptorHelper.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/TrueTypeDescriptorHelper.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/TrueTypeDescriptorHelper.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/TrueTypeDescriptorHelper.java Thu Oct 9 05:15:25 2014
@@ -36,16 +36,19 @@ import org.apache.pdfbox.cos.COSStream;
import org.apache.pdfbox.pdmodel.common.PDStream;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDFontDescriptor;
+import org.apache.pdfbox.pdmodel.font.PDTrueTypeFont;
import org.apache.pdfbox.preflight.PreflightContext;
import org.apache.pdfbox.preflight.ValidationResult.ValidationError;
import org.apache.pdfbox.preflight.font.container.TrueTypeContainer;
public class TrueTypeDescriptorHelper extends FontDescriptorHelper<TrueTypeContainer>
{
+ private final PDTrueTypeFont pdTrueTypeFont;
- public TrueTypeDescriptorHelper(PreflightContext context, PDFont font, TrueTypeContainer fontContainer)
+ public TrueTypeDescriptorHelper(PreflightContext context, PDTrueTypeFont font, TrueTypeContainer fontContainer)
{
super(context, font, fontContainer);
+ pdTrueTypeFont = font;
}
@Override
@@ -74,36 +77,29 @@ public class TrueTypeDescriptorHelper ex
@Override
protected void processFontFile(PDFontDescriptor fontDescriptor, PDStream fontFile)
{
- /*
- * Try to load the font using the TTFParser object. If the font is invalid, an exception will be thrown. Because
- * of it is a Embedded Font Program, some tables are required and other are optional see PDF Reference (§5.8)
- */
- ByteArrayInputStream bis = null;
- try
+ if (font.isDamaged())
{
-
- bis = new ByteArrayInputStream(fontFile.getByteArray());
- TrueTypeFont ttf = new TTFParser(true).parse(bis);
-
- if (fontDescriptor.isSymbolic() && ttf.getCmap().getCmaps().length != 1)
+ this.fContainer.push(new ValidationError(ERROR_FONTS_TRUETYPE_DAMAGED,
+ "The FontFile can't be read for " + this.font.getName()));
+ }
+ else
+ {
+ // there must be exactly one encoding in the "cmap" table if the font is symbolic
+ TrueTypeFont ttf = pdTrueTypeFont.getTrueTypeFont();
+ try
{
- this.fContainer.push(new ValidationError(ERROR_FONTS_ENCODING,
- "The Encoding should be missing for the Symbolic TTF"));
+ if (pdTrueTypeFont.isSymbolic() && ttf.getCmap().getCmaps().length != 1)
+ {
+ this.fContainer.push(new ValidationError(ERROR_FONTS_ENCODING,
+ "Symbolic TrueType font has more than one 'cmap' entry for " +
+ this.font.getName()));
+ }
}
- else
+ catch (IOException e)
{
- ((TrueTypeContainer) this.fContainer).setTrueTypeFont(ttf);
- // TODO check the WIdth consistency too
+ this.fContainer.push(new ValidationError(ERROR_FONTS_TRUETYPE_DAMAGED,
+ "The TTF 'cmap' could not be read for " + this.font.getName()));
}
}
- catch (IOException e)
- {
- this.fContainer.push(new ValidationError(ERROR_FONTS_TRUETYPE_DAMAGED, "The FontFile can't be read for "
- + this.font.getName()));
- }
- finally
- {
- IOUtils.closeQuietly(bis);
- }
}
}
Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/Type1DescriptorHelper.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/Type1DescriptorHelper.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/Type1DescriptorHelper.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/Type1DescriptorHelper.java Thu Oct 9 05:15:25 2014
@@ -22,40 +22,27 @@
package org.apache.pdfbox.preflight.font.descriptor;
import static org.apache.pdfbox.preflight.PreflightConstants.ERROR_FONTS_CHARSET_MISSING_FOR_SUBSET;
-import static org.apache.pdfbox.preflight.PreflightConstants.ERROR_FONTS_CID_DAMAGED;
import static org.apache.pdfbox.preflight.PreflightConstants.ERROR_FONTS_FONT_FILEX_INVALID;
+import static org.apache.pdfbox.preflight.PreflightConstants.ERROR_FONTS_TRUETYPE_DAMAGED;
import static org.apache.pdfbox.preflight.PreflightConstants.ERROR_FONTS_TYPE1_DAMAGED;
import static org.apache.pdfbox.preflight.PreflightConstants.FONT_DICTIONARY_KEY_LENGTH2;
import static org.apache.pdfbox.preflight.PreflightConstants.FONT_DICTIONARY_KEY_LENGTH3;
import static org.apache.pdfbox.preflight.font.FontValidator.isSubSet;
-import java.awt.Font;
-import java.awt.FontFormatException;
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.util.List;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.fontbox.cff.CFFFont;
-import org.apache.fontbox.cff.CFFParser;
import org.apache.pdfbox.cos.COSDictionary;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.cos.COSStream;
import org.apache.pdfbox.pdmodel.common.PDStream;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDFontDescriptor;
-import org.apache.pdfbox.pdmodel.font.PDSimpleFont;
+import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.apache.pdfbox.preflight.PreflightContext;
import org.apache.pdfbox.preflight.ValidationResult.ValidationError;
import org.apache.pdfbox.preflight.font.container.Type1Container;
-import org.apache.pdfbox.preflight.font.util.Type1;
-import org.apache.pdfbox.preflight.font.util.Type1Parser;
public class Type1DescriptorHelper extends FontDescriptorHelper<Type1Container>
{
- private boolean isFontFile1 = true;
-
- public Type1DescriptorHelper(PreflightContext context, PDFont font, Type1Container fontContainer)
+ public Type1DescriptorHelper(PreflightContext context, PDType1Font font, Type1Container fontContainer)
{
super(context, font, fontContainer);
}
@@ -111,8 +98,6 @@ public class Type1DescriptorHelper exten
}
else
{
- this.isFontFile1 = false;
- this.fContainer.setFontFile1(isFontFile1);
return ff3;
}
}
@@ -120,80 +105,10 @@ public class Type1DescriptorHelper exten
@Override
protected void processFontFile(PDFontDescriptor fontDescriptor, PDStream fontFile)
{
- if (isFontFile1)
- {
- processFontFile1(fontDescriptor, fontFile);
- }
- else
- {
- processFontFile3(fontDescriptor, fontFile);
- }
- }
-
- /**
- * Try to load the font using the java.awt.font object. If the font is
- * invalid, an exception will be pushed in the font container
- *
- * @param fontDescriptor
- * @param fontFile
- */
- protected void processFontFile1(PDFontDescriptor fontDescriptor, PDStream fontFile)
- {
- ByteArrayInputStream bis = null;
- try
- {
- bis = new ByteArrayInputStream(fontFile.getByteArray());
- Font.createFont(Font.TYPE1_FONT, bis);
- IOUtils.closeQuietly(bis);
-
- // Parse the Type1 Font program in order to extract Glyph Width
- COSStream streamObj = fontFile.getStream();
- int length1 = streamObj.getInt(COSName.LENGTH1);
- int length2 = streamObj.getInt(COSName.LENGTH2);
- bis = new ByteArrayInputStream(fontFile.getByteArray());
- Type1Parser parserForMetrics = Type1Parser.createParserWithEncodingObject(bis, length1, length2,
- ((PDSimpleFont) font).getEncoding());
- Type1 parsedData = parserForMetrics.parse();
-
- this.fContainer.setType1Font(parsedData);
- }
- catch (IOException e)
- {
- this.fContainer.push(new ValidationError(ERROR_FONTS_TYPE1_DAMAGED,
- "The FontFile can't be read for " + font.getName() + ": " + e.getMessage(), e));
- }
- catch (FontFormatException e)
- {
- this.fContainer.push(new ValidationError(ERROR_FONTS_TYPE1_DAMAGED,
- "The FontFile is damaged for " + font.getName() + ": " + e.getMessage(), e));
- }
- finally
- {
- IOUtils.closeQuietly(bis);
- }
- }
-
- /**
- * Type1C is a CFF font format, extract all CFFFont objects from the stream
- *
- * @param fontDescriptor The font descriptor
- * @param fontFile The font file
- */
- protected void processFontFile3(PDFontDescriptor fontDescriptor, PDStream fontFile)
- {
- try
- {
- CFFParser cffParser = new CFFParser();
- List<CFFFont> lCFonts = cffParser.parse(fontFile.getByteArray());
- if (lCFonts == null || lCFonts.isEmpty())
- {
- this.fContainer.push(new ValidationError(ERROR_FONTS_CID_DAMAGED, "The FontFile can't be read"));
- }
- this.fContainer.setCFFFontObjects(lCFonts);
- }
- catch (IOException e)
+ if (font.isDamaged())
{
- this.fContainer.push(new ValidationError(ERROR_FONTS_CID_DAMAGED, "The FontFile can't be read", e));
+ this.fContainer.push(new ValidationError(ERROR_FONTS_TYPE1_DAMAGED,
+ "The FontFile can't be read for " + this.font.getName()));
}
}
}
Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/util/GlyphDetail.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/util/GlyphDetail.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/util/GlyphDetail.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/util/GlyphDetail.java Thu Oct 9 05:15:25 2014
@@ -23,30 +23,41 @@ package org.apache.pdfbox.preflight.font
public class GlyphDetail
{
- private GlyphException invalidGlyphError = null;
- private int charecterIdentifier = 0;
+ private final int code;
+ private final GlyphException exception;
- public GlyphDetail(int cid)
+ /**
+ * @param code character code
+ */
+ public GlyphDetail(int code)
{
- this.charecterIdentifier = cid;
+ this.code = code;
+ this.exception = null;
}
- public GlyphDetail(int cid, GlyphException error)
+ /**
+ * @param code character code
+ * @param error glyph exception
+ */
+ public GlyphDetail(int code, GlyphException error)
{
- this.charecterIdentifier = cid;
- this.invalidGlyphError = error;
+ this.code = code;
+ this.exception = error;
}
public void throwExceptionIfNotValid() throws GlyphException
{
- if (this.invalidGlyphError != null)
+ if (this.exception != null)
{
- throw this.invalidGlyphError;
+ throw this.exception;
}
}
- public int getCID()
+ /**
+ * Returns the character code.
+ */
+ public int getCode()
{
- return this.charecterIdentifier;
+ return this.code;
}
}
Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/util/GlyphException.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/util/GlyphException.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/util/GlyphException.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/util/GlyphException.java Thu Oct 9 05:15:25 2014
@@ -26,17 +26,17 @@ public class GlyphException extends Exce
private String errorCode;
private int invalidCid;
- public GlyphException(String code, int cid)
+ public GlyphException(String errorCode, int cid)
{
super();
- this.errorCode = code;
+ this.errorCode = errorCode;
this.invalidCid = cid;
}
- public GlyphException(String code, int cid, String message)
+ public GlyphException(String errorCode, int cid, String message)
{
super(message);
- this.errorCode = code;
+ this.errorCode = errorCode;
this.invalidCid = cid;
}
Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/process/reflect/FontValidationProcess.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/process/reflect/FontValidationProcess.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/process/reflect/FontValidationProcess.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/process/reflect/FontValidationProcess.java Thu Oct 9 05:15:25 2014
@@ -34,6 +34,7 @@ import static org.apache.pdfbox.prefligh
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDSimpleFont;
import org.apache.pdfbox.pdmodel.font.PDTrueTypeFont;
+import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.apache.pdfbox.pdmodel.font.PDType3Font;
import org.apache.pdfbox.preflight.PreflightConstants;
import org.apache.pdfbox.preflight.PreflightContext;
@@ -89,7 +90,7 @@ public class FontValidationProcess exten
}
else if (FONT_DICTIONARY_VALUE_MMTYPE.equals(subtype) || FONT_DICTIONARY_VALUE_TYPE1.equals(subtype))
{
- return new Type1FontValidator(context, (PDSimpleFont)font);
+ return new Type1FontValidator(context, (PDType1Font)font);
}
else if (FONT_DICTIONARY_VALUE_TYPE3.equals(subtype))
{
Modified: pdfbox/trunk/preflight/src/test/java/org/apache/pdfbox/preflight/TestIsartor.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/test/java/org/apache/pdfbox/preflight/TestIsartor.java?rev=1630284&r1=1630283&r2=1630284&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/test/java/org/apache/pdfbox/preflight/TestIsartor.java (original)
+++ pdfbox/trunk/preflight/src/test/java/org/apache/pdfbox/preflight/TestIsartor.java Thu Oct 9 05:15:25 2014
@@ -124,7 +124,7 @@ public class TestIsartor
{
result = e.getResult();
}
- assertFalse(path.getName() + " : Isartor file should be invalid", result.isValid());
+ assertFalse(path.getName() + " : Isartor file should be invalid (expected " + this.expectedError + ")", result.isValid());
assertTrue(path.getName() + " : Should find at least one error", result.getErrorsList().size() > 0);
// could contain more than one error