Skip to content

Commit

Permalink
Better test for issue 534
Browse files Browse the repository at this point in the history
  • Loading branch information
asturio committed Mar 5, 2022
1 parent faf1a13 commit 0821752
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 21 deletions.
13 changes: 6 additions & 7 deletions openpdf/src/main/java/com/lowagie/text/pdf/LayoutProcessor.java
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,9 @@
* Provides glyph layout e.g. for accented Latin letters.
*/
public class LayoutProcessor {

private static final int DEFAULT_FLAGS = -1;
private static final Map<BaseFont, java.awt.Font> awtFontMap = new ConcurrentHashMap<BaseFont, java.awt.Font>();
private static final Map<BaseFont, java.awt.Font> awtFontMap = new ConcurrentHashMap<>();

// Static variables can only be set once
private static boolean enabled = false;
Expand Down Expand Up @@ -103,12 +104,11 @@ public static int getFlags() {
}

public static boolean isSet(int queryFlags) {
return (flags & queryFlags) == queryFlags;
return flags != DEFAULT_FLAGS && (flags & queryFlags) == queryFlags;
}

public static boolean supportsFont(BaseFont baseFont) {
boolean supports = enabled && (awtFontMap.get(baseFont) != null);
return supports;
return enabled && (awtFontMap.get(baseFont) != null);
}

/**
Expand All @@ -124,7 +124,7 @@ public static void loadFont(BaseFont baseFont, String filename) {
return;
}

java.awt.Font awtFont = null;
java.awt.Font awtFont;
InputStream inputStream = null;
try {
awtFont = awtFontMap.get(baseFont);
Expand Down Expand Up @@ -188,9 +188,8 @@ public static GlyphVector computeGlyphVector(BaseFont baseFont, float fontSize,
localFlags = bidi.isLeftToRight() ? java.awt.Font.LAYOUT_LEFT_TO_RIGHT : java.awt.Font.LAYOUT_RIGHT_TO_LEFT;
}
java.awt.Font awtFont = LayoutProcessor.awtFontMap.get(baseFont).deriveFont(fontSize);
GlyphVector glyphVector = awtFont.layoutGlyphVector(fontRenderContext, chars, 0, chars.length, localFlags);

return glyphVector;
return awtFont.layoutGlyphVector(fontRenderContext, chars, 0, chars.length, localFlags);
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,34 @@
package com.lowagie.text.pdf;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assumptions.assumeThat;

import com.lowagie.text.Chunk;
import com.lowagie.text.Document;
import com.lowagie.text.Element;
import com.lowagie.text.PageSize;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.parser.PdfTextExtractor;
import java.awt.Font;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

class LayoutProcessor534Test {

@BeforeAll
static void beforeAll() {
assumeThat(LayoutProcessor.isSet(Font.LAYOUT_RIGHT_TO_LEFT)).isFalse();
LayoutProcessor.enable(java.awt.Font.LAYOUT_RIGHT_TO_LEFT);
}

@BeforeEach
void beforeEach() {
assumeThat(LayoutProcessor.isSet(Font.LAYOUT_RIGHT_TO_LEFT)).isTrue();
}

@Test
public void whenLayoutRightToLeftLatin_thenRevertCharOrder() throws IOException {
// given
Expand All @@ -21,7 +37,6 @@ public void whenLayoutRightToLeftLatin_thenRevertCharOrder() throws IOException
PdfWriter.getInstance(document, pdfOut);
document.open();
// when
LayoutProcessor.enable(java.awt.Font.LAYOUT_RIGHT_TO_LEFT);
String text = "one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen "
+ "sixteen seventeen eighteen nineteen twenty twentyεOne twentyTwo twentyThree twentyFour twentyFive "
+ "twentySix twentySeven twentyEight twentyNine thirty ";
Expand All @@ -34,7 +49,8 @@ public void whenLayoutRightToLeftLatin_thenRevertCharOrder() throws IOException

// then
PdfTextExtractor extractor = new PdfTextExtractor(new PdfReader(pdfOut.toByteArray()));
Assertions.assertThat(extractor.getTextFromPage(1))
String textFromPage = extractor.getTextFromPage(1);
assertThat(textFromPage)
.isEqualTo("owTytnewt enOεytnewt ytnewt neetenin neethgie neetneves neetxis neetfif neetruof neetriht "
+ "evlewt nevele net enin thgie neves xis evif ruof eerht owt eno\n"
+ " evlewt nevele net enin thgie neves xis evif ruof eerht owt eno ytriht eniNytnewt thgiEytnewt "
Expand All @@ -52,7 +68,6 @@ public void whenLayoutRightToLeftHebrew_thenRevertCharOrder() throws IOException
PdfWriter.getInstance(document, pdfOut);
document.open();
// when
LayoutProcessor.enable(java.awt.Font.LAYOUT_RIGHT_TO_LEFT);
String text = "שוב היתה זו שעת לילה. דממה שררה בפונדק אבן־הדרך, והיתה זו דממה בת שלושה חלקים." +
"החלק המתבקש מאליו היה שקט חלול, מהדהד, עשוי מן הדברים שלא היו. אילו היתה רוח, כי" +
"אז היתה נאנחת בעוברה בין העצים, מטלטלת את שלט הפונדק בחריקה על ציריו וסוחפת את" +
Expand All @@ -67,16 +82,18 @@ public void whenLayoutRightToLeftHebrew_thenRevertCharOrder() throws IOException
document.close();

// then
PdfTextExtractor extractor = new PdfTextExtractor(new PdfReader(pdfOut.toByteArray()));
Assertions.assertThat(extractor.getTextFromPage(1))
.isEqualTo(".ויה אלש םירבדה ןמ יושע ,דהדהמ ,לולח טקש היה וילאמ"
+ " שקבתמה קלחה.םיקלח השולש תב הממד וז התיהו ,ךרדה־ןבא קדנופב הררש הממד .הליל תעש וז התיה בוש\n"
+ " וליא .ויתס ילע תפרוג איהש יפכ ,ךרדה דרומב הממדהתא"
+ " תפחוסו ויריצ לע הקירחב קדנופה טלש תא תלטלטמ ,םיצעה ןיב הרבועב תחנאנ התיה זאיכ ,חור התיה וליא\n"
+ " וליא .תוכושחה הלילה תועשב,האבסמב םהל תופַצל"
+ " םוקמ היהש ןואשבו הלומהב ,קוחצבו החישב הממדה תא םיאלממ ויה זאיכ ,םישנא ץמוק וליפא ,קדנופב להק היה\n"
+ " .הניעב הממדה"
+ " הרתונ ןכלו ,םש היה הלאה םירבדהמ דחא אלףא ,תמאה ןעמל .הקיסומ התיה אלש יאדו , אל לבא ...הקיסומ התיה");
byte[] pdfBytes = pdfOut.toByteArray();
PdfTextExtractor extractor = new PdfTextExtractor(new PdfReader(pdfBytes));
String expected = ".ויה אלש םירבדה ןמ יושע ,דהדהמ ,לולח טקש היה וילאמ"
+ " שקבתמה קלחה.םיקלח השולש תב הממד וז התיהו ,ךרדה־ןבא קדנופב הררש הממד .הליל תעש וז התיה בוש\n"
+ " וליא .ויתס ילע תפרוג איהש יפכ ,ךרדה דרומב הממדהתא"
+ " תפחוסו ויריצ לע הקירחב קדנופה טלש תא תלטלטמ ,םיצעה ןיב הרבועב תחנאנ התיה זאיכ ,חור התיה וליא\n"
+ " וליא .תוכושחה הלילה תועשב,האבסמב םהל תופַצל"
+ " םוקמ היהש ןואשבו הלומהב ,קוחצבו החישב הממדה תא םיאלממ ויה זאיכ ,םישנא ץמוק וליפא ,קדנופב להק היה\n"
+ " .הניעב הממדה"
+ " הרתונ ןכלו ,םש היה הלאה םירבדהמ דחא אלףא ,תמאה ןעמל .הקיסומ התיה אלש יאדו , אל לבא ...הקיסומ התיה";
assertThat(extractor.getTextFromPage(1))
.isEqualTo(expected);
}

}

0 comments on commit 0821752

Please sign in to comment.