git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1841574 13f79535-47bb-0310-9956-ffa450edef68pull/13/head
import java.io.OutputStream; | import java.io.OutputStream; | ||||
import java.io.OutputStreamWriter; | import java.io.OutputStreamWriter; | ||||
import java.io.Writer; | import java.io.Writer; | ||||
import java.util.Arrays; | |||||
import java.security.MessageDigest; | |||||
import java.security.NoSuchAlgorithmException; | |||||
/** | /** | ||||
* Class representing a PDF stream. | * Class representing a PDF stream. | ||||
return len; | return len; | ||||
} | } | ||||
public int streamHashCode() throws IOException { | |||||
public String streamHashCode() throws IOException { | |||||
ByteArrayOutputStream bos = new ByteArrayOutputStream(); | ByteArrayOutputStream bos = new ByteArrayOutputStream(); | ||||
outputRawStreamData(bos); | 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); | |||||
} | |||||
} | } | ||||
} | } |
= new PDFDocumentNavigationHandler(this); | = new PDFDocumentNavigationHandler(this); | ||||
private Map<Integer, PDFArray> pageNumbers = new HashMap<Integer, PDFArray>(); | 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. | * Default constructor. | ||||
private void setUpContents() throws IOException { | private void setUpContents() throws IOException { | ||||
PDFStream stream = generator.getStream(); | PDFStream stream = generator.getStream(); | ||||
int hash = stream.streamHashCode(); | |||||
String hash = stream.streamHashCode(); | |||||
if (!contents.containsKey(hash)) { | if (!contents.containsKey(hash)) { | ||||
pdfDoc.registerObject(stream); | pdfDoc.registerObject(stream); | ||||
PDFReference ref = new PDFReference(stream); | PDFReference ref = new PDFReference(stream); |
stream.write("\nendstream".getBytes("US-ASCII")); | stream.write("\nendstream".getBytes("US-ASCII")); | ||||
return stream.toByteArray(); | 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(); | |||||
} | |||||
} | } |