summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'devices/vector/gdevpdfp.c')
-rw-r--r--devices/vector/gdevpdfp.c182
1 files changed, 169 insertions, 13 deletions
diff --git a/devices/vector/gdevpdfp.c b/devices/vector/gdevpdfp.c
index d06e585c..e78d9596 100644
--- a/devices/vector/gdevpdfp.c
+++ b/devices/vector/gdevpdfp.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2020 Artifex Software, Inc.
+/* Copyright (C) 2001-2021 Artifex Software, Inc.
All Rights Reserved.
This software is provided AS-IS with no warranty, either express or
@@ -119,6 +119,7 @@ static const gs_param_item_t pdf_param_items[] = {
pi("DetectDuplicateImages", gs_param_type_bool, DetectDuplicateImages),
pi("AllowIncrementalCFF", gs_param_type_bool, AllowIncrementalCFF),
pi("WantsToUnicode", gs_param_type_bool, WantsToUnicode),
+ pi("PdfmarkCapable", gs_param_type_bool, PdfmarkCapable),
pi("AllowPSRepeatFunctions", gs_param_type_bool, AllowPSRepeatFunctions),
pi("IsDistiller", gs_param_type_bool, IsDistiller),
pi("PreserveSMask", gs_param_type_bool, PreserveSMask),
@@ -254,6 +255,48 @@ gdev_pdf_get_param(gx_device *dev, char *Param, void *list)
return(param_write_null(plist, "DSC"));
}
}
+
+#if OCR_VERSION > 0
+ if (strcmp(Param, "OCRLanguage") == 0) {
+ gs_param_string langstr;
+ if (pdev->ocr_language[0]) {
+ langstr.data = (const byte *)pdev->ocr_language;
+ langstr.size = strlen(pdev->ocr_language);
+ langstr.persistent = false;
+ } else {
+ langstr.data = (const byte *)"eng";
+ langstr.size = 3;
+ langstr.persistent = false;
+ }
+ return param_write_string(plist, "OCRLanguage", &langstr);
+ }
+ if (strcmp(Param, "OCREngine") == 0)
+ return param_write_int(plist, "OCREngine", &pdev->ocr_engine);
+
+ if (strcmp(Param, "UseOCR") == 0) {
+ gs_param_string ocrstr;
+
+ switch(pdev->UseOCR) {
+ case UseOCRNever:
+ ocrstr.data = (const byte *)"Never";
+ ocrstr.size = 5;
+ ocrstr.persistent = false;
+ break;
+ UseOCRAsNeeded:
+ ocrstr.data = (const byte *)"AsNeeded";
+ ocrstr.size = 8;
+ ocrstr.persistent = false;
+ break;
+ UseOCRAlways:
+ ocrstr.data = (const byte *)"Always";
+ ocrstr.size = 8;
+ ocrstr.persistent = false;
+ break;
+ }
+ return param_write_string(plist, "UseOCR", &ocrstr);
+ }
+#endif
+
return gdev_psdf_get_param(dev, Param, list);
}
@@ -268,6 +311,49 @@ gdev_pdf_get_params(gx_device * dev, gs_param_list * plist)
int code;
int cdv = CoreDistVersion;
+#if OCR_VERSION > 0
+ gs_param_string langstr;
+
+ if (pdev->ocr_language[0]) {
+ langstr.data = (const byte *)pdev->ocr_language;
+ langstr.size = strlen(pdev->ocr_language);
+ langstr.persistent = false;
+ } else {
+ langstr.data = (const byte *)"eng";
+ langstr.size = 3;
+ langstr.persistent = false;
+ }
+
+ {
+ gs_param_string ocrstr;
+
+ switch(pdev->UseOCR) {
+ case UseOCRNever:
+ ocrstr.data = (const byte *)"Never";
+ ocrstr.size = 5;
+ ocrstr.persistent = false;
+ break;
+ UseOCRAsNeeded:
+ ocrstr.data = (const byte *)"AsNeeded";
+ ocrstr.size = 8;
+ ocrstr.persistent = false;
+ break;
+ UseOCRAlways:
+ ocrstr.data = (const byte *)"Always";
+ ocrstr.size = 8;
+ ocrstr.persistent = false;
+ break;
+ }
+ code = param_write_string(plist, "UseOCR", &ocrstr);
+ }
+ code = param_write_string(plist, "OCRLanguage", &langstr);
+ if(code < 0)
+ return code;
+ code = param_write_int(plist, "OCREngine", &pdev->ocr_engine);
+ if(code < 0)
+ return code;
+#endif
+
pdev->ParamCompatibilityLevel = cl;
code = gdev_psdf_get_params(dev, plist);
if (code < 0 ||
@@ -366,6 +452,83 @@ gdev_pdf_put_params_impl(gx_device * dev, const gx_device_pdf * save_dev, gs_par
}
}
+#if OCR_VERSION > 0
+ {
+ int len;
+ gs_param_string langstr;
+ switch (code = param_read_string(plist, (param_name = "OCRLanguage"), &langstr)) {
+ case 0:
+ len = langstr.size;
+ if (len >= sizeof(pdev->ocr_language))
+ len = sizeof(pdev->ocr_language)-1;
+ memcpy(pdev->ocr_language, langstr.data, len);
+ pdev->ocr_language[len] = 0;
+ break;
+ case 1:
+ break;
+ default:
+ ecode = code;
+ param_signal_error(plist, param_name, ecode);
+ }
+ }
+
+ {
+ int engine;
+ switch (code = param_read_int(plist, (param_name = "OCREngine"), &engine)) {
+ case 0:
+ pdev->ocr_engine = engine;
+ break;
+ case 1:
+ break;
+ default:
+ ecode = code;
+ param_signal_error(plist, param_name, ecode);
+ }
+ }
+
+ {
+ gs_param_string ocrstr;
+
+ code = param_read_string(plist, (param_name = "UseOCR"), &ocrstr);
+ switch(code) {
+ case 0:
+ if (ocrstr.size == 5 && memcmp(ocrstr.data, "Never", 5) == 0)
+ pdev->UseOCR = UseOCRNever;
+ if (ocrstr.size == 8 && memcmp(ocrstr.data, "AsNeeded", 8) == 0)
+ pdev->UseOCR = UseOCRAsNeeded;
+ if (ocrstr.size == 6 && memcmp(ocrstr.data, "Always", 6) == 0)
+ pdev->UseOCR = UseOCRAlways;
+ break;
+ case 1:
+ break;
+ default:
+ param_signal_error(plist, param_name, code);
+ break;
+ }
+ }
+
+ {
+ gs_param_string ocrstr;
+
+ code = param_read_string(plist, (param_name = "UseOCR"), &ocrstr);
+ switch(code) {
+ case 0:
+ if (ocrstr.size == 5 && memcmp(ocrstr.data, "Never", 5) == 0)
+ pdev->UseOCR = UseOCRNever;
+ if (ocrstr.size == 8 && memcmp(ocrstr.data, "AsNeeded", 8) == 0)
+ pdev->UseOCR = UseOCRAsNeeded;
+ if (ocrstr.size == 6 && memcmp(ocrstr.data, "Always", 6) == 0)
+ pdev->UseOCR = UseOCRAlways;
+ break;
+ case 1:
+ break;
+ default:
+ param_signal_error(plist, param_name, code);
+ break;
+ }
+ }
+#endif
+
/*
* Check for LockDistillerParams before doing anything else.
* If LockDistillerParams is true and is not being set to false,
@@ -594,9 +757,6 @@ gdev_pdf_put_params_impl(gx_device * dev, const gx_device_pdf * save_dev, gs_par
if (pdev->params.ColorConversionStrategy == ccs_Gray) {
emprintf(pdev->memory, "ConvertCMYKImagesToRGB is not compatible with ColorConversionStrategy of Gray\n");
} else {
- if (pdev->icc_struct)
- rc_decrement(pdev->icc_struct,
- "reset default profile\n");
pdf_set_process_color_model(pdev,1);
ecode = gsicc_init_device_profile_struct((gx_device *)pdev, NULL, 0);
if (ecode < 0)
@@ -613,18 +773,12 @@ gdev_pdf_put_params_impl(gx_device * dev, const gx_device_pdf * save_dev, gs_par
pdev->params.TransferFunctionInfo = tfi_Apply;
break;
case ccs_CMYK:
- if (pdev->icc_struct)
- rc_decrement(pdev->icc_struct,
- "reset default profile\n");
pdf_set_process_color_model(pdev, 2);
ecode = gsicc_init_device_profile_struct((gx_device *)pdev, NULL, 0);
if (ecode < 0)
goto fail;
break;
case ccs_Gray:
- if (pdev->icc_struct)
- rc_decrement(pdev->icc_struct,
- "reset default profile\n");
pdf_set_process_color_model(pdev,0);
ecode = gsicc_init_device_profile_struct((gx_device *)pdev, NULL, 0);
if (ecode < 0)
@@ -634,9 +788,6 @@ gdev_pdf_put_params_impl(gx_device * dev, const gx_device_pdf * save_dev, gs_par
case ccs_RGB:
/* Only bother to do this if we didn't handle it above */
if (!pdev->params.ConvertCMYKImagesToRGB) {
- if (pdev->icc_struct)
- rc_decrement(pdev->icc_struct,
- "reset default profile\n");
pdf_set_process_color_model(pdev,1);
ecode = gsicc_init_device_profile_struct((gx_device *)pdev, NULL, 0);
if (ecode < 0)
@@ -701,6 +852,11 @@ gdev_pdf_put_params_impl(gx_device * dev, const gx_device_pdf * save_dev, gs_par
}
}
+ if (pdev->Linearise && pdev->file != NULL && !gp_fseekable(pdev->file)) {
+ emprintf(pdev->memory, "Can't linearise a non-seekable output file, ignoring\n");
+ pdev->Linearise = false;
+ }
+
if (pdev->Linearise && pdev->is_ps2write) {
emprintf(pdev->memory, "Can't linearise PostScript output, ignoring\n");
pdev->Linearise = false;