cmapcleanz.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. /* cmapclean.c -- parse a CMap file and write it back out */
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include "mupdf/pdf.h"
  5. void pc(unsigned int c)
  6. {
  7. if (c <= 0xff) printf("<%02x>", c);
  8. else if (c <= 0xffff) printf("<%04x>", c);
  9. else if (c <= 0xffffff) printf("<%06x>", c);
  10. else printf("<%08x>", c);
  11. }
  12. int
  13. main(int argc, char **argv)
  14. {
  15. fz_context *ctx;
  16. fz_stream *fi;
  17. pdf_cmap *cmap;
  18. int k, m;
  19. int ns, nr;
  20. if (argc != 2)
  21. {
  22. fprintf(stderr, "usage: cmapclean input.cmap\n");
  23. return 1;
  24. }
  25. ctx = fz_new_context(NULL, NULL, FZ_STORE_UNLIMITED);
  26. if (!ctx)
  27. {
  28. fprintf(stderr, "cannot initialise context\n");
  29. return 1;
  30. }
  31. fi = fz_open_file(ctx, argv[1]);
  32. cmap = pdf_load_cmap(ctx, fi);
  33. fz_drop_stream(ctx, fi);
  34. printf("begincmap\n");
  35. printf("/CMapName /%s def\n", cmap->cmap_name);
  36. printf("/WMode %d def\n", cmap->wmode);
  37. if (cmap->usecmap_name[0])
  38. printf("/%s usecmap\n", cmap->usecmap_name);
  39. if (cmap->codespace_len)
  40. {
  41. printf("begincodespacerange\n");
  42. for (k = 0; k < cmap->codespace_len; k++)
  43. {
  44. if (cmap->codespace[k].n == 1)
  45. printf("<%02x><%02x>\n", cmap->codespace[k].low, cmap->codespace[k].high);
  46. else if (cmap->codespace[k].n == 2)
  47. printf("<%04x><%04x>\n", cmap->codespace[k].low, cmap->codespace[k].high);
  48. else if (cmap->codespace[k].n == 3)
  49. printf("<%06x><%06x>\n", cmap->codespace[k].low, cmap->codespace[k].high);
  50. else if (cmap->codespace[k].n == 4)
  51. printf("<%08x><%08x>\n", cmap->codespace[k].low, cmap->codespace[k].high);
  52. else
  53. printf("<%x><%x>\n", cmap->codespace[k].low, cmap->codespace[k].high);
  54. }
  55. printf("endcodespacerange\n");
  56. }
  57. /* 16-bit ranges */
  58. ns = nr = 0;
  59. for (k = 0; k < cmap->rlen; k++)
  60. if (cmap->ranges[k].high - cmap->ranges[k].low > 0)
  61. ++nr;
  62. else
  63. ++ns;
  64. if (ns)
  65. {
  66. printf("begincidchar\n");
  67. for (k = 0; k < cmap->rlen; k++) {
  68. if (cmap->ranges[k].high - cmap->ranges[k].low == 0) {
  69. pc(cmap->ranges[k].low);
  70. printf(" %u\n", cmap->ranges[k].out);
  71. }
  72. }
  73. printf("endcidchar\n");
  74. }
  75. if (nr)
  76. {
  77. printf("begincidrange\n");
  78. for (k = 0; k < cmap->rlen; k++) {
  79. if (cmap->ranges[k].high - cmap->ranges[k].low > 0) {
  80. pc(cmap->ranges[k].low);
  81. putchar(' ');
  82. pc(cmap->ranges[k].high);
  83. printf(" %u\n", cmap->ranges[k].out);
  84. }
  85. }
  86. printf("endcidrange\n");
  87. }
  88. /* 32-bit ranges */
  89. ns = nr = 0;
  90. for (k = 0; k < cmap->xlen; k++)
  91. if (cmap->xranges[k].high - cmap->xranges[k].low > 0)
  92. ++nr;
  93. else
  94. ++ns;
  95. if (ns)
  96. {
  97. printf("begincidchar\n");
  98. for (k = 0; k < cmap->xlen; k++) {
  99. if (cmap->xranges[k].high - cmap->xranges[k].low == 0) {
  100. pc(cmap->xranges[k].low);
  101. printf("%u\n", cmap->xranges[k].out);
  102. }
  103. }
  104. printf("endcidchar\n");
  105. }
  106. if (nr)
  107. {
  108. printf("begincidrange\n");
  109. for (k = 0; k < cmap->xlen; k++) {
  110. if (cmap->xranges[k].high - cmap->xranges[k].low > 0) {
  111. pc(cmap->xranges[k].low);
  112. pc(cmap->xranges[k].high);
  113. printf("%u\n", cmap->xranges[k].out);
  114. }
  115. }
  116. printf("endcidrange\n");
  117. }
  118. /* 1-to-many */
  119. #if 0
  120. if (cmap->mlen > 0)
  121. {
  122. printf("beginbfchar\n");
  123. for (k = 0; k < cmap->mlen; k++)
  124. {
  125. pc(cmap->mranges[k].low);
  126. printf("<");
  127. for (m = 0; m < cmap->mranges[k].len; ++m)
  128. printf("%04x", cmap->mranges[k].out[m]);
  129. printf(">\n");
  130. }
  131. printf("endbfchar\n");
  132. }
  133. #endif
  134. printf("endcmap\n");
  135. fz_drop_context(ctx);
  136. return 0;
  137. }