Author: lehmi Date: Wed Dec 25 11:12:48 2019 New Revision: 1871960 URL: http://svn.apache.org/viewvc?rev=1871960&view=rev Log: PDFBOX-4720: support widely used malformed bfranges identical to an identity mapping
Modified: pdfbox/branches/issue4569/ (props changed) pdfbox/branches/issue4569/fontbox/src/main/java/org/apache/fontbox/cmap/CMapParser.java Propchange: pdfbox/branches/issue4569/ ------------------------------------------------------------------------------ Merged /pdfbox/branches/2.0:r1871957 Modified: pdfbox/branches/issue4569/fontbox/src/main/java/org/apache/fontbox/cmap/CMapParser.java URL: http://svn.apache.org/viewvc/pdfbox/branches/issue4569/fontbox/src/main/java/org/apache/fontbox/cmap/CMapParser.java?rev=1871960&r1=1871959&r2=1871960&view=diff ============================================================================== --- pdfbox/branches/issue4569/fontbox/src/main/java/org/apache/fontbox/cmap/CMapParser.java (original) +++ pdfbox/branches/issue4569/fontbox/src/main/java/org/apache/fontbox/cmap/CMapParser.java Wed Dec 25 11:12:48 2019 @@ -384,10 +384,28 @@ public class CMapParser // PDFBOX-3450: ignore <> if (tokenBytes.length > 0) { - // PDFBOX-4661: avoid overflow of the last byte, all following values are undefined - int values = Math.min(end - start, - 255 - (tokenBytes[tokenBytes.length - 1] & 0xFF)) + 1; - addMappingFrombfrange(result, startCode, values, tokenBytes); + // PDFBOX-4720: + // some pdfs use the malformed bfrange <0000> <FFFF> <0000>. Add support by adding a identity + // mapping for the whole range instead of cutting it after 255 entries + // TODO find a more efficient method to represent all values for a identity mapping + if (tokenBytes.length == 2 && start == 0 && end == 0xffff + && tokenBytes[0] == 0 && tokenBytes[1] == 0) + { + for (int i = 0; i < 256; i++) + { + startCode[1] = (byte) i; + tokenBytes[1] = (byte) i; + addMappingFrombfrange(result, startCode, 0xff, tokenBytes); + + } + } + else + { + // PDFBOX-4661: avoid overflow of the last byte, all following values are undefined + int values = Math.min(end - start, + 255 - (tokenBytes[tokenBytes.length - 1] & 0xFF)) + 1; + addMappingFrombfrange(result, startCode, values, tokenBytes); + } } } }