[poppler] glib/poppler-page.cc poppler/PSOutputDev.cc poppler/PSOutputDev.h qt5/src utils/pdftops.1 utils/pdftops.cc

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sun Jun 21 17:22:26 UTC 2020


 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 <williambader at hotmail.com>
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);
   }


More information about the poppler mailing list