You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

EPSReader.java 5.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. /*
  2. * $Id$
  3. * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
  4. * For details on use and redistribution please refer to the
  5. * LICENSE file included with these sources.
  6. */
  7. package org.apache.fop.image.analyser;
  8. // Java
  9. import java.io.BufferedInputStream;
  10. import java.io.ByteArrayOutputStream;
  11. import java.io.IOException;
  12. import java.io.InputStream;
  13. import java.net.URL;
  14. import org.xml.sax.InputSource;
  15. import org.xml.sax.XMLReader;
  16. import org.apache.fop.image.FopImage;
  17. import org.apache.fop.image.EPSImage;
  18. import org.apache.fop.fo.FOUserAgent;
  19. /**
  20. * ImageReader object for EPS document image type.
  21. */
  22. public class EPSReader implements ImageReader {
  23. private long getLong(byte[] buf, int idx) {
  24. int b1 = buf[idx] & 0xff;
  25. int b2 = buf[idx + 1] & 0xff;
  26. int b3 = buf[idx + 2] & 0xff;
  27. int b4 = buf[idx + 3] & 0xff;
  28. return (long)((b4 << 24) | (b3 << 16) | (b2 << 8) | b1);
  29. }
  30. public FopImage.ImageInfo verifySignature(String uri, BufferedInputStream fis,
  31. FOUserAgent ua) throws IOException {
  32. boolean isEPS = false;
  33. fis.mark(32);
  34. byte[] header = new byte[30];
  35. fis.read(header, 0, 30);
  36. fis.reset();
  37. EPSImage.EPSData data = new EPSImage.EPSData();
  38. // Check if binary header
  39. if (getLong(header, 0) == 0xC6D3D0C5) {
  40. data.isAscii = false;
  41. isEPS = true;
  42. data.psStart = getLong(header, 4);
  43. data.psLength = getLong(header, 8);
  44. data.wmfStart = getLong(header, 12);
  45. data.wmfLength = getLong(header, 16);
  46. data.tiffStart = getLong(header, 20);
  47. data.tiffLength = getLong(header, 24);
  48. } else {
  49. // Check if plain ascii
  50. byte[] epsh = "%!PS".getBytes();
  51. if (epsh[0] == header[0] && epsh[1] == header[1] &&
  52. epsh[2] == header[2] && epsh[3] == header[3]) {
  53. data.isAscii = true;
  54. isEPS = true;
  55. }
  56. }
  57. if (isEPS) {
  58. FopImage.ImageInfo info = new FopImage.ImageInfo();
  59. info.mimeType = getMimeType();
  60. info.data = data;
  61. readEPSImage(fis, data);
  62. data.bbox = readBBox(data);
  63. if (data.bbox != null) {
  64. info.width = (int)(data.bbox[2] - data.bbox[0]);
  65. info.height = (int)(data.bbox[3] - data.bbox[1]);
  66. return info;
  67. } else {
  68. // Ain't eps if no BoundingBox
  69. isEPS = false;
  70. }
  71. }
  72. return null;
  73. }
  74. /** read the eps file and extract eps part */
  75. private void readEPSImage(BufferedInputStream fis, EPSImage.EPSData data) throws IOException {
  76. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  77. byte[] file;
  78. byte[] readBuf = new byte[20480];
  79. int bytes_read;
  80. int index = 0;
  81. boolean cont = true;
  82. try {
  83. while ((bytes_read = fis.read(readBuf)) != -1) {
  84. baos.write(readBuf, 0, bytes_read);
  85. }
  86. } catch (java.io.IOException ex) {
  87. throw new IOException("Error while loading EPS image " +
  88. ex.getMessage());
  89. }
  90. file = baos.toByteArray();
  91. if (data.isAscii) {
  92. data.rawEps = null;
  93. data.epsFile = new byte[file.length];
  94. System.arraycopy(file, 0, data.epsFile, 0, data.epsFile.length);
  95. } else {
  96. data.rawEps = new byte[file.length];
  97. data.epsFile = new byte[(int) data.psLength];
  98. System.arraycopy(file, 0, data.rawEps, 0, data.rawEps.length);
  99. System.arraycopy(data.rawEps, (int) data.psStart, data.epsFile, 0,
  100. (int) data.psLength);
  101. }
  102. }
  103. /* Get embedded preview or null */
  104. public byte[] getPreview(EPSImage.EPSData data) {
  105. if (data.preview == null) {
  106. if (data.tiffLength > 0) {
  107. data.preview = new byte[(int) data.tiffLength];
  108. System.arraycopy(data.rawEps, (int) data.tiffStart, data.preview, 0,
  109. (int) data.tiffLength);
  110. }
  111. }
  112. return data.preview;
  113. }
  114. /** Extract bounding box from eps part
  115. */
  116. private long[] readBBox(EPSImage.EPSData data) {
  117. long[] mbbox = null;
  118. int idx = 0;
  119. byte[] bbxName = "%%BoundingBox: ".getBytes();
  120. boolean found = false;
  121. while (!found && (data.epsFile.length > (idx + bbxName.length))) {
  122. boolean sfound = true;
  123. int i = idx;
  124. for (i = idx; sfound && (i - idx) < bbxName.length; i++) {
  125. if (bbxName[i - idx] != data.epsFile[i])
  126. sfound = false;
  127. }
  128. if (sfound) {
  129. found = true;
  130. idx = i;
  131. } else {
  132. idx++;
  133. }
  134. }
  135. if (!found)
  136. return mbbox;
  137. mbbox = new long[4];
  138. idx += readLongString(data, mbbox, 0, idx);
  139. idx += readLongString(data, mbbox, 1, idx);
  140. idx += readLongString(data, mbbox, 2, idx);
  141. idx += readLongString(data, mbbox, 3, idx);
  142. return mbbox;
  143. }
  144. private int readLongString(EPSImage.EPSData data, long[] mbbox, int i, int idx) {
  145. while (idx < data.epsFile.length && (data.epsFile[idx] == 32))
  146. idx++;
  147. int nidx = idx;
  148. while (nidx < data.epsFile.length &&
  149. ((data.epsFile[nidx] >= 48 && data.epsFile[nidx] <= 57) ||
  150. (data.epsFile[nidx] == 45)))
  151. nidx++;
  152. byte[] num = new byte[nidx - idx];
  153. System.arraycopy(data.epsFile, idx, num, 0, nidx - idx);
  154. String ns = new String(num);
  155. mbbox[i] = Long.parseLong(ns);
  156. return (1 + nidx - idx);
  157. }
  158. public String getMimeType() {
  159. return "image/eps";
  160. }
  161. }