git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1841574 13f79535-47bb-0310-9956-ffa450edef68pull/13/head
@@ -24,7 +24,8 @@ import java.io.IOException; | |||
import java.io.OutputStream; | |||
import java.io.OutputStreamWriter; | |||
import java.io.Writer; | |||
import java.util.Arrays; | |||
import java.security.MessageDigest; | |||
import java.security.NoSuchAlgorithmException; | |||
/** | |||
* Class representing a PDF stream. | |||
@@ -193,9 +194,19 @@ public class PDFStream extends AbstractPDFStream { | |||
return len; | |||
} | |||
public int streamHashCode() throws IOException { | |||
public String streamHashCode() throws IOException { | |||
ByteArrayOutputStream bos = new ByteArrayOutputStream(); | |||
outputRawStreamData(bos); | |||
return Arrays.hashCode(bos.toByteArray()); | |||
try { | |||
MessageDigest md = MessageDigest.getInstance("MD5"); | |||
byte[] thedigest = md.digest(bos.toByteArray()); | |||
StringBuilder hex = new StringBuilder(); | |||
for (byte b : thedigest) { | |||
hex.append(String.format("%02x", b)); | |||
} | |||
return hex.toString(); | |||
} catch (NoSuchAlgorithmException e) { | |||
throw new IOException(e); | |||
} | |||
} | |||
} |
@@ -98,7 +98,7 @@ public class PDFDocumentHandler extends AbstractBinaryWritingIFDocumentHandler { | |||
= new PDFDocumentNavigationHandler(this); | |||
private Map<Integer, PDFArray> pageNumbers = new HashMap<Integer, PDFArray>(); | |||
private Map<Integer, PDFReference> contents = new HashMap<Integer, PDFReference>(); | |||
private Map<String, PDFReference> contents = new HashMap<String, PDFReference>(); | |||
/** | |||
* Default constructor. | |||
@@ -307,7 +307,7 @@ public class PDFDocumentHandler extends AbstractBinaryWritingIFDocumentHandler { | |||
private void setUpContents() throws IOException { | |||
PDFStream stream = generator.getStream(); | |||
int hash = stream.streamHashCode(); | |||
String hash = stream.streamHashCode(); | |||
if (!contents.containsKey(hash)) { | |||
pdfDoc.registerObject(stream); | |||
PDFReference ref = new PDFReference(stream); |
@@ -123,4 +123,30 @@ public class PDFStreamTestCase { | |||
stream.write("\nendstream".getBytes("US-ASCII")); | |||
return stream.toByteArray(); | |||
} | |||
@Test | |||
public void testHash() throws IOException { | |||
assertFalse(getStreamHash(65025).equals(getStreamHash(127076))); | |||
} | |||
private String getStreamHash(int i) throws IOException { | |||
PDFStream stream = new PDFStream(); | |||
String txt = "1 0 0 -1 0 790.866 cm\n" | |||
+ "q\n" | |||
+ "0 g\n" | |||
+ "BT\n" | |||
+ "/F1 12 Tf\n" | |||
+ "1 0 0 -1 0 10.26599979 Tm [(" + i + ")] TJ\n" | |||
+ "ET\n"; | |||
String img = "q\n" | |||
+ "126.734001 0 0 -38.244999 0 54.294998 cm\n" | |||
+ "/Im2 Do\n" | |||
+ "Q\n"; | |||
if (i % 2 == 0) { | |||
stream.add(txt + img + "Q\n"); | |||
} else { | |||
stream.add(txt + "Q\n"); | |||
} | |||
return stream.streamHashCode(); | |||
} | |||
} |