TestFontEmbedding.java (pdfbox-2.0.23-src) | : | TestFontEmbedding.java (pdfbox-2.0.24-src) | ||
---|---|---|---|---|
skipping to change at line 25 | skipping to change at line 25 | |||
* limitations under the License. | * limitations under the License. | |||
*/ | */ | |||
package org.apache.pdfbox.pdmodel.font; | package org.apache.pdfbox.pdmodel.font; | |||
import java.io.ByteArrayOutputStream; | import java.io.ByteArrayOutputStream; | |||
import java.io.File; | import java.io.File; | |||
import java.io.IOException; | import java.io.IOException; | |||
import java.io.InputStream; | import java.io.InputStream; | |||
import java.util.HashSet; | import java.util.HashSet; | |||
import java.util.Map; | ||||
import java.util.Set; | import java.util.Set; | |||
import junit.framework.TestCase; | import junit.framework.TestCase; | |||
import org.apache.fontbox.ttf.OS2WindowsMetricsTable; | ||||
import org.apache.fontbox.ttf.TTFParser; | ||||
import org.apache.fontbox.ttf.TrueTypeFont; | ||||
import org.apache.pdfbox.cos.COSArray; | import org.apache.pdfbox.cos.COSArray; | |||
import org.apache.pdfbox.cos.COSDictionary; | import org.apache.pdfbox.cos.COSDictionary; | |||
import org.apache.pdfbox.cos.COSName; | import org.apache.pdfbox.cos.COSName; | |||
import org.apache.pdfbox.pdmodel.PDDocument; | import org.apache.pdfbox.pdmodel.PDDocument; | |||
import org.apache.pdfbox.pdmodel.PDPage; | import org.apache.pdfbox.pdmodel.PDPage; | |||
import org.apache.pdfbox.pdmodel.common.PDRectangle; | import org.apache.pdfbox.pdmodel.common.PDRectangle; | |||
import org.apache.pdfbox.pdmodel.PDPageContentStream; | import org.apache.pdfbox.pdmodel.PDPageContentStream; | |||
import org.apache.pdfbox.pdmodel.PDPageContentStream.AppendMode; | import org.apache.pdfbox.pdmodel.PDPageContentStream.AppendMode; | |||
import org.apache.pdfbox.text.PDFTextStripper; | import org.apache.pdfbox.text.PDFTextStripper; | |||
import static org.mockito.BDDMockito.given; | ||||
import org.mockito.Mockito; | ||||
/** | /** | |||
* Tests font embedding. | * Tests font embedding. | |||
* | * | |||
* @author John Hewson | * @author John Hewson | |||
* @author Tilman Hausherr | * @author Tilman Hausherr | |||
*/ | */ | |||
public class TestFontEmbedding extends TestCase | public class TestFontEmbedding extends TestCase | |||
{ | { | |||
private static final File OUT_DIR = new File("target/test-output"); | private static final File OUT_DIR = new File("target/test-output"); | |||
skipping to change at line 254 | skipping to change at line 263 | |||
// check that the extracted text matches what we wrote | // check that the extracted text matches what we wrote | |||
String extracted = getUnicodeText(file); | String extracted = getUnicodeText(file); | |||
assertEquals(text, extracted.trim()); | assertEquals(text, extracted.trim()); | |||
} | } | |||
private String getUnicodeText(File file) throws IOException | private String getUnicodeText(File file) throws IOException | |||
{ | { | |||
PDDocument document = PDDocument.load(file); | PDDocument document = PDDocument.load(file); | |||
PDFTextStripper stripper = new PDFTextStripper(); | PDFTextStripper stripper = new PDFTextStripper(); | |||
return stripper.getText(document); | String text = stripper.getText(document); | |||
document.close(); | ||||
return text; | ||||
} | } | |||
/** | /** | |||
* Test that an embedded and subsetted font can be reused. | * Test that an embedded and subsetted font can be reused. | |||
* | * | |||
* @throws IOException | * @throws IOException | |||
*/ | */ | |||
public void testReuseEmbeddedSubsettedFont() throws IOException | public void testReuseEmbeddedSubsettedFont() throws IOException | |||
{ | { | |||
String text1 = "The quick brown fox"; | String text1 = "The quick brown fox"; | |||
skipping to change at line 303 | skipping to change at line 314 | |||
baos.reset(); | baos.reset(); | |||
document.save(baos); | document.save(baos); | |||
document.close(); | document.close(); | |||
// Test that both texts are there | // Test that both texts are there | |||
document = PDDocument.load(baos.toByteArray()); | document = PDDocument.load(baos.toByteArray()); | |||
PDFTextStripper stripper = new PDFTextStripper(); | PDFTextStripper stripper = new PDFTextStripper(); | |||
String extractedText = stripper.getText(document); | String extractedText = stripper.getText(document); | |||
assertEquals(text1 + " " + text2, extractedText.trim()); | assertEquals(text1 + " " + text2, extractedText.trim()); | |||
document.close(); | document.close(); | |||
} | } | |||
private class TrueTypeEmbedderTester extends TrueTypeEmbedder | ||||
{ | ||||
/** | ||||
* Common functionality for testing the TrueTypeFontEmbedder | ||||
* | ||||
*/ | ||||
TrueTypeEmbedderTester(PDDocument document, COSDictionary dict, TrueType | ||||
Font ttf, boolean embedSubset) | ||||
throws IOException | ||||
{ | ||||
super(document, dict, ttf, embedSubset); | ||||
} | ||||
@Override | ||||
protected void buildSubset(InputStream ttfSubset, String tag, Map<Intege | ||||
r, Integer> gidToCid) | ||||
throws IOException | ||||
{ | ||||
// no-op. Need to define method to extend abstract class, but | ||||
// this method is not currently needed for testing | ||||
} | ||||
} | ||||
/** | ||||
* Test that we validate embedding permissions properly for all legal permis | ||||
sions combinations | ||||
* | ||||
* @throws IOException | ||||
*/ | ||||
public void testIsEmbeddingPermittedMultipleVersions() throws IOException | ||||
{ | ||||
// SETUP | ||||
PDDocument doc = new PDDocument(); | ||||
COSDictionary cosDictionary = new COSDictionary(); | ||||
InputStream input = PDFont.class.getResourceAsStream("/org/apache/pdfbox | ||||
/resources/ttf/LiberationSans-Regular.ttf"); | ||||
TrueTypeFont ttf = new TTFParser().parseEmbedded(input); | ||||
TrueTypeEmbedderTester tester = new TrueTypeEmbedderTester(doc, cosDicti | ||||
onary, ttf, true); | ||||
TrueTypeFont mockTtf = Mockito.mock(TrueTypeFont.class); | ||||
OS2WindowsMetricsTable mockOS2 = Mockito.mock(OS2WindowsMetricsTable.cla | ||||
ss); | ||||
given(mockTtf.getOS2Windows()).willReturn(mockOS2); | ||||
Boolean embeddingIsPermitted; | ||||
// TEST 1: 0000 -- Installable embedding versions 0-3+ | ||||
given(mockTtf.getOS2Windows().getFsType()).willReturn((short) 0x0000); | ||||
embeddingIsPermitted = tester.isEmbeddingPermitted(mockTtf); | ||||
// VERIFY | ||||
assertTrue(embeddingIsPermitted); | ||||
// no test for 0001, since bit 0 is permanently reserved, and its use is | ||||
deprecated | ||||
// TEST 2: 0010 -- Restricted License embedding versions 0-3+ | ||||
given(mockTtf.getOS2Windows().getFsType()).willReturn((short) 0x0002); | ||||
embeddingIsPermitted = tester.isEmbeddingPermitted(mockTtf); | ||||
// VERIFY | ||||
assertFalse(embeddingIsPermitted); | ||||
// no test for 0011 | ||||
// TEST 3: 0100 -- Preview & Print embedding versions 0-3+ | ||||
given(mockTtf.getOS2Windows().getFsType()).willReturn((short) 0x0004); | ||||
embeddingIsPermitted = tester.isEmbeddingPermitted(mockTtf); | ||||
// VERIFY | ||||
assertTrue(embeddingIsPermitted); | ||||
// no test for 0101 | ||||
// TEST 4: 0110 -- Restricted License embedding AND Preview & Print embe | ||||
dding versions 0-2 | ||||
// -- illegal permissions combination for versions 3+ | ||||
given(mockTtf.getOS2Windows().getFsType()).willReturn((short) 0x0006); | ||||
embeddingIsPermitted = tester.isEmbeddingPermitted(mockTtf); | ||||
// VERIFY | ||||
assertTrue(embeddingIsPermitted); | ||||
// no test for 0111 | ||||
// TEST 5: 1000 -- Editable embedding versions 0-3+ | ||||
given(mockTtf.getOS2Windows().getFsType()).willReturn((short) 0x0008); | ||||
embeddingIsPermitted = tester.isEmbeddingPermitted(mockTtf); | ||||
// VERIFY | ||||
assertTrue(embeddingIsPermitted); | ||||
// no test for 1001 | ||||
// TEST 6: 1010 -- Restricted License embedding AND Editable embedding v | ||||
ersions 0-2 | ||||
// -- illegal permissions combination for versions 3+ | ||||
given(mockTtf.getOS2Windows().getFsType()).willReturn((short) 0x000A); | ||||
embeddingIsPermitted = tester.isEmbeddingPermitted(mockTtf); | ||||
// VERIFY | ||||
assertTrue(embeddingIsPermitted); | ||||
// no test for 1011 | ||||
// TEST 7: 1100 -- Editable embedding AND Preview & Print embedding vers | ||||
ions 0-2 | ||||
// -- illegal permissions combination for versions 3+ | ||||
given(mockTtf.getOS2Windows().getFsType()).willReturn((short) 0x000C); | ||||
embeddingIsPermitted = tester.isEmbeddingPermitted(mockTtf); | ||||
// VERIFY | ||||
assertTrue(embeddingIsPermitted); | ||||
// no test for 1101 | ||||
// TEST 8: 1110 Editable embedding AND Preview & Print embedding AND Res | ||||
tricted License embedding versions 0-2 | ||||
// -- illegal permissions combination for versions 3+ | ||||
given(mockTtf.getOS2Windows().getFsType()).willReturn((short) 0x000E); | ||||
embeddingIsPermitted = tester.isEmbeddingPermitted(mockTtf); | ||||
// VERIFY | ||||
assertTrue(embeddingIsPermitted); | ||||
// no test for 1111 | ||||
} | ||||
} | } | |||
End of changes. 6 change blocks. | ||||
1 lines changed or deleted | 133 lines changed or added |