Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
7638 views
1
/* cmapclean.c -- parse a CMap file and write it back out */
2
3
#include <stdio.h>
4
#include <string.h>
5
6
/* We never want to build memento versions of the cmapdump util */
7
#undef MEMENTO
8
9
#include "mupdf/pdf.h"
10
11
#include "../source/fitz/context.c"
12
#include "../source/fitz/error.c"
13
#include "../source/fitz/memory.c"
14
#include "../source/fitz/string.c"
15
#include "../source/fitz/buffer.c"
16
#include "../source/fitz/stream-open.c"
17
#include "../source/fitz/stream-read.c"
18
#include "../source/fitz/printf.c"
19
20
#include "../source/pdf/pdf-lex.c"
21
#include "../source/pdf/pdf-cmap.c"
22
#include "../source/pdf/pdf-cmap-parse.c"
23
24
void pc(unsigned int c)
25
{
26
if (c <= 0xff) printf("<%02x>", c);
27
else if (c <= 0xffff) printf("<%04x>", c);
28
else if (c <= 0xffffff) printf("<%06x>", c);
29
else printf("<%08x>", c);
30
}
31
32
int
33
main(int argc, char **argv)
34
{
35
fz_context *ctx;
36
fz_stream *fi;
37
pdf_cmap *cmap;
38
int k, m;
39
int ns, nr;
40
41
if (argc != 2)
42
{
43
fprintf(stderr, "usage: cmapclean input.cmap\n");
44
return 1;
45
}
46
47
ctx = fz_new_context(NULL, NULL, FZ_STORE_UNLIMITED);
48
if (!ctx)
49
{
50
fprintf(stderr, "cannot initialise context\n");
51
return 1;
52
}
53
54
fi = fz_open_file(ctx, argv[1]);
55
cmap = pdf_load_cmap(ctx, fi);
56
fz_close(fi);
57
58
printf("begincmap\n");
59
printf("/CMapName /%s def\n", cmap->cmap_name);
60
printf("/WMode %d def\n", cmap->wmode);
61
if (cmap->usecmap_name[0])
62
printf("/%s usecmap\n", cmap->usecmap_name);
63
64
if (cmap->codespace_len)
65
{
66
printf("begincodespacerange\n");
67
for (k = 0; k < cmap->codespace_len; k++)
68
{
69
if (cmap->codespace[k].n == 1)
70
printf("<%02x><%02x>\n", cmap->codespace[k].low, cmap->codespace[k].high);
71
else if (cmap->codespace[k].n == 2)
72
printf("<%04x><%04x>\n", cmap->codespace[k].low, cmap->codespace[k].high);
73
else if (cmap->codespace[k].n == 3)
74
printf("<%06x><%06x>\n", cmap->codespace[k].low, cmap->codespace[k].high);
75
else if (cmap->codespace[k].n == 4)
76
printf("<%08x><%08x>\n", cmap->codespace[k].low, cmap->codespace[k].high);
77
else
78
printf("<%x><%x>\n", cmap->codespace[k].low, cmap->codespace[k].high);
79
}
80
printf("endcodespacerange\n");
81
}
82
83
/* 16-bit ranges */
84
85
ns = nr = 0;
86
for (k = 0; k < cmap->rlen; k++)
87
if (cmap->ranges[k].high - cmap->ranges[k].low > 0)
88
++nr;
89
else
90
++ns;
91
92
if (ns)
93
{
94
printf("begincidchar\n");
95
for (k = 0; k < cmap->rlen; k++) {
96
if (cmap->ranges[k].high - cmap->ranges[k].low == 0) {
97
pc(cmap->ranges[k].low);
98
printf("%u\n", cmap->ranges[k].out);
99
}
100
}
101
printf("endcidchar\n");
102
}
103
104
if (nr)
105
{
106
printf("begincidrange\n");
107
for (k = 0; k < cmap->rlen; k++) {
108
if (cmap->ranges[k].high - cmap->ranges[k].low > 0) {
109
pc(cmap->ranges[k].low);
110
pc(cmap->ranges[k].high);
111
printf("%u\n", cmap->ranges[k].out);
112
}
113
}
114
printf("endcidrange\n");
115
}
116
117
/* 32-bit ranges */
118
119
ns = nr = 0;
120
for (k = 0; k < cmap->xlen; k++)
121
if (cmap->xranges[k].high - cmap->xranges[k].low > 0)
122
++nr;
123
else
124
++ns;
125
126
if (ns)
127
{
128
printf("begincidchar\n");
129
for (k = 0; k < cmap->xlen; k++) {
130
if (cmap->xranges[k].high - cmap->xranges[k].low == 0) {
131
pc(cmap->xranges[k].low);
132
printf("%u\n", cmap->xranges[k].out);
133
}
134
}
135
printf("endcidchar\n");
136
}
137
138
if (nr)
139
{
140
printf("begincidrange\n");
141
for (k = 0; k < cmap->xlen; k++) {
142
if (cmap->xranges[k].high - cmap->xranges[k].low > 0) {
143
pc(cmap->xranges[k].low);
144
pc(cmap->xranges[k].high);
145
printf("%u\n", cmap->xranges[k].out);
146
}
147
}
148
printf("endcidrange\n");
149
}
150
151
/* 1-to-many */
152
153
if (cmap->mlen > 0)
154
{
155
printf("beginbfchar\n");
156
for (k = 0; k < cmap->mlen; k++)
157
{
158
pc(cmap->mranges[k].low);
159
printf("<");
160
for (m = 0; m < cmap->mranges[k].len; ++m)
161
printf("%04x", cmap->mranges[k].out[m]);
162
printf(">\n");
163
}
164
printf("endbfchar\n");
165
}
166
167
printf("endcmap\n");
168
169
fz_free_context(ctx);
170
return 0;
171
}
172
173
void fz_new_font_context(fz_context *ctx)
174
{
175
}
176
177
void fz_drop_font_context(fz_context *ctx)
178
{
179
}
180
181
fz_font_context *fz_keep_font_context(fz_context *ctx)
182
{
183
return NULL;
184
}
185
186
void fz_new_colorspace_context(fz_context *ctx)
187
{
188
}
189
190
void fz_drop_colorspace_context(fz_context *ctx)
191
{
192
}
193
194
fz_colorspace_context *fz_keep_colorspace_context(fz_context *ctx)
195
{
196
return NULL;
197
}
198
199
void fz_new_aa_context(fz_context *ctx)
200
{
201
}
202
203
void fz_free_aa_context(fz_context *ctx)
204
{
205
}
206
207
void fz_copy_aa_context(fz_context *dst, fz_context *src)
208
{
209
}
210
211
void *fz_keep_storable(fz_context *ctx, fz_storable *s)
212
{
213
return s;
214
}
215
216
void fz_drop_storable(fz_context *ctx, fz_storable *s)
217
{
218
}
219
220
void fz_new_store_context(fz_context *ctx, unsigned int max)
221
{
222
}
223
224
void fz_drop_store_context(fz_context *ctx)
225
{
226
}
227
228
fz_store *fz_keep_store_context(fz_context *ctx)
229
{
230
return NULL;
231
}
232
233
int fz_store_scavenge(fz_context *ctx, unsigned int size, int *phase)
234
{
235
return 0;
236
}
237
238
void fz_new_glyph_cache_context(fz_context *ctx)
239
{
240
}
241
242
void fz_drop_glyph_cache_context(fz_context *ctx)
243
{
244
}
245
246
fz_glyph_cache *fz_keep_glyph_cache(fz_context *ctx)
247
{
248
return NULL;
249
}
250
251
void fz_new_document_handler_context(fz_context *ctx)
252
{
253
}
254
255
void fz_drop_document_handler_context(fz_context *ctx)
256
{
257
}
258
259
fz_document_handler_context *fz_keep_document_handler_context(fz_context *ctx)
260
{
261
return NULL;
262
}
263
264