diff options
Diffstat (limited to 'Build/source/libs/pplib/pplib-src/src/pptest2.c')
-rw-r--r-- | Build/source/libs/pplib/pplib-src/src/pptest2.c | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/Build/source/libs/pplib/pplib-src/src/pptest2.c b/Build/source/libs/pplib/pplib-src/src/pptest2.c new file mode 100644 index 00000000000..766110da4cd --- /dev/null +++ b/Build/source/libs/pplib/pplib-src/src/pptest2.c @@ -0,0 +1,138 @@ + +#include <stdio.h> +#include <assert.h> +#include "ppapi.h" + +/* +static const char * get_file_name (const char *path) +{ + const char *fn, *p; + for (fn = p = path; *p != '\0'; ++p) + if (*p == '\\' || *p == '/') + fn = p + 1; + return fn; +} +*/ + +static void box_info (ppdict *pagedict, FILE *fh) +{ + const char *boxes[] = {"MediaBox", "CropBox", "BleedBox", "TrimBox", "ArtBox"}; + pprect rect; + size_t i; + for (i = 0; i < sizeof(boxes) / sizeof(const char *); ++i) + if (ppdict_get_box(pagedict, boxes[i], &rect)) + fprintf(fh, "%%%% %s [%f %f %f %f]\n", boxes[i], rect.lx, rect.ly, rect.rx, rect.ry); +} + +static int usage (const char *argv0) +{ + printf("pplib " pplib_version ", " pplib_author "\n"); + printf("usage: %s file1.pdf file2.pdf ...\n", argv0); + return 0; +} + +static void log_callback (const char *message, void *alien) +{ + fprintf((FILE *)alien, "\nooops: %s\n", message); +} + +int main (int argc, const char **argv) +{ + const char *filepath; + int a; + ppdoc *pdf; + ppref *pageref; + ppdict *pagedict; + int pageno; + char outname[1024]; + FILE *fh; + ppstream *stream; + uint8_t *data; + size_t size; + ppcontext *context; + ppobj *obj; + ppname *op; + size_t operators; + + if (argc < 2) + return usage(argv[0]); + ppstream_init_buffers(); + pplog_callback(log_callback, stderr); + context = ppcontext_new(); + for (a = 1; a < argc; ++a) + { + filepath = argv[a]; + printf("loading %s... ", filepath); + pdf = ppdoc_load(filepath); + if (pdf == NULL) + { + printf("failed\n"); + continue; + } + printf("done.\n"); + switch (ppdoc_crypt_status(pdf)) + { + case PPCRYPT_NONE: + case PPCRYPT_DONE: + break; + case PPCRYPT_PASS: + if (ppdoc_crypt_pass(pdf, "dummy", 5, NULL, 0) == PPCRYPT_DONE || ppdoc_crypt_pass(pdf, NULL, 0, "dummy", 5) == PPCRYPT_DONE) + break; + printf("sorry, password needed\n"); + ppdoc_free(pdf); + continue; + case PPCRYPT_FAIL: + printf("sorry, encryption failed\n"); + ppdoc_free(pdf); + continue; + } + sprintf(outname, "%s.out", filepath); + fh = fopen(outname, "wb"); + if (fh == NULL) + { + printf("can't open %s for writing\n", outname); + continue; + } + for (pageref = ppdoc_first_page(pdf), pageno = 1; + pageref != NULL; + pageref = ppdoc_next_page(pdf), ++pageno) + { + pagedict = pageref->object.dict; + /* decompress contents data */ + fprintf(fh, "%%%% PAGE %d\n", pageno); + box_info(pagedict, fh); + for (stream = ppcontents_first(pagedict); + stream != NULL; + stream = ppcontents_next(pagedict, stream)) + { + for (data = ppstream_first(stream, &size, 1); + data != NULL; + data = ppstream_next(stream, &size)) + fwrite(data, size, 1, fh); + ppstream_done(stream); + } + /* now parse contents */ + for (stream = ppcontents_first(pagedict); + stream != NULL; + stream = ppcontents_next(pagedict, stream)) + { + operators = 0; + for (obj = ppcontents_first_op(context, stream, &size, &op); + obj != NULL; + obj = ppcontents_next_op(context, stream, &size, &op)) + ++operators; + fprintf(fh, "%%%% OPERATORS count %lu\n", (unsigned long)operators); + ppstream_done(stream); + //obj = ppcontents_parse(context, stream, &size); + //fprintf(fh, "%%%% items count %lu\n", (unsigned long)size); + fprintf(fh, "\n"); + } + ppcontext_done(context); + } + fclose(fh); + ppdoc_free(pdf); + } + ppcontext_free(context); + ppstream_free_buffers(); + return 0; +} |