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.

AFPParser.java 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. /*
  2. * Licensed to the Apache Software Foundation (ASF) under one or more
  3. * contributor license agreements. See the NOTICE file distributed with
  4. * this work for additional information regarding copyright ownership.
  5. * The ASF licenses this file to You under the Apache License, Version 2.0
  6. * (the "License"); you may not use this file except in compliance with
  7. * the License. You may obtain a copy of the License at
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS,
  13. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. * See the License for the specific language governing permissions and
  15. * limitations under the License.
  16. */
  17. /* $Id$ */
  18. package org.apache.fop.render.afp;
  19. import java.io.ByteArrayInputStream;
  20. import java.io.IOException;
  21. import java.io.InputStream;
  22. import java.util.HashMap;
  23. import java.util.Map;
  24. import org.junit.Assert;
  25. import org.apache.fop.afp.AFPConstants;
  26. import org.apache.fop.afp.ptoca.PtocaBuilder;
  27. public class AFPParser {
  28. private boolean readText;
  29. public AFPParser(boolean readText) {
  30. this.readText = readText;
  31. }
  32. public void read(InputStream bis, StringBuilder sb) throws IOException {
  33. while (bis.available() > 0) {
  34. readField(bis, sb);
  35. }
  36. }
  37. private void readField(InputStream bis, StringBuilder sb) throws IOException {
  38. bis.read();
  39. int len = getLength(bis.read(), bis.read());
  40. byte[] field = new byte[len - 2];
  41. bis.read(field);
  42. InputStream fieldStream = new ByteArrayInputStream(field);
  43. fieldStream.read();
  44. byte type = (byte) fieldStream.read();
  45. byte category = (byte) fieldStream.read();
  46. fieldStream.skip(3);
  47. String typeStr = TYPE_MAP.get(type & 0xFF);
  48. String catStr = CATEGORY_MAP.get(category & 0xFF);
  49. if (typeStr != null && catStr != null) {
  50. sb.append(typeStr + " " + catStr);
  51. if (typeStr.equals("BEGIN") || typeStr.equals("END")) {
  52. byte[] name = new byte[8];
  53. fieldStream.read(name);
  54. sb.append(" " + new String(name, AFPConstants.EBCIDIC_ENCODING));
  55. fieldStream.skip(2);
  56. readTriplet(fieldStream, sb);
  57. } else if (typeStr.equals("MAP")) {
  58. fieldStream.skip(2);
  59. readTriplet(fieldStream, sb);
  60. } else if (typeStr.equals("DESCRIPTOR") && catStr.equals("OBJECT_AREA")) {
  61. readTriplet(fieldStream, sb);
  62. } else if (typeStr.equals("DATA") && catStr.equals("PRESENTATION_TEXT") && readText) {
  63. readData(fieldStream, sb);
  64. }
  65. sb.append("\n");
  66. }
  67. }
  68. private void readData(InputStream bis, StringBuilder sb) throws IOException {
  69. Assert.assertEquals(bis.read(), 0x2B);
  70. Assert.assertEquals(bis.read(), 0xD3);
  71. while (bis.available() > 0) {
  72. int len = bis.read();
  73. int functionType = bis.read();
  74. sb.append(" " + PTOCA_MAP.get(functionType));
  75. if ("TRN".equals(PTOCA_MAP.get(functionType))) {
  76. byte[] data = new byte[len - 2];
  77. bis.read(data);
  78. sb.append(" " + new String(data, "UTF-16BE"));
  79. } else {
  80. bis.skip(len - 2);
  81. }
  82. }
  83. }
  84. private void readTriplet(InputStream des, StringBuilder sb) throws IOException {
  85. if (des.available() > 0) {
  86. sb.append(" Triplets: ");
  87. }
  88. while (des.available() > 0) {
  89. int len2 = des.read();
  90. int id = des.read();
  91. int b = id & 0xFF;
  92. if (TRIPLET_MAP.containsKey(b)) {
  93. sb.append(TRIPLET_MAP.get(b) + ",");
  94. } else {
  95. sb.append(String.format("0x%02X,", b));
  96. }
  97. des.skip(len2 - 2);
  98. }
  99. }
  100. private int getLength(int a, int b) {
  101. return (a * 256) + b;
  102. }
  103. private static final Map<Integer, String> TYPE_MAP = new HashMap<Integer, String>();
  104. private static final Map<Integer, String> CATEGORY_MAP = new HashMap<Integer, String>();
  105. private static final Map<Integer, String> TRIPLET_MAP = new HashMap<Integer, String>();
  106. private static final Map<Integer, String> PTOCA_MAP = new HashMap<Integer, String>();
  107. static {
  108. PTOCA_MAP.put(0xC2 | PtocaBuilder.CHAIN_BIT, "SIA");
  109. PTOCA_MAP.put(0xC4 | PtocaBuilder.CHAIN_BIT, "SVI");
  110. PTOCA_MAP.put(0xC6 | PtocaBuilder.CHAIN_BIT, "AMI");
  111. PTOCA_MAP.put(0xC8 | PtocaBuilder.CHAIN_BIT, "RMI");
  112. PTOCA_MAP.put(0xD2 | PtocaBuilder.CHAIN_BIT, "AMB");
  113. PTOCA_MAP.put(0xDA | PtocaBuilder.CHAIN_BIT, "TRN");
  114. PTOCA_MAP.put(0xE4 | PtocaBuilder.CHAIN_BIT, "DIR");
  115. PTOCA_MAP.put(0xE6 | PtocaBuilder.CHAIN_BIT, "DBR");
  116. PTOCA_MAP.put(0x80 | PtocaBuilder.CHAIN_BIT, "SEC");
  117. PTOCA_MAP.put(0xF0 | PtocaBuilder.CHAIN_BIT, "SCFL");
  118. PTOCA_MAP.put(0xF6 | PtocaBuilder.CHAIN_BIT, "STO");
  119. PTOCA_MAP.put(0xF8 | PtocaBuilder.CHAIN_BIT, "NOP");
  120. TYPE_MAP.put(0xA0, "ATTRIBUTE");
  121. TYPE_MAP.put(0xA2, "COPY_COUNT");
  122. TYPE_MAP.put(0xA6, "DESCRIPTOR");
  123. TYPE_MAP.put(0xA7, "CONTROL");
  124. TYPE_MAP.put(0xA8, "BEGIN");
  125. TYPE_MAP.put(0xA9, "END");
  126. TYPE_MAP.put(0xAB, "MAP");
  127. TYPE_MAP.put(0xAC, "POSITION");
  128. TYPE_MAP.put(0xAD, "PROCESS");
  129. TYPE_MAP.put(0xAF, "INCLUDE");
  130. TYPE_MAP.put(0xB0, "TABLE");
  131. TYPE_MAP.put(0xB1, "MIGRATION");
  132. TYPE_MAP.put(0xB2, "VARIABLE");
  133. TYPE_MAP.put(0xB4, "LINK");
  134. TYPE_MAP.put(0xEE, "DATA");
  135. CATEGORY_MAP.put(0x5F, "PAGE_SEGMENT");
  136. CATEGORY_MAP.put(0x6B, "OBJECT_AREA");
  137. CATEGORY_MAP.put(0x77, "COLOR_ATTRIBUTE_TABLE");
  138. CATEGORY_MAP.put(0x7B, "IM_IMAGE");
  139. CATEGORY_MAP.put(0x88, "MEDIUM");
  140. CATEGORY_MAP.put(0x8A, "CODED_FONT");
  141. CATEGORY_MAP.put(0x90, "PROCESS_ELEMENT");
  142. CATEGORY_MAP.put(0x92, "OBJECT_CONTAINER");
  143. CATEGORY_MAP.put(0x9B, "PRESENTATION_TEXT");
  144. CATEGORY_MAP.put(0xA7, "INDEX");
  145. CATEGORY_MAP.put(0xA8, "DOCUMENT");
  146. CATEGORY_MAP.put(0xAD, "PAGE_GROUP");
  147. CATEGORY_MAP.put(0xAF, "PAGE");
  148. CATEGORY_MAP.put(0xBB, "GRAPHICS");
  149. CATEGORY_MAP.put(0xC3, "DATA_RESOURCE");
  150. CATEGORY_MAP.put(0xC4, "DOCUMENT_ENVIRONMENT_GROUP");
  151. CATEGORY_MAP.put(0xC6, "RESOURCE_GROUP");
  152. CATEGORY_MAP.put(0xC7, "OBJECT_ENVIRONMENT_GROUP");
  153. CATEGORY_MAP.put(0xC9, "ACTIVE_ENVIRONMENT_GROUP");
  154. CATEGORY_MAP.put(0xCC, "MEDIUM_MAP");
  155. CATEGORY_MAP.put(0xCD, "FORM_MAP");
  156. CATEGORY_MAP.put(0xCE, "NAME_RESOURCE");
  157. CATEGORY_MAP.put(0xD8, "PAGE_OVERLAY");
  158. CATEGORY_MAP.put(0xD9, "RESOURCE_ENVIROMENT_GROUP");
  159. CATEGORY_MAP.put(0xDF, "OVERLAY");
  160. CATEGORY_MAP.put(0xEA, "DATA_SUPRESSION");
  161. CATEGORY_MAP.put(0xEB, "BARCODE");
  162. CATEGORY_MAP.put(0xEE, "NO_OPERATION");
  163. CATEGORY_MAP.put(0xFB, "IMAGE");
  164. TRIPLET_MAP.put(0x02, "FULLY_QUALIFIED_NAME");
  165. TRIPLET_MAP.put(0x04, "MAPPING_OPTION");
  166. TRIPLET_MAP.put(0x10, "OBJECT_CLASSIFICATION");
  167. TRIPLET_MAP.put(0x18, "MODCA_INTERCHANGE_SET");
  168. TRIPLET_MAP.put(0x1F, "FONT_DESCRIPTOR_SPECIFICATION");
  169. TRIPLET_MAP.put(0x21, "OBJECT_FUNCTION_SET_SPECIFICATION");
  170. TRIPLET_MAP.put(0x22, "EXTENDED_RESOURCE_LOCAL_IDENTIFIER");
  171. TRIPLET_MAP.put(0x24, "RESOURCE_LOCAL_IDENTIFIER");
  172. TRIPLET_MAP.put(0x25, "RESOURCE_SECTION_NUMBER");
  173. TRIPLET_MAP.put(0x26, "CHARACTER_ROTATION");
  174. TRIPLET_MAP.put(0x2D, "OBJECT_BYTE_OFFSET");
  175. TRIPLET_MAP.put(0x36, "ATTRIBUTE_VALUE");
  176. TRIPLET_MAP.put(0x43, "DESCRIPTOR_POSITION");
  177. TRIPLET_MAP.put(0x45, "MEDIA_EJECT_CONTROL");
  178. TRIPLET_MAP.put(0x46, "PAGE_OVERLAY_CONDITIONAL_PROCESSING");
  179. TRIPLET_MAP.put(0x47, "RESOURCE_USAGE_ATTRIBUTE");
  180. TRIPLET_MAP.put(0x4B, "MEASUREMENT_UNITS");
  181. TRIPLET_MAP.put(0x4C, "OBJECT_AREA_SIZE");
  182. TRIPLET_MAP.put(0x4D, "AREA_DEFINITION");
  183. TRIPLET_MAP.put(0x4E, "COLOR_SPECIFICATION");
  184. TRIPLET_MAP.put(0x50, "ENCODING_SCHEME_ID");
  185. TRIPLET_MAP.put(0x56, "MEDIUM_MAP_PAGE_NUMBER");
  186. TRIPLET_MAP.put(0x57, "OBJECT_BYTE_EXTENT");
  187. TRIPLET_MAP.put(0x58, "OBJECT_STRUCTURED_FIELD_OFFSET");
  188. TRIPLET_MAP.put(0x59, "OBJECT_STRUCTURED_FIELD_EXTENT");
  189. TRIPLET_MAP.put(0x5A, "OBJECT_OFFSET");
  190. TRIPLET_MAP.put(0x5D, "FONT_HORIZONTAL_SCALE_FACTOR");
  191. TRIPLET_MAP.put(0x5E, "OBJECT_COUNT");
  192. TRIPLET_MAP.put(0x62, "OBJECT_DATE_AND_TIMESTAMP");
  193. TRIPLET_MAP.put(0x65, "COMMENT");
  194. TRIPLET_MAP.put(0x68, "MEDIUM_ORIENTATION");
  195. TRIPLET_MAP.put(0x6C, "RESOURCE_OBJECT_INCLUDE");
  196. TRIPLET_MAP.put(0x70, "PRESENTATION_SPACE_RESET_MIXING");
  197. TRIPLET_MAP.put(0x71, "PRESENTATION_SPACE_MIXING_RULE");
  198. TRIPLET_MAP.put(0x72, "UNIVERSAL_DATE_AND_TIMESTAMP");
  199. TRIPLET_MAP.put(0x74, "TONER_SAVER");
  200. TRIPLET_MAP.put(0x75, "COLOR_FIDELITY");
  201. TRIPLET_MAP.put(0x78, "FONT_FIDELITY");
  202. TRIPLET_MAP.put(0x80, "ATTRIBUTE_QUALIFIER");
  203. TRIPLET_MAP.put(0x81, "PAGE_POSITION_INFORMATION");
  204. TRIPLET_MAP.put(0x82, "PARAMETER_VALUE");
  205. TRIPLET_MAP.put(0x83, "PRESENTATION_CONTROL");
  206. TRIPLET_MAP.put(0x84, "FONT_RESOLUTION_AND_METRIC_TECHNOLOGY");
  207. TRIPLET_MAP.put(0x85, "FINISHING_OPERATION");
  208. TRIPLET_MAP.put(0x86, "TEXT_FIDELITY");
  209. TRIPLET_MAP.put(0x87, "MEDIA_FIDELITY");
  210. TRIPLET_MAP.put(0x88, "FINISHING_FIDELITY");
  211. TRIPLET_MAP.put(0x8B, "DATA_OBJECT_FONT_DESCRIPTOR");
  212. TRIPLET_MAP.put(0x8C, "LOCALE_SELECTOR");
  213. TRIPLET_MAP.put(0x8E, "UP3I_FINISHING_OPERATION");
  214. TRIPLET_MAP.put(0x91, "COLOR_MANAGEMENT_RESOURCE_DESCRIPTOR");
  215. TRIPLET_MAP.put(0x95, "RENDERING_INTENT");
  216. TRIPLET_MAP.put(0x96, "CMR_TAG_FIDELITY");
  217. TRIPLET_MAP.put(0x97, "DEVICE_APPEARANCE");
  218. }
  219. }