Skip to content
Commits on Source (14)
......@@ -85,18 +85,6 @@ build_ubuntu_20_04:
- ninja
- ctest --output-on-failure
build_mingw64_fedora38:
stage: build
image: fedora:38
before_script:
- dnf install -y 'dnf-command(builddep)'
- dnf builddep -y mingw64-poppler
- dnf -y install glibc-langpack-en make ninja-build mingw64-boost mingw64-curl mingw64-qt6-qtbase mingw64-gcc-c++
script:
- mkdir -p build && cd build
- mingw64-cmake -G Ninja ..
- ninja
build_clazy_clang15:
stage: build
script:
......
......@@ -40,7 +40,7 @@ if (ECM_FOUND)
endif()
set(POPPLER_MAJOR_VERSION "23")
set(POPPLER_MINOR_VERSION_STRING "07")
set(POPPLER_MINOR_VERSION_STRING "08")
# We want the string version to have 08 but the integer version can't have a leading 0 since otherwise it's considered octal
# So strip a leading 0 if found in POPPLER_MINOR_VERSION_STRING and store the result in POPPLER_MINOR_VERSION
string(REGEX REPLACE "^0?(.+)$" "\\1" POPPLER_MINOR_VERSION "${POPPLER_MINOR_VERSION_STRING}")
......@@ -616,10 +616,17 @@ ADD_GPERF_FILE(TimesItalicWidths)
ADD_GPERF_FILE(TimesRomanWidths)
ADD_GPERF_FILE(ZapfDingbatsWidths)
set(POPPLER_SOVERSION_NUMBER "130")
set(LINKER_SCRIPT "${CMAKE_BINARY_DIR}/libpoppler.map")
configure_file(
"${CMAKE_SOURCE_DIR}/poppler/libpoppler.map.in"
${LINKER_SCRIPT})
if(MSVC)
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
endif()
add_library(poppler ${poppler_SRCS})
add_library(poppler ${poppler_SRCS} ${LINKER_SCRIPT})
if (OpenJPEG_FOUND)
# check if we can remove this when we depend on newer openjpeg versions, 2.5 seems fixed
# target openjp2 may lack interface include directories
......@@ -629,7 +636,13 @@ if(USE_CMS)
target_include_directories(poppler SYSTEM PRIVATE ${LCMS2_INCLUDE_DIR})
endif()
generate_export_header(poppler BASE_NAME poppler-private EXPORT_FILE_NAME "${CMAKE_CURRENT_BINARY_DIR}/poppler_private_export.h")
set_target_properties(poppler PROPERTIES VERSION 130.0.0 SOVERSION 130)
set_target_properties(poppler PROPERTIES
VERSION ${POPPLER_SOVERSION_NUMBER}.0.0
SOVERSION ${POPPLER_SOVERSION_NUMBER})
if(UNIX AND (NOT APPLE))
set_target_properties(poppler PROPERTIES LINK_OPTIONS LINKER:--version-script=${LINKER_SCRIPT})
endif()
if(MINGW AND BUILD_SHARED_LIBS)
get_target_property(POPPLER_SOVERSION poppler SOVERSION)
set_target_properties(poppler PROPERTIES SUFFIX "-${POPPLER_SOVERSION}${CMAKE_SHARED_LIBRARY_SUFFIX}")
......
Release 23.08.0:
core:
* Fix GWG 19.2 - DeviceN Overprint (White)
* Splash: avoid bogus memory allocation size in doTilingPatternFill
* Fix use-of-uninitialized-value in XRef
* Fix float-cast-overflow error in Catalog
* Cleanup gpgme backend code
* Version symbols in poppler core
glib:
* Improve poppler_get_available_signing_certificates
* Add new members to PopplerCertificateInfo
utils:
* pdftotext: small improvement to man page
Release 23.07.0:
core:
* Fix reading of utf8-with-bom files
......
......@@ -31,7 +31,7 @@ PROJECT_NAME = "Poppler CPP"
# This could be handy for archiving the generated documentation or
# if some version control system is used.
PROJECT_NUMBER = 23.07.0
PROJECT_NUMBER = 23.08.0
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
# base path where the generated documentation will be put.
......
......@@ -90,7 +90,7 @@ set(poppler_glib_generated_SRCS
)
add_library(poppler-glib ${poppler_glib_SRCS} ${poppler_glib_generated_SRCS})
generate_export_header(poppler-glib EXPORT_MACRO_NAME POPPLER_PUBLIC EXPORT_FILE_NAME "${CMAKE_CURRENT_BINARY_DIR}/poppler-macros.h")
set_target_properties(poppler-glib PROPERTIES VERSION 8.25.0 SOVERSION 8)
set_target_properties(poppler-glib PROPERTIES VERSION 8.26.0 SOVERSION 8)
if(MINGW AND BUILD_SHARED_LIBS)
get_target_property(POPPLER_GLIB_SOVERSION poppler-glib SOVERSION)
set_target_properties(poppler-glib PROPERTIES SUFFIX "-${POPPLER_GLIB_SOVERSION}${CMAKE_SHARED_LIBRARY_SUFFIX}")
......
......@@ -4,7 +4,7 @@
* Copyright (C) 2006 Julien Rebetez
* Copyright (C) 2020 Oliver Sander <oliver.sander@tu-dresden.de>
* Copyright (C) 2021 André Guerreiro <aguerreiro1985@gmail.com>
* Copyright (C) 2021 Marek Kasik <mkasik@redhat.com>
* Copyright (C) 2021, 2023 Marek Kasik <mkasik@redhat.com>
* Copyright (C) 2023 g10 Code GmbH, Author: Sune Stolborg Vuorela <sune@vuorela.dk>
*
* This program is free software; you can redistribute it and/or modify
......@@ -394,6 +394,30 @@ gchar *poppler_form_field_get_alternate_ui_name(PopplerFormField *field)
return tmp ? _poppler_goo_string_to_utf8(tmp) : nullptr;
}
/**
* PopplerCertificateInfo:
*
* PopplerCertificateInfo contains detailed info about a signing certificate.
*
* Since: 23.07.0
*/
struct _PopplerCertificateInfo
{
char *id;
char *subject_common_name;
char *subject_organization;
char *subject_email;
char *issuer_common_name;
char *issuer_organization;
char *issuer_email;
GDateTime *issued;
GDateTime *expires;
};
typedef struct _PopplerCertificateInfo PopplerCertificateInfo;
G_DEFINE_BOXED_TYPE(PopplerCertificateInfo, poppler_certificate_info, poppler_certificate_info_copy, poppler_certificate_info_free)
/**
* PopplerSignatureInfo:
*
......@@ -408,6 +432,7 @@ struct _PopplerSignatureInfo
PopplerCertificateStatus cert_status;
char *signer_name;
GDateTime *local_signing_time;
PopplerCertificateInfo *certificate_info;
};
static PopplerSignatureInfo *_poppler_form_field_signature_validate(PopplerFormField *field, PopplerSignatureValidationFlags flags, gboolean force_revalidation, GError **error)
......@@ -415,6 +440,7 @@ static PopplerSignatureInfo *_poppler_form_field_signature_validate(PopplerFormF
FormFieldSignature *sig_field;
SignatureInfo *sig_info;
PopplerSignatureInfo *poppler_sig_info;
const X509CertificateInfo *certificate_info;
if (poppler_form_field_get_field_type(field) != POPPLER_FORM_FIELD_SIGNATURE) {
g_set_error(error, POPPLER_ERROR, POPPLER_ERROR_INVALID, "Wrong FormField type");
......@@ -479,6 +505,23 @@ static PopplerSignatureInfo *_poppler_form_field_signature_validate(PopplerFormF
poppler_sig_info->signer_name = g_strdup(signerName.c_str());
poppler_sig_info->local_signing_time = g_date_time_new_from_unix_local(sig_info->getSigningTime());
certificate_info = sig_info->getCertificateInfo();
if (certificate_info != nullptr) {
const X509CertificateInfo::EntityInfo &subject_info = certificate_info->getSubjectInfo();
const X509CertificateInfo::EntityInfo &issuer_info = certificate_info->getIssuerInfo();
const X509CertificateInfo::Validity &validity = certificate_info->getValidity();
poppler_sig_info->certificate_info = poppler_certificate_info_new();
poppler_sig_info->certificate_info->subject_common_name = g_strdup(subject_info.commonName.c_str());
poppler_sig_info->certificate_info->subject_organization = g_strdup(subject_info.organization.c_str());
poppler_sig_info->certificate_info->subject_email = g_strdup(subject_info.email.c_str());
poppler_sig_info->certificate_info->issuer_common_name = g_strdup(issuer_info.commonName.c_str());
poppler_sig_info->certificate_info->issuer_email = g_strdup(issuer_info.email.c_str());
poppler_sig_info->certificate_info->issuer_organization = g_strdup(issuer_info.organization.c_str());
poppler_sig_info->certificate_info->issued = g_date_time_new_from_unix_utc(validity.notBefore);
poppler_sig_info->certificate_info->expires = g_date_time_new_from_unix_utc(validity.notAfter);
}
return poppler_sig_info;
}
......@@ -602,6 +645,7 @@ PopplerSignatureInfo *poppler_signature_info_copy(const PopplerSignatureInfo *si
new_info->cert_status = siginfo->cert_status;
new_info->signer_name = g_strdup(siginfo->signer_name);
new_info->local_signing_time = g_date_time_ref(siginfo->local_signing_time);
new_info->certificate_info = poppler_certificate_info_copy(siginfo->certificate_info);
return new_info;
}
......@@ -622,6 +666,7 @@ void poppler_signature_info_free(PopplerSignatureInfo *siginfo)
g_date_time_unref(siginfo->local_signing_time);
g_free(siginfo->signer_name);
poppler_certificate_info_free(siginfo->certificate_info);
g_free(siginfo);
}
......@@ -642,6 +687,23 @@ PopplerSignatureStatus poppler_signature_info_get_signature_status(const Poppler
return siginfo->sig_status;
}
/**
* poppler_signature_info_get_certificate_info:
* @siginfo: a #PopplerSignatureInfo
*
* Returns PopplerCertificateInfo for given PopplerSignatureInfo.
*
* Return value: (transfer none): certificate info of the signature
*
* Since: 23.08.0
**/
PopplerCertificateInfo *poppler_signature_info_get_certificate_info(const PopplerSignatureInfo *siginfo)
{
g_return_val_if_fail(siginfo != NULL, NULL);
return siginfo->certificate_info;
}
/**
* poppler_signature_info_get_certificate_status:
* @siginfo: a #PopplerSignatureInfo
......@@ -1909,16 +1971,6 @@ const gchar *poppler_signing_data_get_document_user_password(const PopplerSignin
/* Certificate Information */
struct _PopplerCertificateInfo
{
char *id;
char *subject_common_name;
};
typedef struct _PopplerCertificateInfo PopplerCertificateInfo;
G_DEFINE_BOXED_TYPE(PopplerCertificateInfo, poppler_certificate_info, poppler_certificate_info_copy, poppler_certificate_info_free)
/**
* poppler_certificate_info_new:
*
......@@ -1965,15 +2017,139 @@ const char *poppler_certificate_info_get_subject_common_name(const PopplerCertif
return certificate_info->subject_common_name;
}
/**
* poppler_certificate_info_get_subject_organization:
* @certificate_info: a #PopplerCertificateInfo structure containing certificate information
*
* Get certificate subject organization
*
* Return value: certificate subject organization
*
* Since: 23.08.0
**/
const char *poppler_certificate_info_get_subject_organization(const PopplerCertificateInfo *certificate_info)
{
g_return_val_if_fail(certificate_info != nullptr, nullptr);
return certificate_info->subject_organization;
}
/**
* poppler_certificate_info_get_subject_email:
* @certificate_info: a #PopplerCertificateInfo structure containing certificate information
*
* Get certificate subject email
*
* Return value: certificate subject email
*
* Since: 23.08.0
**/
const char *poppler_certificate_info_get_subject_email(const PopplerCertificateInfo *certificate_info)
{
g_return_val_if_fail(certificate_info != nullptr, nullptr);
return certificate_info->subject_email;
}
/**
* poppler_certificate_info_get_issuer_common_name:
* @certificate_info: a #PopplerCertificateInfo structure containing certificate information
*
* Get certificate issuer common name
*
* Return value: certificate issuer common name
*
* Since: 23.08.0
**/
const char *poppler_certificate_info_get_issuer_common_name(const PopplerCertificateInfo *certificate_info)
{
g_return_val_if_fail(certificate_info != nullptr, nullptr);
return certificate_info->issuer_common_name;
}
/**
* poppler_certificate_info_get_issuer_organization:
* @certificate_info: a #PopplerCertificateInfo structure containing certificate information
*
* Get certificate issuer organization
*
* Return value: certificate issuer organization
*
* Since: 23.08.0
**/
const char *poppler_certificate_info_get_issuer_organization(const PopplerCertificateInfo *certificate_info)
{
g_return_val_if_fail(certificate_info != nullptr, nullptr);
return certificate_info->issuer_organization;
}
/**
* poppler_certificate_info_get_issuer_email:
* @certificate_info: a #PopplerCertificateInfo structure containing certificate information
*
* Get certificate issuer email
*
* Return value: certificate issuer email
*
* Since: 23.08.0
**/
const char *poppler_certificate_info_get_issuer_email(const PopplerCertificateInfo *certificate_info)
{
g_return_val_if_fail(certificate_info != nullptr, nullptr);
return certificate_info->issuer_email;
}
/**
* poppler_certificate_info_get_issuance_time:
* @certificate_info: a #PopplerCertificateInfo structure containing certificate information
*
* Get certificate issuance time
*
* Return value: (transfer none): certificate issuance time
*
* Since: 23.08.0
**/
GDateTime *poppler_certificate_info_get_issuance_time(const PopplerCertificateInfo *certificate_info)
{
g_return_val_if_fail(certificate_info != nullptr, nullptr);
return certificate_info->issued;
}
/**
* poppler_certificate_info_get_expiration_time:
* @certificate_info: a #PopplerCertificateInfo structure containing certificate information
*
* Get certificate expiration time
*
* Return value: (transfer none): certificate expiration time
*
* Since: 23.08.0
**/
GDateTime *poppler_certificate_info_get_expiration_time(const PopplerCertificateInfo *certificate_info)
{
g_return_val_if_fail(certificate_info != nullptr, nullptr);
return certificate_info->expires;
}
static PopplerCertificateInfo *create_certificate_info(const X509CertificateInfo *ci)
{
PopplerCertificateInfo *certificate_info;
g_return_val_if_fail(ci != nullptr, nullptr);
const X509CertificateInfo::EntityInfo &subject_info = ci->getSubjectInfo();
const X509CertificateInfo::EntityInfo &issuer_info = ci->getIssuerInfo();
const X509CertificateInfo::Validity &validity = ci->getValidity();
certificate_info = poppler_certificate_info_new();
certificate_info->id = g_strdup(ci->getNickName().c_str());
certificate_info->subject_common_name = g_strdup(ci->getSubjectInfo().commonName.c_str());
certificate_info->subject_common_name = g_strdup(subject_info.commonName.c_str());
certificate_info->subject_organization = g_strdup(subject_info.organization.c_str());
certificate_info->subject_email = g_strdup(subject_info.email.c_str());
certificate_info->issuer_common_name = g_strdup(issuer_info.commonName.c_str());
certificate_info->issuer_organization = g_strdup(issuer_info.organization.c_str());
certificate_info->issuer_email = g_strdup(issuer_info.email.c_str());
certificate_info->issued = g_date_time_new_from_unix_utc(validity.notBefore);
certificate_info->expires = g_date_time_new_from_unix_utc(validity.notAfter);
return certificate_info;
}
......@@ -1996,6 +2172,13 @@ PopplerCertificateInfo *poppler_certificate_info_copy(const PopplerCertificateIn
dup = (PopplerCertificateInfo *)g_malloc0(sizeof(PopplerCertificateInfo));
dup->id = g_strdup(certificate_info->id);
dup->subject_common_name = g_strdup(certificate_info->subject_common_name);
dup->subject_organization = g_strdup(certificate_info->subject_organization);
dup->subject_email = g_strdup(certificate_info->subject_email);
dup->issuer_common_name = g_strdup(certificate_info->issuer_common_name);
dup->issuer_organization = g_strdup(certificate_info->issuer_organization);
dup->issuer_email = g_strdup(certificate_info->issuer_email);
dup->issued = g_date_time_ref(certificate_info->issued);
dup->expires = g_date_time_ref(certificate_info->expires);
return dup;
}
......@@ -2016,6 +2199,13 @@ void poppler_certificate_info_free(PopplerCertificateInfo *certificate_info)
g_clear_pointer(&certificate_info->id, g_free);
g_clear_pointer(&certificate_info->subject_common_name, g_free);
g_clear_pointer(&certificate_info->subject_organization, g_free);
g_clear_pointer(&certificate_info->subject_email, g_free);
g_clear_pointer(&certificate_info->issuer_common_name, g_free);
g_clear_pointer(&certificate_info->issuer_organization, g_free);
g_clear_pointer(&certificate_info->issuer_email, g_free);
g_clear_pointer(&certificate_info->issued, g_date_time_unref);
g_clear_pointer(&certificate_info->expires, g_date_time_unref);
g_free(certificate_info);
}
......@@ -2030,14 +2220,17 @@ void poppler_certificate_info_free(PopplerCertificateInfo *certificate_info)
GList *poppler_get_available_signing_certificates(void)
{
GList *list = nullptr;
#ifdef ENABLE_NSS3
std::vector<std::unique_ptr<X509CertificateInfo>> vCerts = CryptoSign::Factory::createActive()->getAvailableSigningCertificates();
auto backend = CryptoSign::Factory::createActive();
if (!backend) {
return nullptr;
}
std::vector<std::unique_ptr<X509CertificateInfo>> vCerts = backend->getAvailableSigningCertificates();
for (auto &cert : vCerts) {
PopplerCertificateInfo *certificate_info = create_certificate_info(cert.get());
list = g_list_append(list, certificate_info);
}
#endif
return list;
}
......
......@@ -2,7 +2,7 @@
*
* Copyright (C) 2007 Carlos Garcia Campos <carlosgc@gnome.org>
* Copyright (C) 2021 André Guerreiro <aguerreiro1985@gmail.com>
* Copyright (C) 2021 Marek Kasik <mkasik@redhat.com>
* Copyright (C) 2021, 2023 Marek Kasik <mkasik@redhat.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
......@@ -245,6 +245,8 @@ PopplerSignatureStatus poppler_signature_info_get_signature_status(const Poppler
POPPLER_PUBLIC
PopplerCertificateStatus poppler_signature_info_get_certificate_status(const PopplerSignatureInfo *siginfo);
POPPLER_PUBLIC
PopplerCertificateInfo *poppler_signature_info_get_certificate_info(const PopplerSignatureInfo *siginfo);
POPPLER_PUBLIC
const gchar *poppler_signature_info_get_signer_name(const PopplerSignatureInfo *siginfo);
POPPLER_PUBLIC
GDateTime *poppler_signature_info_get_local_signing_time(const PopplerSignatureInfo *siginfo);
......@@ -350,6 +352,20 @@ const char *poppler_certificate_info_get_id(const PopplerCertificateInfo *certif
POPPLER_PUBLIC
const char *poppler_certificate_info_get_subject_common_name(const PopplerCertificateInfo *certificate_info);
POPPLER_PUBLIC
const char *poppler_certificate_info_get_subject_organization(const PopplerCertificateInfo *certificate_info);
POPPLER_PUBLIC
const char *poppler_certificate_info_get_subject_email(const PopplerCertificateInfo *certificate_info);
POPPLER_PUBLIC
const char *poppler_certificate_info_get_issuer_common_name(const PopplerCertificateInfo *certificate_info);
POPPLER_PUBLIC
const char *poppler_certificate_info_get_issuer_organization(const PopplerCertificateInfo *certificate_info);
POPPLER_PUBLIC
const char *poppler_certificate_info_get_issuer_email(const PopplerCertificateInfo *certificate_info);
POPPLER_PUBLIC
GDateTime *poppler_certificate_info_get_issuance_time(const PopplerCertificateInfo *certificate_info);
POPPLER_PUBLIC
GDateTime *poppler_certificate_info_get_expiration_time(const PopplerCertificateInfo *certificate_info);
POPPLER_PUBLIC
PopplerCertificateInfo *poppler_get_certificate_info_by_id(const char *id);
POPPLER_PUBLIC
GList *poppler_get_available_signing_certificates(void);
......
......@@ -366,6 +366,7 @@ poppler_attachment_get_type
<TITLE>PopplerFormField</TITLE>
PopplerFormField
PopplerAdditionalActionType
PopplerCertificateInfo
PopplerCertificateStatus
PopplerFormFieldType
PopplerFormButtonType
......@@ -374,6 +375,14 @@ PopplerFormTextType
PopplerSignatureInfo
PopplerSignatureStatus
PopplerSignatureValidationFlags
poppler_certificate_info_get_expiration_time
poppler_certificate_info_get_issuance_time
poppler_certificate_info_get_issuer_common_name
poppler_certificate_info_get_issuer_email
poppler_certificate_info_get_issuer_organization
poppler_certificate_info_get_subject_common_name
poppler_certificate_info_get_subject_email
poppler_certificate_info_get_subject_organization
poppler_form_field_button_get_button_type
poppler_form_field_button_get_state
poppler_form_field_button_set_state
......@@ -413,6 +422,7 @@ poppler_form_field_text_is_rich_text
poppler_form_field_text_set_text
poppler_signature_info_copy
poppler_signature_info_free
poppler_signature_info_get_certificate_info
poppler_signature_info_get_certificate_status
poppler_signature_info_get_signature_status
poppler_signature_info_get_signer_name
......
......@@ -25,6 +25,7 @@ poppler_annot_text_state_get_type
poppler_annot_type_get_type
poppler_attachment_get_type
poppler_backend_get_type
poppler_certificate_info_get_type
poppler_certificate_status_get_type
poppler_color_get_type
poppler_dest_get_type
......
......@@ -40,6 +40,7 @@
// Copyright (C) 2020 Thorsten Behrens <Thorsten.Behrens@CIB.de>
// Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, <info@kdab.com>. Work sponsored by Technische Universität Dresden
// Copyright (C) 2021 RM <rm+git@arcsin.org>
// Copyright (C) 2023 Ilaï Deutel <idtl@google.com>
//
// To see a description of the changes please see the Changelog file that
// came with your tarball or type make ChangeLog if you are building from git
......@@ -875,7 +876,13 @@ int Catalog::getNumPages()
numPages = 0;
}
} else {
numPages = (int)obj.getNum();
if (obj.isInt()) {
numPages = obj.getInt();
} else if (obj.isInt64()) {
numPages = obj.getInt64();
} else {
numPages = obj.getNum();
}
if (numPages <= 0) {
error(errSyntaxError, -1, "Invalid page count {0:d}", numPages);
numPages = 0;
......
......@@ -163,9 +163,9 @@ GpgSignatureBackend::GpgSignatureBackend()
GpgME::initializeLibrary();
}
std::unique_ptr<CryptoSign::SigningInterface> GpgSignatureBackend::createSigningHandler(const std::string &certID, HashAlgorithm digestAlgTag)
std::unique_ptr<CryptoSign::SigningInterface> GpgSignatureBackend::createSigningHandler(const std::string &certID, HashAlgorithm /*digestAlgTag*/)
{
return std::make_unique<GpgSignatureCreation>(certID, digestAlgTag);
return std::make_unique<GpgSignatureCreation>(certID);
}
std::unique_ptr<CryptoSign::VerificationInterface> GpgSignatureBackend::createVerificationHandler(std::vector<unsigned char> &&pkcs7)
......@@ -195,7 +195,7 @@ std::vector<std::unique_ptr<X509CertificateInfo>> GpgSignatureBackend::getAvaila
return certificates;
}
GpgSignatureCreation::GpgSignatureCreation(const std::string &certId, HashAlgorithm digestAlgTag) : gpgContext { GpgME::Context::create(GpgME::CMS) }
GpgSignatureCreation::GpgSignatureCreation(const std::string &certId) : gpgContext { GpgME::Context::create(GpgME::CMS) }
{
GpgME::Error error;
const auto signingKey = gpgContext->key(certId.c_str(), error, true);
......
......@@ -25,7 +25,7 @@ public:
class GpgSignatureCreation : public CryptoSign::SigningInterface
{
public:
GpgSignatureCreation(const std::string &certId, HashAlgorithm digestAlgTag);
GpgSignatureCreation(const std::string &certId);
void addData(unsigned char *dataBlock, int dataLen) final;
std::unique_ptr<X509CertificateInfo> getCertificateInfo() const final;
std::optional<GooString> signDetached(const std::string &password) final;
......
......@@ -18,7 +18,7 @@
// Copyright (C) 2006, 2010 Carlos Garcia Campos <carlosgc@gnome.org>
// Copyright (C) 2006-2022 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2009, 2012 Koji Otani <sho@bbr.jp>
// Copyright (C) 2009, 2011-2016, 2020 Thomas Freitag <Thomas.Freitag@alfa.de>
// Copyright (C) 2009, 2011-2016, 2020, 2023 Thomas Freitag <Thomas.Freitag@alfa.de>
// Copyright (C) 2009, 2019 Christian Persch <chpe@gnome.org>
// Copyright (C) 2010 Paweł Wiejacha <pawel.wiejacha@gmail.com>
// Copyright (C) 2010 Christian Feuersänger <cfeuersaenger@googlemail.com>
......@@ -2856,7 +2856,7 @@ GfxDeviceNColorSpace::GfxDeviceNColorSpace(int nCompsA, std::vector<std::string>
overprintMask |= 0x08;
} else if (names[i] == "All") {
overprintMask = 0xffffffff;
} else {
} else if (names[i] != "None") {
overprintMask = 0x0f;
}
}
......
......@@ -20,7 +20,7 @@
// Copyright (C) 2006 Scott Turner <scotty1024@mac.com>
// Copyright (C) 2007 Koji Otani <sho@bbr.jp>
// Copyright (C) 2009 Petr Gajdos <pgajdos@novell.com>
// Copyright (C) 2009-2016, 2020, 2022 Thomas Freitag <Thomas.Freitag@alfa.de>
// Copyright (C) 2009-2016, 2020, 2022, 2023 Thomas Freitag <Thomas.Freitag@alfa.de>
// Copyright (C) 2009 Carlos Garcia Campos <carlosgc@gnome.org>
// Copyright (C) 2009, 2014-2016, 2019 William Bader <williambader@hotmail.com>
// Copyright (C) 2010 Patrick Spendrin <ps_ml@gmx.de>
......@@ -1704,7 +1704,7 @@ void SplashOutputDev::setOverprintMask(GfxColorSpace *colorSpace, bool overprint
mask &= ~8;
}
}
if (grayIndexed) {
if (grayIndexed && colorSpace->getMode() != csDeviceN) {
mask &= ~7;
} else if (colorSpace->getMode() == csSeparation) {
GfxSeparationColorSpace *deviceSep = (GfxSeparationColorSpace *)colorSpace;
......@@ -4309,6 +4309,15 @@ bool SplashOutputDev::tilingPatternFill(GfxState *state, Gfx *gfxA, Catalog *cat
surface_height = (int)ceil(fabs(ky));
repeatX = x1 - x0;
repeatY = y1 - y0;
while ((unsigned long)repeatX * repeatY > 0x800000L) {
// try to avoid bogus memory allocation size
if (repeatX > 1) {
repeatX /= 2;
}
if (repeatY > 1) {
repeatY /= 2;
}
}
} else {
if ((unsigned long)surface_width * surface_height > 0x800000L) {
state->setCTM(savedCTM[0], savedCTM[1], savedCTM[2], savedCTM[3], savedCTM[4], savedCTM[5]);
......
......@@ -33,6 +33,7 @@
// Copyright (C) 2021 Mahmoud Khalil <mahmoudkhalil11@gmail.com>
// Copyright (C) 2021 Georgiy Sgibnev <georgiy@sgibnev.com>. Work sponsored by lab50.net.
// Copyright (C) 2023 g10 Code GmbH, Author: Sune Stolborg Vuorela <sune@vuorela.dk>
// Copyright (C) 2023 Ilaï Deutel <idtl@google.com>
//
// To see a description of the changes please see the Changelog file that
// came with your tarball or type make ChangeLog if you are building from git
......@@ -257,6 +258,7 @@ XRef::XRef() : objStrs { 5 }
strOwner = false;
xrefReconstructed = false;
encAlgorithm = cryptNone;
keyLength = 0;
}
XRef::XRef(const Object *trailerDictA) : XRef {}
......
POPPLER_@POPPLER_SOVERSION_NUMBER@ {
global:
*;
};
......@@ -31,7 +31,7 @@ PROJECT_NAME = "Poppler Qt5"
# This could be handy for archiving the generated documentation or
# if some version control system is used.
PROJECT_NUMBER = 23.07.0
PROJECT_NUMBER = 23.08.0
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
# base path where the generated documentation will be put.
......
......@@ -31,7 +31,7 @@ PROJECT_NAME = "Poppler Qt6"
# This could be handy for archiving the generated documentation or
# if some version control system is used.
PROJECT_NUMBER = 23.07.0
PROJECT_NUMBER = 23.08.0
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
# base path where the generated documentation will be put.
......
......@@ -6,8 +6,8 @@ pdftotext \- Portable Document Format (PDF) to text converter
.SH SYNOPSIS
.B pdftotext
[options]
.RI [ PDF-file
.RI [ text-file ]]
.RI PDF-file
.RI [ text-file ]
.SH DESCRIPTION
.B Pdftotext
converts Portable Document Format (PDF) files to plain text.
......@@ -22,7 +22,7 @@ is not specified, pdftotext converts
.I file.pdf
to
.IR file.txt .
If
If
.I text-file
is \'-', the text is sent to stdout. If
.I PDF-file
......