Skip to content

Commit 615a6aa

Browse files
committed
Fix average glyph width calculation. Avoid divison by zero. Using average width if space is not found in font in case of text extraction. Unignore a parsing test
1 parent f3f8408 commit 615a6aa

File tree

7 files changed

+27
-17
lines changed

7 files changed

+27
-17
lines changed

basics/src/main/java/com/itextpdf/basics/font/CidFont.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@ public class CidFont extends FontProgram {
2323
for(int code : hMetrics.getKeys()) {
2424
avgWidth += hMetrics.get(code);
2525
}
26-
avgWidth /= hMetrics.size();
26+
if (hMetrics.size() != 0) {
27+
avgWidth /= hMetrics.size();
28+
}
2729
Map<String, Object> fontDesc = CidFontProperties.getAllFonts().get(fontNames.getFontName());
2830
if (fontDesc == null) {
2931
throw new PdfException("no.such.predefined.font.1").setMessageParams(fontName);

basics/src/main/java/com/itextpdf/basics/font/TrueTypeFont.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,9 @@ private void initializeFontProperties() throws IOException {
302302
avgWidth += glyph.getWidth();
303303
}
304304

305-
avgWidth /= codeToGlyph.size();
305+
if (codeToGlyph.size() != 0) {
306+
avgWidth /= codeToGlyph.size();
307+
}
306308

307309
readGdefTable();
308310
readGsubTable();

basics/src/main/java/com/itextpdf/basics/font/Type1Font.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,9 @@ protected void process() throws IOException {
340340
avgWidth += WX;
341341
widthCount++;
342342
}
343-
avgWidth /= widthCount;
343+
if (widthCount != 0) {
344+
avgWidth /= widthCount;
345+
}
344346
if (startKernPairs) {
345347
String metricsPath = fontParser.getAfmPath();
346348
if (metricsPath != null) {

core/src/main/java/com/itextpdf/core/font/DocTrueTypeFont.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,12 @@ static TrueTypeFont createFontProgram(PdfDictionary fontDictionary, FontEncoding
4646
}
4747
if (widths[i] > 0) {
4848
glyphsWithWidths++;
49+
fontProgram.avgWidth += widths[i];
4950
}
5051
}
51-
fontProgram.avgWidth /= glyphsWithWidths;
52+
if (glyphsWithWidths != 0) {
53+
fontProgram.avgWidth /= glyphsWithWidths;
54+
}
5255
return fontProgram;
5356
}
5457

@@ -67,8 +70,11 @@ static TrueTypeFont createFontProgram(PdfDictionary fontDictionary, CMapToUnicod
6770
Glyph glyph = new Glyph(cid, width, cid2Uni.get(cid));
6871
fontProgram.codeToGlyph.put(cid, glyph);
6972
fontProgram.unicodeToGlyph.put(glyph.getUnicode(), glyph);
73+
fontProgram.avgWidth += width;
74+
}
75+
if (fontProgram.codeToGlyph.size() != 0) {
76+
fontProgram.avgWidth /= fontProgram.codeToGlyph.size();
7077
}
71-
fontProgram.avgWidth /= fontProgram.codeToGlyph.size();
7278
}
7379

7480
if (fontProgram.codeToGlyph.get(0) == null) {

core/src/main/java/com/itextpdf/core/font/DocType1Font.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
package com.itextpdf.core.font;
22

3-
import com.itextpdf.basics.IntHashtable;
43
import com.itextpdf.basics.font.FontEncoding;
54
import com.itextpdf.basics.font.Type1Font;
6-
import com.itextpdf.basics.font.cmap.CMapToUnicode;
75
import com.itextpdf.basics.font.otf.Glyph;
86
import com.itextpdf.core.pdf.PdfArray;
97
import com.itextpdf.core.pdf.PdfDictionary;
@@ -12,9 +10,6 @@
1210
import com.itextpdf.core.pdf.PdfStream;
1311
import com.itextpdf.core.pdf.PdfString;
1412

15-
import java.io.IOException;
16-
import java.util.Map;
17-
1813
class DocType1Font extends Type1Font implements DocFontProgram {
1914

2015
private PdfStream fontFile;
@@ -64,9 +59,12 @@ static Type1Font createFontProgram(PdfDictionary fontDictionary, FontEncoding fo
6459
}
6560
if (widths[i] > 0) {
6661
glyphsWithWidths++;
62+
fontProgram.avgWidth += widths[i];
6763
}
6864
}
69-
fontProgram.avgWidth /= glyphsWithWidths;
65+
if (glyphsWithWidths != 0) {
66+
fontProgram.avgWidth /= glyphsWithWidths;
67+
}
7068
return fontProgram;
7169
}
7270

core/src/main/java/com/itextpdf/core/parser/TextRenderInfo.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -309,9 +309,11 @@ private float convertHeightFromTextSpaceToUserSpace(float height){
309309
*/
310310
private float getUnscaledFontSpaceWidth(){
311311
char charToUse = ' ';
312-
if (gs.getFont().getWidth(charToUse) == 0)
313-
charToUse = '\u00A0';
314-
return getStringWidth(String.valueOf(charToUse));
312+
if (gs.getFont().getWidth(charToUse) == 0) {
313+
return gs.getFont().getFontProgram().getAvgWidth() / 1000f;
314+
} else {
315+
return getStringWidth(String.valueOf(charToUse));
316+
}
315317
}
316318

317319
/**

model/src/test/java/com/itextpdf/model/SimpleTextExtractionStrategyTest.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
import com.itextpdf.core.font.PdfFont;
88
import com.itextpdf.core.font.PdfFontFactory;
99
import com.itextpdf.core.parser.GlyphTextEventListener;
10+
import com.itextpdf.core.parser.PdfTextExtractor;
1011
import com.itextpdf.core.parser.SimpleTextExtractionStrategy;
1112
import com.itextpdf.core.parser.TextExtractionStrategy;
12-
import com.itextpdf.core.parser.PdfTextExtractor;
1313
import com.itextpdf.core.pdf.PdfDocument;
1414
import com.itextpdf.core.pdf.PdfReader;
1515
import com.itextpdf.core.pdf.PdfString;
@@ -27,7 +27,6 @@
2727
import java.io.IOException;
2828

2929
import org.junit.Assert;
30-
import org.junit.Ignore;
3130
import org.junit.Test;
3231
import org.junit.experimental.categories.Category;
3332

@@ -190,7 +189,6 @@ public void extractFromPage229() throws IOException {
190189
}
191190

192191
@Test
193-
@Ignore("Seems to be a problem with decode")
194192
public void extractFromIsoTc171() throws IOException {
195193
if (this.getClass() != SimpleTextExtractionStrategyTest.class)
196194
return;

0 commit comments

Comments
 (0)