Author: lehmi
Date: Tue Mar 13 19:25:11 2012
New Revision: 1300296
URL: http://svn.apache.org/viewvc?rev=1300296&view=rev
Log:
PDFBOX-1252: avoid that the ToUnicode mapping overrides the encoding cmap
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFont.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/PDSimpleFont.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType0Font.java
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFont.java
URL:
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFont.java?rev=1300296&r1=1300295&r2=1300296&view=diff
==============================================================================
---
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFont.java
(original)
+++
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFont.java
Tue Mar 13 19:25:11 2012
@@ -322,7 +322,7 @@ public abstract class PDCIDFont extends
{
String resourceName = resourceRootCMAP + cidSystemInfo;
try {
- parseCmap( resourceRootCMAP, ResourceLoader.loadResource(
resourceName ) );
+ cmap = parseCmap( resourceRootCMAP,
ResourceLoader.loadResource( resourceName ));
if( cmap == null)
{
log.error("Error: Could not parse predefined CMAP file
for '" + cidSystemInfo + "'" );
@@ -346,7 +346,7 @@ public abstract class PDCIDFont extends
String result = null;
if (cmap != null)
{
- result = cmapEncoding(getCodeFromArray( c, offset, length ),
length, true);
+ result = cmapEncoding(getCodeFromArray( c, offset, length ),
length, true, cmap);
}
else
{
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=1300296&r1=1300295&r2=1300296&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
Tue Mar 13 19:25:11 2012
@@ -85,6 +85,11 @@ public abstract class PDFont implements
*/
protected CMap cmap = null;
+ /**
+ * The CMap holding the ToUnicode mapping
+ */
+ protected CMap toUnicodeCmap = null;
+
private boolean hasToUnicode = false;
protected static Map<String, CMap> cmapObjects =
@@ -472,15 +477,15 @@ public abstract class PDFont implements
* @return The value of the encoded character.
* @throws IOException if something went wrong
*/
- protected String cmapEncoding( int code, int length, boolean isCIDFont )
throws IOException
+ protected String cmapEncoding( int code, int length, boolean isCIDFont,
CMap sourceCmap ) throws IOException
{
String retval = null;
- if (cmap != null)
+ if (sourceCmap != null)
{
- retval = cmap.lookup(code, length);
+ retval = sourceCmap.lookup(code, length);
if (retval == null && isCIDFont)
{
- retval = cmap.lookupCID(code);
+ retval = sourceCmap.lookupCID(code);
}
}
return retval;
@@ -500,9 +505,13 @@ public abstract class PDFont implements
{
String retval = null;
int code = getCodeFromArray( c, offset, length );
- if( cmap != null )
+ if( toUnicodeCmap != null )
+ {
+ retval = cmapEncoding(code, length, false, toUnicodeCmap);
+ }
+ if( retval == null && cmap != null )
{
- retval = cmapEncoding(code, length, false);
+ retval = cmapEncoding(code, length, false, cmap);
}
// there is no cmap but probably an encoding with a suitable mapping
@@ -568,22 +577,24 @@ public abstract class PDFont implements
return retval;
}
- protected void parseCmap( String cmapRoot, InputStream cmapStream)
+ protected CMap parseCmap( String cmapRoot, InputStream cmapStream)
{
+ CMap targetCmap = null;
if( cmapStream != null )
{
CMapParser parser = new CMapParser();
try
{
- cmap = parser.parse( cmapRoot, cmapStream );
+ targetCmap = parser.parse( cmapRoot, cmapStream );
// limit the cache to external CMaps
if (cmapRoot != null)
{
- cmapObjects.put( cmap.getName(), cmap );
+ cmapObjects.put( targetCmap.getName(), targetCmap );
}
}
catch (IOException exception) {}
}
+ return targetCmap;
}
/**
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDSimpleFont.java
URL:
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDSimpleFont.java?rev=1300296&r1=1300295&r2=1300296&view=diff
==============================================================================
---
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDSimpleFont.java
(original)
+++
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDSimpleFont.java
Tue Mar 13 19:25:11 2012
@@ -398,7 +398,7 @@ public abstract class PDSimpleFont exten
COSStream encodingStream = (COSStream)encoding;
try
{
- parseCmap( null, encodingStream.getUnfilteredStream()
);
+ cmap = parseCmap( null,
encodingStream.getUnfilteredStream() );
}
catch(IOException exception)
{
@@ -426,7 +426,7 @@ public abstract class PDSimpleFont exten
String resourceName = resourceRootCMAP + cmapName;
try
{
- parseCmap( resourceRootCMAP, ResourceLoader.loadResource(
resourceName ) );
+ cmap = parseCmap( resourceRootCMAP,
ResourceLoader.loadResource( resourceName ) );
if( cmap == null && encodingName == null)
{
LOG.error("Error: Could not parse predefined CMAP file for
'" + cmapName + "'" );
@@ -451,32 +451,32 @@ public abstract class PDSimpleFont exten
{
try
{
- parseCmap(null,
((COSStream)toUnicode).getUnfilteredStream());
+ toUnicodeCmap = parseCmap(null,
((COSStream)toUnicode).getUnfilteredStream());
}
catch(IOException exception)
{
- LOG.error("Error: Could not load embedded CMAP" );
+ LOG.error("Error: Could not load embedded ToUnicode CMap"
);
}
}
else if ( toUnicode instanceof COSName)
{
encodingName = (COSName)toUnicode;
- cmap = cmapObjects.get( encodingName.getName() );
- if (cmap == null)
+ toUnicodeCmap = cmapObjects.get( encodingName.getName() );
+ if (toUnicodeCmap == null)
{
cmapName = encodingName.getName();
String resourceName = resourceRootCMAP + cmapName;
try
{
- parseCmap( resourceRootCMAP,
ResourceLoader.loadResource( resourceName ));
+ toUnicodeCmap = parseCmap( resourceRootCMAP,
ResourceLoader.loadResource( resourceName ));
}
catch(IOException exception)
{
- LOG.error("Error: Could not find predefined CMAP file
for '" + cmapName + "'" );
+ LOG.error("Error: Could not find predefined ToUnicode
CMap file for '" + cmapName + "'" );
}
- if( cmap == null)
+ if( toUnicodeCmap == null)
{
- LOG.error("Error: Could not parse predefined CMAP file
for '" + cmapName + "'" );
+ LOG.error("Error: Could not parse predefined ToUnicode
CMap file for '" + cmapName + "'" );
}
}
}
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=1300296&r1=1300295&r2=1300296&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
Tue Mar 13 19:25:11 2012
@@ -184,7 +184,7 @@ public class PDType0Font extends PDSimpl
int result = cmap.lookupCID(c, offset, length);
if (result != -1)
{
- return descendantFont.cmapEncoding(result, 2, true);
+ return descendantFont.cmapEncoding(result, 2, true, cmap);
}
return null;
}