diff options
Diffstat (limited to 'devices/vector/gdevpdfp.c')
-rw-r--r-- | devices/vector/gdevpdfp.c | 182 |
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; |