poppler/PDFDoc.cc |   25 ++++++++++++++++++++-----
 1 file changed, 20 insertions(+), 5 deletions(-)

New commits:
commit a563801e1a6be5e70645472d82f4ba8534b454d1
Author: Albert Astals Cid <aa...@kde.org>
Date:   Mon Dec 12 23:40:24 2022 +0100

    PDFDoc::sign: Find Arial to sign if Helvetica isn't found
    
    At least on my Windows install Helvetica isn't found and signing thus
    fails

diff --git a/poppler/PDFDoc.cc b/poppler/PDFDoc.cc
index c46ed0c4..e5b6ed55 100644
--- a/poppler/PDFDoc.cc
+++ b/poppler/PDFDoc.cc
@@ -63,6 +63,7 @@
 #include <config.h>
 #include <poppler-config.h>
 
+#include <array>
 #include <cctype>
 #include <clocale>
 #include <cstdio>
@@ -2152,6 +2153,24 @@ bool PDFDoc::hasJavascript()
     return jsInfo.containsJS();
 }
 
+static std::string findPdfFontNameToUseForSigning(Form *form)
+{
+    static constexpr std::array<const char *, 2> fontsToUseToSign = { 
"Helvetica", "Arial" };
+    for (const char *fontToUseToSign : fontsToUseToSign) {
+        std::string pdfFontName = 
form->findFontInDefaultResources(fontToUseToSign, "");
+        if (!pdfFontName.empty()) {
+            return pdfFontName;
+        }
+
+        pdfFontName = form->addFontToDefaultResources(fontToUseToSign, 
"").fontName;
+        if (!pdfFontName.empty()) {
+            return pdfFontName;
+        }
+    }
+
+    return {};
+}
+
 bool PDFDoc::sign(const char *saveFilename, const char *certNickname, const 
char *password, GooString *partialFieldName, int page, const PDFRectangle 
&rect, const GooString &signatureText, const GooString &signatureTextLeft,
                   double fontSize, double leftFontSize, 
std::unique_ptr<AnnotColor> &&fontColor, double borderWidth, 
std::unique_ptr<AnnotColor> &&borderColor, std::unique_ptr<AnnotColor> 
&&backgroundColor, const GooString *reason,
                   const GooString *location, const std::string &imagePath, 
const std::optional<GooString> &ownerPassword, const std::optional<GooString> 
&userPassword)
@@ -2169,11 +2188,7 @@ bool PDFDoc::sign(const char *saveFilename, const char 
*certNickname, const char
     }
 
     Form *form = catalog->getCreateForm();
-    std::string pdfFontName = form->findFontInDefaultResources("Helvetica", 
"");
-    if (pdfFontName.empty()) {
-        pdfFontName = form->addFontToDefaultResources("Helvetica", 
"").fontName;
-    }
-
+    const std::string pdfFontName = findPdfFontNameToUseForSigning(form);
     if (pdfFontName.empty()) {
         return false;
     }

Reply via email to