glib/poppler-page.cc | 7 +++++-- poppler/PSOutputDev.cc | 8 +++++--- poppler/PSOutputDev.h | 13 ++++++++++--- qt5/src/poppler-ps-converter.cc | 2 +- utils/pdftops.1 | 5 +++++ utils/pdftops.cc | 17 +++++++++++++++++ 6 files changed, 43 insertions(+), 9 deletions(-)
New commits: commit 6faf2739245b4ab24a4d536953f7d0cb763c9823 Author: William Bader <[email protected]> Date: Sun Jun 21 17:22:24 2020 +0000 Add a pdftops -rasterize option with values always, never, or whenneeded diff --git a/glib/poppler-page.cc b/glib/poppler-page.cc index c3002b91..78edfe0c 100644 --- a/glib/poppler-page.cc +++ b/glib/poppler-page.cc @@ -1144,8 +1144,11 @@ poppler_page_render_to_ps (PopplerPage *page, ps_file->document->doc, nullptr, pages, psModePS, (int)ps_file->paper_width, - (int)ps_file->paper_height, ps_file->duplex, - false, 0, 0, 0, false, false); + (int)ps_file->paper_height, + false, ps_file->duplex, + 0, 0, 0, 0, + psRasterizeWhenNeeded, false, + nullptr, nullptr); } diff --git a/poppler/PSOutputDev.cc b/poppler/PSOutputDev.cc index 16ff64c4..f656a3d2 100644 --- a/poppler/PSOutputDev.cc +++ b/poppler/PSOutputDev.cc @@ -1088,7 +1088,7 @@ PSOutputDev::PSOutputDev(const char *fileName, PDFDoc *docA, int paperWidthA, int paperHeightA, bool noCropA, bool duplexA, int imgLLXA, int imgLLYA, int imgURXA, int imgURYA, - bool forceRasterizeA, + PSForceRasterize forceRasterizeA, bool manualCtrlA, PSOutCustomCodeCbk customCodeCbkA, void *customCodeCbkDataA) { @@ -1158,7 +1158,7 @@ PSOutputDev::PSOutputDev(PSOutputFunc outputFuncA, void *outputStreamA, int paperWidthA, int paperHeightA, bool noCropA, bool duplexA, int imgLLXA, int imgLLYA, int imgURXA, int imgURYA, - bool forceRasterizeA, + PSForceRasterize forceRasterizeA, bool manualCtrlA, PSOutCustomCodeCbk customCodeCbkA, void *customCodeCbkDataA) { @@ -3228,8 +3228,10 @@ bool PSOutputDev::checkPageSlice(Page *page, double /*hDPI*/, double /*vDPI*/, if (!postInitDone) { postInit(); } - if (forceRasterize) { + if (forceRasterize == psAlwaysRasterize) { rasterize = true; + } else if (forceRasterize == psNeverRasterize) { + rasterize = false; } else { scan = new PreScanOutputDev(doc); page->displaySlice(scan, 72, 72, rotateA, useMediaBox, crop, diff --git a/poppler/PSOutputDev.h b/poppler/PSOutputDev.h index 757e3a06..d7de68fa 100644 --- a/poppler/PSOutputDev.h +++ b/poppler/PSOutputDev.h @@ -87,6 +87,12 @@ enum PSOutCustomCodeLocation { psOutCustomPageSetup }; +enum PSForceRasterize { + psRasterizeWhenNeeded, // default + psAlwaysRasterize, // always rasterize, useful for testing + psNeverRasterize // never rasterize, may produce incorrect output +}; + typedef void (*PSOutputFunc)(void *stream, const char *data, int len); typedef GooString *(*PSOutCustomCodeCbk)(PSOutputDev *psOut, @@ -106,7 +112,7 @@ public: bool duplexA = true, int imgLLXA = 0, int imgLLYA = 0, int imgURXA = 0, int imgURYA = 0, - bool forceRasterizeA = false, + PSForceRasterize forceRasterizeA = psRasterizeWhenNeeded, bool manualCtrlA = false, PSOutCustomCodeCbk customCodeCbkA = nullptr, void *customCodeCbkDataA = nullptr); @@ -122,7 +128,7 @@ public: bool duplexA = true, int imgLLXA = 0, int imgLLYA = 0, int imgURXA = 0, int imgURYA = 0, - bool forceRasterizeA = false, + PSForceRasterize forceRasterizeA = psRasterizeWhenNeeded, bool manualCtrlA = false, PSOutCustomCodeCbk customCodeCbkA = nullptr, void *customCodeCbkDataA = nullptr); @@ -315,6 +321,7 @@ public: void setPSCenter(bool center) { psCenter = center; } void setRasterAntialias(bool a) { rasterAntialias = a; } + void setForceRasterize(PSForceRasterize f) { forceRasterize = f; } void setRasterResolution(double r) { rasterResolution = r; } void setRasterMono(bool b) { rasterMono = b; } void setUncompressPreloadedImages(bool b) { uncompressPreloadedImages = b; } @@ -530,7 +537,7 @@ private: bool t3FillColorOnly; // operators should only use the fill color bool t3Cacheable; // cleared if char is not cacheable bool t3NeedsRestore; // set if a 'q' operator was issued - bool forceRasterize; // forces the page to be rasterized into a image before printing + PSForceRasterize forceRasterize; // controls the rasterization of pages into images bool displayText; // displayText bool psCenter; // center pages on the paper bool rasterAntialias; // antialias on rasterize diff --git a/qt5/src/poppler-ps-converter.cc b/qt5/src/poppler-ps-converter.cc index c4dec24c..d809b011 100644 --- a/qt5/src/poppler-ps-converter.cc +++ b/qt5/src/poppler-ps-converter.cc @@ -235,7 +235,7 @@ bool PSConverter::convert() d->marginBottom, d->paperWidth - d->marginRight, d->paperHeight - d->marginTop, - (d->opts & ForceRasterization)); + (d->opts & ForceRasterization) ? psAlwaysRasterize : psRasterizeWhenNeeded); if (d->opts & StrictMargins) { diff --git a/utils/pdftops.1 b/utils/pdftops.1 index 6907b824..e74cb494 100644 --- a/utils/pdftops.1 +++ b/utils/pdftops.1 @@ -134,6 +134,11 @@ pdftops may need to rasterize transparencies and pattern image masks in the PDF. If the PostScript will be printed, leave \-aaRaster disabled and set \-r to the resolution of the printer. If the PostScript will be viewed, enabling \-aaRaster may make rasterized text easier to read. .TP +.BI \-rasterize " always | never | whenneeded" +By default, pdftops rasterizes pages as needed, for example, if they contain transparencies. +To force rasterization, set \-rasterize to "always". Use this to eliminate fonts. +To prevent rasterization, set \-rasterize to "never". This may produce files that display incorrectly. +.TP .B \-optimizecolorspace By default, bitmap images in the PDF pass through to the output PostScript in their original color space, which produces predictable results. diff --git a/utils/pdftops.cc b/utils/pdftops.cc index a3cd70da..dae70a8e 100644 --- a/utils/pdftops.cc +++ b/utils/pdftops.cc @@ -101,6 +101,7 @@ static bool fontPassthrough = false; static bool optimizeColorSpace = false; static bool passLevel1CustomColor = false; static char rasterAntialiasStr[16] = ""; +static char forceRasterizeStr[16] = ""; static bool preload = false; static char paperSize[15] = ""; static int paperWidth = -1; @@ -160,6 +161,8 @@ static const ArgDesc argDesc[] = { "don't substitute missing fonts"}, {"-aaRaster", argString, rasterAntialiasStr, sizeof(rasterAntialiasStr), "enable anti-aliasing on rasterization: yes, no"}, + {"-rasterize", argString, forceRasterizeStr, sizeof(forceRasterizeStr), + "control rasterization: always, never, whenneeded"}, {"-optimizecolorspace", argFlag, &optimizeColorSpace,0, "convert gray RGB images to gray color space"}, {"-passlevel1customcolor", argFlag, &passLevel1CustomColor, 0, @@ -397,6 +400,20 @@ int main(int argc, char *argv[]) { } } + if (forceRasterizeStr[0]) { + PSForceRasterize forceRasterize = psRasterizeWhenNeeded; + if (strcmp(forceRasterizeStr, "whenneeded") == 0) { + forceRasterize = psRasterizeWhenNeeded; + } else if (strcmp(forceRasterizeStr, "always") == 0) { + forceRasterize = psAlwaysRasterize; + } else if (strcmp(forceRasterizeStr, "never") == 0) { + forceRasterize = psNeverRasterize; + } else { + fprintf(stderr, "Bad '-rasterize' value on command line\n"); + } + psOut->setForceRasterize(forceRasterize); + } + if (splashResolution > 0) { psOut->setRasterResolution(splashResolution); } _______________________________________________ poppler mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/poppler
