/*
* PaperJam -- Main program
*
- * (c) 2018 Martin Mares <mj@ucw.cz>
+ * (c) 2018--2022 Martin Mares <mj@ucw.cz>
*/
#include <cassert>
const char *in_name;
const char *out_name;
bool recalc_bbox;
+bool no_auto_transforms;
int debug_level;
int debug_indent;
enum opt {
OPT_HELP = 256,
OPT_VERSION,
+ OPT_NO_AUTO,
};
static const struct option long_opts[] = {
Options:\n\
-b, --bbox Recalculate bounding boxes\n\
-d, --debug Show debugging messages\n\
+ --no-auto Disable automatic rotation of pages\n\
\n\
<command> = <name>(<args>, <named-arg>[=<value>], ...) [<pipeline>]\n\
<pipeline> = { <stage>, <stage>, ... }\n\
case OPT_HELP:
usage();
return 0;
+ case OPT_NO_AUTO:
+ no_auto_transforms = true;
+ break;
default:
exit(1);
}
/*
* PaperJam -- Low-level handling of PDFs
*
- * (c) 2018 Martin Mares <mj@ucw.cz>
+ * (c) 2018--2022 Martin Mares <mj@ucw.cz>
*/
#include <cassert>
void render(out_context *out, pdf_matrix xform);
void debug_dump() { debug("Input page %d", index); }
in_page(QPDFObjectHandle inpg, int idx);
+ int get_rotate();
};
in_page::in_page(QPDFObjectHandle inpg, int idx)
out->contents += "q " + m.to_string() + " cm " + xobj_res + " Do Q ";
}
+int in_page::get_rotate()
+{
+ QPDFObjectHandle rotate = pdf_page.getKey("/Rotate");
+ if (rotate.isNull())
+ return 0;
+ else if (rotate.isInteger())
+ {
+ long long deg = rotate.getIntValue();
+ if (deg < 0 || deg >= 360 || deg % 90)
+ {
+ warn("Page #%d: /Rotate must be 0, 90, 180 or 270", index);
+ return 0;
+ }
+ else
+ return deg;
+ }
+ else
+ {
+ warn("Page #%d: /Rotate is not an integer", index);
+ return 0;
+ }
+}
+
void debug_pages(vector<page *> &pages)
{
if (!debug_level)
}
}
+static vector<page *> apply_input_xforms(vector<page *> in_pages)
+{
+ vector<page *> out_pages;
+
+ for (auto pg: in_pages)
+ {
+ in_page * in_pg = dynamic_cast<in_page *>(pg);
+ if (in_pg)
+ {
+ int deg = in_pg->get_rotate();
+ if (deg)
+ pg = new xform_page(pg, "/Rotate", pdf_rotation_matrix(deg, pg->width, pg->height));
+ }
+ out_pages.push_back(pg);
+ }
+
+ return out_pages;
+}
+
vector<page *> run_command_list(list<cmd *> &cmds, vector<page *> &pages)
{
debug("# Input");
if (recalc_bbox)
do_recalc_bbox(pages, in_name);
+ if (!no_auto_transforms)
+ {
+ debug("### Applying input transforms");
+ pages = apply_input_xforms(pages);
+ }
+
debug("### Running commands");
pages = run_command_list(cmds, pages);