diff options
-rw-r--r-- | Jamfile | 9 | ||||
-rw-r--r-- | test/pdfclean.c | 6 | ||||
-rw-r--r-- | test/pdfrip.c | 182 |
3 files changed, 187 insertions, 10 deletions
@@ -116,12 +116,7 @@ LINKLIBS = Main pdfclean : test/pdfclean.c ; Main pdfdebug : test/pdfdebug.c ; +Main pdfrip : test/pdfrip.c ; -LinkLibraries pdfclean pdfdebug : libmupdf libfitz ; - -#Main t-filter : tests/t-filter.c ; -#Main t-parse : tests/t-parse.c ; -#Main t-scanconv : tests/t-scanconv.c ; -#Main tiger : tests/tiger.c ; -#LinkLibraries t-filter t-parse t-scanconv t-fontrast tiger : libfitz ; +LinkLibraries pdfclean pdfdebug pdfrip : libmupdf libfitz ; diff --git a/test/pdfclean.c b/test/pdfclean.c index 37d9de0d..3a111a92 100644 --- a/test/pdfclean.c +++ b/test/pdfclean.c @@ -122,12 +122,12 @@ int main(int argc, char **argv) if (error) fz_abort(error); } - if (dogc) - pdf_garbagecollect(xref); - if (doexpand) expandstreams(xref); + if (dogc) + pdf_garbagecollect(xref); + error = pdf_savepdf(xref, outfile); if (error) fz_abort(error); diff --git a/test/pdfrip.c b/test/pdfrip.c new file mode 100644 index 00000000..2bcceada --- /dev/null +++ b/test/pdfrip.c @@ -0,0 +1,182 @@ +#include <fitz.h> +#include <mupdf.h> + +void usage() +{ + fprintf(stderr, "usage: pdfrip [-r] [-p password] file.pdf [pages...]\n"); + exit(1); +} + +/* + * Draw page + */ + +void runcsi(pdf_xref *xref, pdf_csi *csi, pdf_resources *rdb, fz_obj *stmref) +{ + fz_error *error; + + error = pdf_openstream(xref, stmref); + if (error) fz_abort(error); + + error = pdf_runcsi(csi, rdb, xref->file); + if (error) fz_abort(error); + + pdf_closestream(xref); +} + +void showpage(pdf_xref *xref, fz_obj *page) +{ + fz_error *error; + pdf_csi *csi; + pdf_resources *rdb = nil; + fz_obj *resources; + fz_obj *contents; + int i; + + fz_debugobj(page); + printf("\n"); + + resources = fz_dictgets(page, "Resources"); + if (resources) + { + error = pdf_resolve(&resources, xref); + if (error) fz_abort(error); + + error = pdf_loadresources(&rdb, xref, resources); + if (error) fz_abort(error); + + // parse resources into native res dict + fz_dropobj(resources); + } + else + fz_abort(fz_throw("syntaxerror: missing resource dictionary")); + +printf("resources:\n"); +printf(" font:\n"); +fz_debugobj(rdb->font); +printf("\n extgstate:\n"); +fz_debugobj(rdb->extgstate); +printf("\nfitz tree:\n"); + + error = pdf_newcsi(&csi); + if (error) fz_abort(error); + + contents = fz_dictgets(page, "Contents"); + if (contents) + { + if (fz_isarray(contents)) + { + for (i = 0; i < fz_arraylen(contents); i++) + { + runcsi(xref, csi, rdb, fz_arrayget(contents, i)); + } + } + else + { + // XXX resolve and check if it is an array + runcsi(xref, csi, rdb, contents); + } + } + + fz_debugtree(csi->tree); + + { + fz_pixmap *pix; + fz_renderer *gc; + fz_matrix ctm; + +#define W 612 +#define H 792 + +#define xW 1106 +#define xH 1548 + + fz_newrenderer(&gc); + fz_newpixmap(&pix, 0, 0, W, H, 1, 0); + ctm = fz_concat(fz_translate(0, -H), fz_scale(1,-1)); + + memset(pix->samples, 0x00, pix->stride * pix->h * 2); + +printf("rendering!\n"); + fz_rendernode(gc, csi->tree->root, ctm, pix); +printf("done!\n"); + fz_debugpixmap(pix); + + fz_freepixmap(pix); + fz_freerenderer(gc); + } + + pdf_freecsi(csi); +} + +int main(int argc, char **argv) +{ + fz_error *error; + char *filename; + pdf_xref *xref; + pdf_pagetree *pages; + int c; + + char *password = ""; + int dorepair = 0; + + while ((c = getopt(argc, argv, "rp:")) != -1) + { + switch (c) + { + case 'r': dorepair ++; break; + case 'p': password = optarg; break; + default: usage(); + } + } + + if (argc - optind == 0) + usage(); + + filename = argv[optind++]; + + error = pdf_newxref(&xref); + if (error) + fz_abort(error); + + if (dorepair) + error = pdf_repairxref(xref, filename); + else + error = pdf_openxref(xref, filename); + if (error) + fz_abort(error); + + error = pdf_decryptxref(xref); + if (error) + fz_abort(error); + + if (xref->crypt) + { + error = pdf_setpassword(xref->crypt, password); + if (error) fz_abort(error); + } + + error = pdf_loadpagetree(&pages, xref); + if (error) fz_abort(error); + + if (optind == argc) + { + printf("pagetree\n"); + pdf_debugpagetree(pages); + printf("\n"); + } + + for ( ; optind < argc; optind++) + { + int page = atoi(argv[optind]); + if (page < 1 || page > pages->count) + fprintf(stderr, "page out of bounds: %d\n", page); + printf("page %d\n", page); + showpage(xref, pages->pobj[page - 1]); + } + + pdf_closexref(xref); + + return 0; +} + |