sdext/source/pdfimport/inc/contentsink.hxx                                 |   
12 -
 sdext/source/pdfimport/inc/pdfihelper.hxx                                  |   
 2 
 sdext/source/pdfimport/inc/wrapper.hxx                                     |   
 1 
 sdext/source/pdfimport/test/testdocs/tdf78427-MyraidPro-Semibold-Light.pdf 
|binary
 sdext/source/pdfimport/test/tests.cxx                                      |   
65 +++++--
 sdext/source/pdfimport/tree/drawtreevisiting.cxx                           |   
 9 -
 sdext/source/pdfimport/tree/pdfiprocessor.cxx                              |   
 4 
 sdext/source/pdfimport/tree/writertreevisiting.cxx                         |   
20 +-
 sdext/source/pdfimport/wrapper/wrapper.cxx                                 |   
88 ++++++++--
 sdext/source/pdfimport/xpdfwrapper/pdfioutdev_gpl.cxx                      |   
 4 
 sdext/source/pdfimport/xpdfwrapper/pdfioutdev_gpl.hxx                      |   
12 -
 11 files changed, 158 insertions(+), 59 deletions(-)

New commits:
commit 4eef83dc4a8879f21ee6c98226510ac728bc317a
Author:     Kevin Suo <suokunl...@126.com>
AuthorDate: Sun Oct 10 21:25:58 2021 +0800
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Mon Oct 11 09:07:59 2021 +0200

    sdext.pdfimport tdf#78427: Add support for more Font Weight features
    
    ...e.g. Thin, Extra-Light, Light, Semi-Bold, Bold, Extra-Bold and Black.
    
    Previously the xpdfimport code passes the isBold value which is bool value.
    sdext.pdfimport accepted this value from the xpdfimport output and check
    whether a font is bold or not. However, there are many other FontWeight
    features more than a "bold".
    
    This patch changes the isBold to the GfxFont::Weight type, and changed the
    sdext.pdfimport isBold bool type (in FontAttributes) to an OUString 
fontWeight.
    The value for the fontWeight is set according to the GfxFont::Weight passed
    by xpdfimport, and then this fontWeight is passed to the ODF xml generation
    stage and used there directly.
    
    Now the Semibold and Light (as shown in the unittest file) can be currectly
    handled. However, for other weights the parseFontFamilyName still need to
    be updated, but before doing that I plan to refector this function as the
    current logic is very difficult for maintennance.
    
    Change-Id: If2ce5f0f41c83843d8a6aeb30134b3faf99ba877
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/123339
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>

diff --git a/sdext/source/pdfimport/inc/contentsink.hxx 
b/sdext/source/pdfimport/inc/contentsink.hxx
index dbe1b0e08808..9d016a7e2a3e 100644
--- a/sdext/source/pdfimport/inc/contentsink.hxx
+++ b/sdext/source/pdfimport/inc/contentsink.hxx
@@ -48,14 +48,14 @@ namespace pdfi
 {
     struct FontAttributes
     {
-        FontAttributes( const OUString& familyName_,
-                        bool                 isBold_,
+        FontAttributes( const OUString&      familyName_,
+                        const OUString&      sFontWeight,
                         bool                 isItalic_,
                         bool                 isUnderline_,
                         double               size_,
                         double               ascent_) :
             familyName(familyName_),
-            isBold(isBold_),
+            fontWeight(sFontWeight),
             isItalic(isItalic_),
             isUnderline(isUnderline_),
             isOutline(false),
@@ -65,7 +65,7 @@ namespace pdfi
 
         FontAttributes() :
             familyName(),
-            isBold(false),
+            fontWeight(u"normal"),
             isItalic(false),
             isUnderline(false),
             isOutline(false),
@@ -74,7 +74,7 @@ namespace pdfi
         {}
 
         OUString            familyName;
-        bool                isBold;
+        OUString            fontWeight;
         bool                isItalic;
         bool                isUnderline;
         bool                isOutline;
@@ -84,7 +84,7 @@ namespace pdfi
         bool operator==(const FontAttributes& rFont) const
         {
             return familyName == rFont.familyName &&
-                !isBold == !rFont.isBold &&
+                fontWeight == rFont.fontWeight &&
                 !isItalic == !rFont.isItalic &&
                 !isUnderline == !rFont.isUnderline &&
                 !isOutline == !rFont.isOutline &&
diff --git a/sdext/source/pdfimport/inc/pdfihelper.hxx 
b/sdext/source/pdfimport/inc/pdfihelper.hxx
index aa3a22bd2b67..6b663b203e62 100644
--- a/sdext/source/pdfimport/inc/pdfihelper.hxx
+++ b/sdext/source/pdfimport/inc/pdfihelper.hxx
@@ -82,7 +82,7 @@ namespace pdfi
         {
             std::size_t seed = 0;
             o3tl::hash_combine(seed, rFont.familyName.hashCode());
-            o3tl::hash_combine(seed, rFont.isBold);
+            o3tl::hash_combine(seed, rFont.fontWeight);
             o3tl::hash_combine(seed, rFont.isItalic);
             o3tl::hash_combine(seed, rFont.isUnderline);
             o3tl::hash_combine(seed, rFont.isOutline);
diff --git a/sdext/source/pdfimport/inc/wrapper.hxx 
b/sdext/source/pdfimport/inc/wrapper.hxx
index f8682299600c..9f25e1b7290b 100644
--- a/sdext/source/pdfimport/inc/wrapper.hxx
+++ b/sdext/source/pdfimport/inc/wrapper.hxx
@@ -67,6 +67,7 @@ namespace pdfi
         "Oblique",
         "Bold", //BoldItalic, BoldOblique
         "Light",
+        "Semibold",
         "Reg",
         "VKana",
         "-",
diff --git 
a/sdext/source/pdfimport/test/testdocs/tdf78427-MyraidPro-Semibold-Light.pdf 
b/sdext/source/pdfimport/test/testdocs/tdf78427-MyraidPro-Semibold-Light.pdf
new file mode 100644
index 000000000000..685da5db956c
Binary files /dev/null and 
b/sdext/source/pdfimport/test/testdocs/tdf78427-MyraidPro-Semibold-Light.pdf 
differ
diff --git a/sdext/source/pdfimport/test/testdocs/testFontFeatures.pdf 
b/sdext/source/pdfimport/test/testdocs/tdf78427-testFontFeatures.pdf
similarity index 100%
rename from sdext/source/pdfimport/test/testdocs/testFontFeatures.pdf
rename to sdext/source/pdfimport/test/testdocs/tdf78427-testFontFeatures.pdf
diff --git a/sdext/source/pdfimport/test/tests.cxx 
b/sdext/source/pdfimport/test/tests.cxx
index f47fa459a03c..c8c3b9e28a8f 100644
--- a/sdext/source/pdfimport/test/tests.cxx
+++ b/sdext/source/pdfimport/test/tests.cxx
@@ -583,17 +583,20 @@ namespace
 #endif
         }
 
-        void testFontFeatures() // tdf#78427
+        void testTdf78427_FontFeatures()
         {
             rtl::Reference<pdfi::PDFIRawAdaptor> xAdaptor(new 
pdfi::PDFIRawAdaptor(OUString(), getComponentContext()));
             xAdaptor->setTreeVisitorFactory(createDrawTreeVisitorFactory());
 
             OString aOutput;
             CPPUNIT_ASSERT_MESSAGE("Converting PDF to ODF XML",
-                                   xAdaptor->odfConvert( 
m_directories.getURLFromSrc(u"/sdext/source/pdfimport/test/testdocs/testFontFeatures.pdf"),
-                                                        new 
OutputWrapString(aOutput),
-                                                        nullptr ));
-            std::cout << aOutput << std::endl;
+                xAdaptor->odfConvert( m_directories.getURLFromSrc(
+                    
u"/sdext/source/pdfimport/test/testdocs/tdf78427-testFontFeatures.pdf"),
+                new OutputWrapString(aOutput),
+                nullptr ));
+            // Un-comment the following debug line to see the content of 
generated XML content in
+            // workdir/CppunitTest/sdext_pdfimport.test.log after running 
"make CppunitTest_sdext_pdfimport".
+            //std::cout << aOutput << std::endl;
             xmlDocUniquePtr pXmlDoc(xmlParseDoc(reinterpret_cast<xmlChar const 
*>(aOutput.getStr())));
             //CPPUNIT_ASSERT(pXmlDoc);
 
@@ -602,8 +605,8 @@ namespace
             OString xpath = 
"//office:automatic-styles/style:style[@style:name=\"" +
                 OUStringToOString(styleName,  RTL_TEXTENCODING_UTF8) +
                 "\"]/style:text-properties";
-            // the font-weight and  font-style should be normal (e.g., no such 
attribute)
-            assertXPathNoAttribute(pXmlDoc, xpath, "font-weight");
+            // the font-weight and font-style should be normal
+            assertXPath(pXmlDoc, xpath, "font-weight", "normal");
             assertXPathNoAttribute(pXmlDoc, xpath, "font-style");
 
             /* Test for the 2nd paragraph */
@@ -621,7 +624,7 @@ namespace
                 OUStringToOString(styleName,  RTL_TEXTENCODING_UTF8) +
                 "\"]/style:text-properties";
             // there should be a font-style="italic", but no font-weight bold
-            assertXPathNoAttribute(pXmlDoc, xpath, "font-weight");
+            assertXPath(pXmlDoc, xpath, "font-weight", "normal");
             assertXPath(pXmlDoc, xpath, "font-style", "italic");
 
             /* Test for the 4th paragraph */
@@ -650,7 +653,7 @@ namespace
                 "\"]/style:text-properties";
             // the font should be Arial without font-weight and font-style
             assertXPath(pXmlDoc, xpath, "font-family", "Arial");
-            assertXPathNoAttribute(pXmlDoc, xpath, "font-weight");
+            assertXPath(pXmlDoc, xpath, "font-weight", "normal");
             assertXPathNoAttribute(pXmlDoc, xpath, "font-style");
 
             /* Test for the 7th paragraph */
@@ -660,7 +663,7 @@ namespace
                 "\"]/style:text-properties";
             // the font should be SimSun without font-weight and font-style
             assertXPath(pXmlDoc, xpath, "font-family", "SimSun"); // TODO: 
tdf#143095 use localized font name rather than PS name
-            assertXPathNoAttribute(pXmlDoc, xpath, "font-weight");
+            assertXPath(pXmlDoc, xpath, "font-weight", "normal");
             assertXPathNoAttribute(pXmlDoc, xpath, "font-style");
 
             /* Test for the 8th paragraph */
@@ -678,9 +681,9 @@ namespace
             xpath = "//office:automatic-styles/style:style[@style:name=\"" +
                 OUStringToOString(styleName,  RTL_TEXTENCODING_UTF8) +
                 "\"]/style:text-properties";
-            // the font should be SimSun, no font-weight="bold", with 
font-style="italic"
+            // the font should be SimSun, font-weight should be "normal", 
font-style="italic"
             assertXPath(pXmlDoc, xpath, "font-family", "SimSun");
-            assertXPathNoAttribute(pXmlDoc, xpath, "font-weight");
+            assertXPath(pXmlDoc, xpath, "font-weight", "normal");
             // FIXME and remove the below comment:
             // the chinese chars are shown in pdf as faux italic (fake 
italic). It is currencly imported wrongly as normal font style.
             // See tdf#78427 for how the faux bold problem was handled. Faux 
italic may be handled using the transformation pattern.
@@ -705,11 +708,44 @@ namespace
             // the font should be SimSun and there should be 
style:text-outline="true"
             // (i.e., the real "outline" font rather than faux bold / fake 
bold)
             assertXPath(pXmlDoc, xpath, "font-family", "SimSun");
-            assertXPathNoAttribute(pXmlDoc, xpath, "font-weight");
+            assertXPath(pXmlDoc, xpath, "font-weight", "normal");
             assertXPathNoAttribute(pXmlDoc, xpath, "font-style");
             assertXPath(pXmlDoc, xpath, "text-outline", "true");
         }
 
+        void testTdf78427_FontWeight_MyraidProSemibold() // Related to 
attachment 155937.
+        {
+            rtl::Reference<pdfi::PDFIRawAdaptor> xAdaptor(new 
pdfi::PDFIRawAdaptor(OUString(), getComponentContext()));
+            xAdaptor->setTreeVisitorFactory(createDrawTreeVisitorFactory());
+
+            OString aOutput;
+            CPPUNIT_ASSERT_MESSAGE("Converting PDF to ODF XML",
+                xAdaptor->odfConvert( m_directories.getURLFromSrc(
+                    
u"/sdext/source/pdfimport/test/testdocs/tdf78427-MyraidPro-Semibold-Light.pdf"),
+                new OutputWrapString(aOutput),
+                nullptr ));
+            //std::cout << aOutput << std::endl;
+
+            xmlDocUniquePtr pXmlDoc(xmlParseDoc(reinterpret_cast<xmlChar const 
*>(aOutput.getStr())));
+            //CPPUNIT_ASSERT(pXmlDoc);
+
+            // The for the 1st frame */
+            OUString styleName = getXPath(pXmlDoc, 
"//draw:frame[1]//text:span[1]", "style-name");
+            OString xpath = 
"//office:automatic-styles/style:style[@style:name=\"" +
+                OUStringToOString(styleName,  RTL_TEXTENCODING_UTF8) +
+                "\"]/style:text-properties";
+            // the font-weight and font-style should be 600 (Semibold)
+            assertXPath(pXmlDoc, xpath, "font-weight", "600");
+
+            // The for the 2nd frame */
+            styleName = getXPath(pXmlDoc, "//draw:frame[2]//text:span[1]", 
"style-name");
+            xpath = "//office:automatic-styles/style:style[@style:name=\"" +
+                OUStringToOString(styleName,  RTL_TEXTENCODING_UTF8) +
+                "\"]/style:text-properties";
+            // the font-weight and font-style should be 300 (Light)
+            assertXPath(pXmlDoc, xpath, "font-weight", "300");
+        }
+
         void testTdf143959_nameFromFontFile()
         {
             rtl::Reference<pdfi::PDFIRawAdaptor> xAdaptor(new 
pdfi::PDFIRawAdaptor(OUString(), getComponentContext()));
@@ -751,7 +787,8 @@ namespace
         CPPUNIT_TEST(testTdf98421);
         CPPUNIT_TEST(testTdf105536);
         CPPUNIT_TEST(testTdf141709);
-        CPPUNIT_TEST(testFontFeatures);
+        CPPUNIT_TEST(testTdf78427_FontFeatures);
+        CPPUNIT_TEST(testTdf78427_FontWeight_MyraidProSemibold);
         CPPUNIT_TEST(testTdf143959_nameFromFontFile);
         CPPUNIT_TEST_SUITE_END();
     };
diff --git a/sdext/source/pdfimport/tree/drawtreevisiting.cxx 
b/sdext/source/pdfimport/tree/drawtreevisiting.cxx
index d5ce02ad89bf..436f9f532c20 100644
--- a/sdext/source/pdfimport/tree/drawtreevisiting.cxx
+++ b/sdext/source/pdfimport/tree/drawtreevisiting.cxx
@@ -835,12 +835,9 @@ void DrawXmlFinalizer::visit( TextElement& elem, const 
std::list< std::unique_pt
     aFontProps[ "style:font-family-complex" ] = rFont.familyName;
 
     // bold
-    if( rFont.isBold )
-    {
-        aFontProps[ "fo:font-weight" ]         = "bold";
-        aFontProps[ "style:font-weight-asian" ]   = "bold";
-        aFontProps[ "style:font-weight-complex" ] = "bold";
-    }
+    aFontProps[ "fo:font-weight" ]         = rFont.fontWeight;
+    aFontProps[ "style:font-weight-asian" ]   = rFont.fontWeight;
+    aFontProps[ "style:font-weight-complex" ] = rFont.fontWeight;
 
     // italic
     if( rFont.isItalic )
diff --git a/sdext/source/pdfimport/tree/pdfiprocessor.cxx 
b/sdext/source/pdfimport/tree/pdfiprocessor.cxx
index 86f703c1ac7b..ff105426ad51 100644
--- a/sdext/source/pdfimport/tree/pdfiprocessor.cxx
+++ b/sdext/source/pdfimport/tree/pdfiprocessor.cxx
@@ -57,7 +57,7 @@ namespace pdfi
 {
     FontAttributes aDefFont;
     aDefFont.familyName = "Helvetica";
-    aDefFont.isBold     = false;
+    aDefFont.fontWeight = u"normal";
     aDefFont.isItalic   = false;
     aDefFont.size       = 10*PDFI_OUTDEV_RESOLUTION/72;
     m_aIdToFont.insert({0, aDefFont});
@@ -151,7 +151,7 @@ void PDFIProcessor::setFont( const FontAttributes& i_rFont )
         // Convert to bold instead if the stroke color is the same as the fill 
color,
         // otherwise it should be outline.
         if (getCurrentContext().LineColor == getCurrentContext().FillColor)
-            aChangedFont.isBold = true;
+            aChangedFont.fontWeight = u"bold";
         else
             aChangedFont.isOutline = true;
     }
diff --git a/sdext/source/pdfimport/tree/writertreevisiting.cxx 
b/sdext/source/pdfimport/tree/writertreevisiting.cxx
index 0ac805acd6ab..6a841e7bc57d 100644
--- a/sdext/source/pdfimport/tree/writertreevisiting.cxx
+++ b/sdext/source/pdfimport/tree/writertreevisiting.cxx
@@ -463,8 +463,17 @@ void WriterXmlOptimizer::visit( ParagraphElement& elem, 
const std::list< std::un
                         {
                             const FontAttributes& rPrevFont = 
m_rProcessor.getFont( pPrevText->FontId );
                             const FontAttributes& rThisFont = 
m_rProcessor.getFont( pThisText->FontId );
-                            if( rPrevFont.isBold && ! rThisFont.isBold )
+                            if ( (rPrevFont.fontWeight ==  u"600" ||
+                                  rPrevFont.fontWeight ==  u"bold" ||
+                                  rPrevFont.fontWeight ==  u"800" ||
+                                  rPrevFont.fontWeight ==  u"900" )  &&
+                                 (rThisFont.fontWeight ==  u"600" ||
+                                  rThisFont.fontWeight ==  u"bold" ||
+                                  rThisFont.fontWeight ==  u"800" ||
+                                  rThisFont.fontWeight ==  u"900" ) )
+                            {
                                 pPrevPara->Type = ParagraphElement::Headline;
+                            }
                         }
                     }
                 }
@@ -906,12 +915,9 @@ void WriterXmlFinalizer::visit( TextElement& elem, const 
std::list< std::unique_
     aFontProps[ "style:font-family-complex" ] = rFont.familyName;
 
     // bold
-    if( rFont.isBold )
-    {
-        aFontProps[ "fo:font-weight" ]            = "bold";
-        aFontProps[ "style:font-weight-asian" ]   = "bold";
-        aFontProps[ "style:font-weight-complex" ] = "bold";
-    }
+    aFontProps[ "fo:font-weight" ]            = rFont.fontWeight;
+    aFontProps[ "style:font-weight-asian" ]   = rFont.fontWeight;
+    aFontProps[ "style:font-weight-complex" ] = rFont.fontWeight;
 
     // italic
     if( rFont.isItalic )
diff --git a/sdext/source/pdfimport/wrapper/wrapper.cxx 
b/sdext/source/pdfimport/wrapper/wrapper.cxx
index 2efdab6f8553..4de5a8516297 100644
--- a/sdext/source/pdfimport/wrapper/wrapper.cxx
+++ b/sdext/source/pdfimport/wrapper/wrapper.cxx
@@ -49,6 +49,7 @@
 #include <com/sun/star/geometry/RealRectangle2D.hpp>
 #include <com/sun/star/geometry/RealSize2D.hpp>
 #include <com/sun/star/task/XInteractionHandler.hpp>
+#include <com/sun/star/awt/FontWeight.hpp>
 #include <tools/diagnose_ex.h>
 
 #include <basegfx/point/b2dpoint.hxx>
@@ -483,18 +484,28 @@ e.g., TimesNewRoman -> Times New Roman
 */
 void LineParser::parseFontFamilyName( FontAttributes& rResult )
 {
-    SAL_INFO("sdext.pdfimport", "Processing " << rResult.familyName << " ---");
+    SAL_WARN("sdext.pdfimport", "Processing " << rResult.familyName << " ---");
     rResult.familyName = rResult.familyName.trim();
     for (const OUString& fontAttributesSuffix: fontAttributesSuffixes)
     {
         if ( rResult.familyName.endsWith(fontAttributesSuffix) )
         {
             rResult.familyName = 
rResult.familyName.replaceAll(fontAttributesSuffix, "");
-            SAL_INFO("sdext.pdfimport", rResult.familyName);
-            if (fontAttributesSuffix == "Bold")
+            SAL_WARN("sdext.pdfimport", rResult.familyName);
+            if (fontAttributesSuffix == u"Bold")
             {
-                rResult.isBold = true;
-            } else if ( (fontAttributesSuffix == "Italic") or 
(fontAttributesSuffix == "Oblique") )
+                rResult.fontWeight = u"bold";
+            }
+            else if (fontAttributesSuffix == u"Semibold")
+            {
+                rResult.fontWeight = u"600";
+            }
+            else if (fontAttributesSuffix == u"Light")
+            {
+                rResult.fontWeight = u"300";
+            }
+
+            if ( (fontAttributesSuffix == "Italic") or (fontAttributesSuffix 
== "Oblique") )
             {
                 rResult.isItalic = true;
             }
@@ -506,20 +517,23 @@ void LineParser::readFont()
 {
     /*
     xpdf line is like (separated by space):
-    updateFont <FontID> <isEmbedded> <isBold> <isItalic> <isUnderline> 
<TransformedFontSize> <nEmbedSize> <FontName>
-    updateFont 14       1            0        0          0             
1200.000000           23068        TimesNewRomanPSMT
+    updateFont <FontID> <isEmbedded> <maFontWeight> <isItalic> <isUnderline> 
<TransformedFontSize> <nEmbedSize> <FontName>
+    updateFont 14       1            4              0          0             
1200.000000           23068        TimesNewRomanPSMT
 
     If nEmbedSize > 0, then a fontFile is followed as a stream.
     */
-
-    OString        aFontName;
     sal_Int64      nFontID;
-    sal_Int32      nIsEmbedded, nIsBold, nIsItalic, nIsUnderline, nFileLen;
+    sal_Int32      nIsEmbedded;
+    sal_Int32      nFontWeight;
+    sal_Int32      nIsItalic;
+    sal_Int32      nIsUnderline;
     double         nSize;
+    sal_Int32      nFileLen;
+    OString        aFontName;
 
     readInt64(nFontID);     // read FontID
     readInt32(nIsEmbedded); // read isEmbedded
-    readInt32(nIsBold);     // read isBold
+    readInt32(nFontWeight); // read maFontWeight, see GfxFont enum Weight
     readInt32(nIsItalic);   // read isItalic
     readInt32(nIsUnderline);// read isUnderline
     readDouble(nSize);      // read TransformedFontSize
@@ -545,15 +559,36 @@ void LineParser::readFont()
         return;
     }
 
-    // yet unknown font - get info and add to map
+    // The font is not yet in the map list - get info and add to map
+    OUString sFontWeight; // font weight name per ODF specifications
+    if (nFontWeight == 0 or nFontWeight == 4)  // WeightNotDefined or W400, 
map to normal font
+        sFontWeight = u"normal";
+    else if (nFontWeight == 1)                 // W100, Thin
+        sFontWeight = u"100";
+    else if (nFontWeight == 2)                 // W200, Extra-Light
+        sFontWeight = u"200";
+    else if (nFontWeight == 3)                 // W300, Light
+        sFontWeight = u"300";
+    else if (nFontWeight == 5)                 // W500, Medium. Is this 
supported by ODF?
+        sFontWeight = u"500";
+    else if (nFontWeight == 6)                 // W600, Semi-Bold
+        sFontWeight = u"600";
+    else if (nFontWeight == 7)                 // W700, Bold
+        sFontWeight = u"bold";
+    else if (nFontWeight == 8)                 // W800, Extra-Bold
+        sFontWeight = u"800";
+    else if (nFontWeight == 9)                 // W900, Black
+        sFontWeight = u"900";
+    SAL_WARN("sdext.pdfimport", "Font weight passed from xpdfimport is: " << 
sFontWeight);
+
     FontAttributes aResult( OStringToOUString( aFontName, 
RTL_TEXTENCODING_UTF8 ),
-                            nIsBold != 0,
+                            sFontWeight,
                             nIsItalic != 0,
                             nIsUnderline != 0,
                             nSize,
                             1.0);
 
-    /* The above font attributes (fontName, bold, italic) are based on
+    /* The above font attributes (fontName, fontWeight, italic) are based on
        xpdf line output and may not be reliable. To get correct attributes,
        we do the following:
     1. Read the embedded font file and determine the attributes based on the
@@ -583,7 +618,9 @@ void LineParser::readFont()
                 aFontReadResult >>= aFontDescriptor;
                 if (!aFontDescriptor.Name.isEmpty())
                 {
+                    // Family name
                     aResult.familyName = aFontDescriptor.Name;
+                    SAL_INFO("sdext.pdfimport", aResult.familyName);
                     // tdf#143959: there are cases when the family name 
returned by font descriptor
                     // is like "AAAAAA+TimesNewRoman,Bold". In this case, use 
the font name
                     // determined by parseFontFamilyName instead, but still 
determine the font
@@ -593,7 +630,28 @@ void LineParser::readFont()
                         aResult.familyName = aResult.familyName.copy(7, 
aResult.familyName.getLength() - 7);
                         parseFontFamilyName(aResult);
                     }
-                    aResult.isBold = (aFontDescriptor.Weight > 100.0);
+
+                    // Font weight
+                    if (aFontDescriptor.Weight == 
com::sun::star::awt::FontWeight::THIN)
+                        aResult.fontWeight = u"100";
+                    else if (aFontDescriptor.Weight == 
com::sun::star::awt::FontWeight::ULTRALIGHT)
+                        aResult.fontWeight = u"200";
+                    else if (aFontDescriptor.Weight == 
com::sun::star::awt::FontWeight::LIGHT)
+                        aResult.fontWeight = u"300";
+                    else if (aFontDescriptor.Weight == 
com::sun::star::awt::FontWeight::SEMILIGHT)
+                        aResult.fontWeight = u"350";
+                    // no need to check "normal" here as this is default in 
nFontWeight above
+                    else if (aFontDescriptor.Weight == 
com::sun::star::awt::FontWeight::SEMIBOLD)
+                        aResult.fontWeight = u"600";
+                    else if (aFontDescriptor.Weight == 
com::sun::star::awt::FontWeight::BOLD)
+                        aResult.fontWeight = u"bold";
+                    else if (aFontDescriptor.Weight == 
com::sun::star::awt::FontWeight::ULTRABOLD)
+                        aResult.fontWeight = u"800";
+                    else if (aFontDescriptor.Weight == 
com::sun::star::awt::FontWeight::BLACK)
+                        aResult.fontWeight = u"900";
+                    SAL_INFO("sdext.pdfimport", aResult.fontWeight);
+
+                    // Italic
                     aResult.isItalic = (aFontDescriptor.Slant == 
awt::FontSlant_OBLIQUE ||
                                         aFontDescriptor.Slant == 
awt::FontSlant_ITALIC);
                 } else
diff --git a/sdext/source/pdfimport/xpdfwrapper/pdfioutdev_gpl.cxx 
b/sdext/source/pdfimport/xpdfwrapper/pdfioutdev_gpl.cxx
index 5d6ce90bc44c..02b6fe6a1b9e 100644
--- a/sdext/source/pdfimport/xpdfwrapper/pdfioutdev_gpl.cxx
+++ b/sdext/source/pdfimport/xpdfwrapper/pdfioutdev_gpl.cxx
@@ -461,7 +461,7 @@ int PDFOutDev::parseFont( long long nNewId, GfxFont* 
gfxFont, const GfxState* st
         aNewFont.familyName.append( "Arial" );
     }
 
-    aNewFont.isBold        = gfxFont->isBold();
+    aNewFont.maFontWeight  = gfxFont->getWeight();
     aNewFont.isItalic      = gfxFont->isItalic();
 #if POPPLER_CHECK_VERSION(0, 83, 0) // const added to getTransformedFontSize
     aNewFont.size          = state->getTransformedFontSize();
@@ -795,7 +795,7 @@ void PDFOutDev::updateFont(GfxState *state)
 #endif
         printf( " %d %d %d %d %f %d %s",
                 aFont.isEmbedded,
-                aFont.isBold,
+                aFont.maFontWeight,
                 aFont.isItalic,
                 aFont.isUnderline,
                 normalize(state->getTransformedFontSize()),
diff --git a/sdext/source/pdfimport/xpdfwrapper/pdfioutdev_gpl.hxx 
b/sdext/source/pdfimport/xpdfwrapper/pdfioutdev_gpl.hxx
index 41e4752dde61..f087915d97b9 100644
--- a/sdext/source/pdfimport/xpdfwrapper/pdfioutdev_gpl.hxx
+++ b/sdext/source/pdfimport/xpdfwrapper/pdfioutdev_gpl.hxx
@@ -75,7 +75,7 @@ namespace pdfi
         FontAttributes() :
             familyName(),
             isEmbedded(false),
-            isBold(false),
+            maFontWeight(GfxFont::W400),
             isItalic(false),
             isUnderline(false),
             size(0.0)
@@ -86,7 +86,7 @@ namespace pdfi
         FontAttributes( const FontAttributes& rSrc ) :
             familyName(),
             isEmbedded(rSrc.isEmbedded),
-            isBold(rSrc.isBold),
+            maFontWeight(rSrc.maFontWeight),
             isItalic(rSrc.isItalic),
             isUnderline(rSrc.isUnderline),
             size(rSrc.size)
@@ -100,7 +100,7 @@ namespace pdfi
             familyName.append(&rSrc.getFamilyName());
 
             isEmbedded  = rSrc.isEmbedded;
-            isBold      = rSrc.isBold;
+            maFontWeight= rSrc.maFontWeight;
             isItalic    = rSrc.isItalic;
             isUnderline = rSrc.isUnderline;
             size        = rSrc.size;
@@ -112,15 +112,15 @@ namespace pdfi
         {
             return getFamilyName().cmp(&rFont.getFamilyName())==0 &&
                 isEmbedded == rFont.isEmbedded &&
-                isBold == rFont.isBold &&
+                maFontWeight == rFont.maFontWeight &&
                 isItalic == rFont.isItalic &&
                 isUnderline == rFont.isUnderline &&
                 size == rFont.size;
         }
 
-        GooString     familyName;
+        GooString   familyName;
         bool        isEmbedded;
-        bool        isBold;
+        GfxFont::Weight maFontWeight;
         bool        isItalic;
         bool        isUnderline;
         double      size;

Reply via email to