ソースを参照

FOP-2811: PDF larger than 100k pages can have wrong content stream

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1841574 13f79535-47bb-0310-9956-ffa450edef68
pull/13/head
Simon Steiner 5年前
コミット
c8b88d3034

+ 14
- 3
fop-core/src/main/java/org/apache/fop/pdf/PDFStream.java ファイルの表示

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);
}
} }
} }

+ 2
- 2
fop-core/src/main/java/org/apache/fop/render/pdf/PDFDocumentHandler.java ファイルの表示

= 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);

+ 26
- 0
fop-core/src/test/java/org/apache/fop/pdf/PDFStreamTestCase.java ファイルの表示

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();
}
} }

読み込み中…
キャンセル
保存