首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用/Differences访问PoDoFo数组

用/Differences访问PoDoFo数组
EN

Stack Overflow用户
提问于 2013-06-13 22:36:50
回答 2查看 559关注 0票数 2

这个问题是关于PoDoFo库的一个特定问题。

如何访问字体资源的编码字典中的/Differences数组条目?

Tf操作符读取字体名称之后,我可以通过PoDoFo::PdfPage::GetFromResources获取字体。但是,虽然PdfFont类有PoDoFo::PdfFont::GetEncoding,但我不知道如何从那里到达/Differences数组。

来自PDFSpec (我只担心类型1的字体):

编码 (可选)字体字符编码的规范(如果与其内置编码不同)。编码的值应为预定义编码的名称(如附件D所述的MacRomanEncoding、MacExpertEncoding或WinAnsiEncoding ),或应指定与字体内置编码或指定预定义编码(见9.6.6,“字符编码”)不同之处的编码字典。

这是否意味着从PdfEncoding返回的PoDoFo::PdfFont::GetEncoding对象包含差异数组(如果有)?

(不久前,我在PoDoFo邮件列表上询问过,但在这里发帖是为了看看某个熟悉PoDoFo和pdfs的人是否能提供帮助)。

EN

回答 2

Stack Overflow用户

发布于 2013-06-14 09:34:42

PoDoFo知道许多不同类型的编码类,cf。编码对象工厂:

代码语言:javascript
复制
if (pObject->IsName ())
{
    const PdfName & rName = pObject->GetName ();
    if (rName == PdfName ("WinAnsiEncoding"))
        return PdfEncodingFactory::GlobalWinAnsiEncodingInstance ();
    else if (rName == PdfName ("MacRomanEncoding"))
        return PdfEncodingFactory::GlobalMacRomanEncodingInstance ();
    else if (rName == PdfName ("StandardEncoding"))      // OC 13.08.2010
        return PdfEncodingFactory::GlobalStandardEncodingInstance ();
    else if (rName == PdfName ("MacExpertEncoding"))     // OC 13.08.2010 TODO solved
        return PdfEncodingFactory::GlobalMacExpertEncodingInstance ();
    else if (rName == PdfName ("SymbolEncoding"))        // OC 13.08.2010
        return PdfEncodingFactory::GlobalSymbolEncodingInstance ();
    else if (rName == PdfName ("ZapfDingbatsEncoding"))  // OC 13.08.2010
        return PdfEncodingFactory::GlobalZapfDingbatsEncodingInstance ();
    else if (rName == PdfName ("Identity-H"))
        return new PdfIdentityEncoding ();
}
else if (pObject->HasStream ())     // Code for /ToUnicode object 
{
    return new PdfCMapEncoding(pObject);
}
else if (pObject->IsDictionary ())
{
    return new PdfDifferenceEncoding (pObject);
}

(PoDoFo/src/doc/PdfEncodingObjectFactory.cpp)

你对最后一个案子感兴趣。因此,如果手头上的编码对象是PdfDifferenceEncoding的实例,则可以使用:

代码语言:javascript
复制
/** PdfDifferenceEncoding is an encoding, which is based
 *  on either the fonts encoding or a predefined encoding
 *  and defines differences to this base encoding.
 */
class PODOFO_DOC_API PdfDifferenceEncoding : public PdfEncoding, private PdfElement {
 public:
[...]
    /** 
     * Get read-only access to the object containing the actual
     * differences.
     *
     * \returns the container with the actual differences
     */
    inline const PdfEncodingDifference & GetDifferences() const;
[...]
};

(PoDoFo/src/doc/PdfDifferenceEncoding.h)

PdfDifferenceEncoding在同一个头类中声明,并提供了一些有趣的方法:

代码语言:javascript
复制
/** A helper class for PdfDifferenceEncoding that
 *  can be used to create a differences array.
 */
class PODOFO_DOC_API PdfEncodingDifference {
    struct TDifference {
        int         nCode;
        PdfName     name;
        pdf_utf16be unicodeValue;
    };

    typedef std::vector<TDifference>                 TVecDifferences;
    typedef std::vector<TDifference>::iterator       TIVecDifferences;
    typedef std::vector<TDifference>::const_iterator TCIVecDifferences;

 public: 
    /** Create a PdfEncodingDifference object.
     */
    PdfEncodingDifference();

    /** Copy a PdfEncodingDifference object.
     */
    PdfEncodingDifference( const PdfEncodingDifference & rhs );

    /** Copy a PdfEncodingDifference object.
     */
    const PdfEncodingDifference & operator=( const PdfEncodingDifference & rhs );

    /** Add a difference to the object.
     * 
     *  \param nCode unicode code point of the difference (0 to 255 are legal values)
     *
     *  \see AddDifference if you know the name of the code point
     *       use the overload below which is faster
     */
    void AddDifference( int nCode );

    /** Add a difference to the object.
     * 
     *  \param nCode unicode code point of the difference (0 to 255 are legal values)
     *  \param rName name of the different code point or .notdef if none
     */
    void AddDifference( int nCode, const PdfName & rName );

    /** Tests if the specified code is part of the 
     *  differences.
     *
     *  \param nCode test if the given code is part of the differences
     *  \param rName write the associated name into this object if the 
     *               code is part of the difference
     *  \param rValue write the associated unicode value of the name to this value 
     *
     *  \returns true if the code is part of the difference
     */
    bool Contains( int nCode, PdfName & rName, pdf_utf16be & rValue ) const;

    /** Convert the PdfEncodingDifference to an array
     *
     *  \param rArray write to this array
     */
    void ToArray( PdfArray & rArray );

    /** Get the number of differences in this object.
     *  If the user added .notdef as a difference it is 
     *  counted, even it is no real difference in the final encoding.
     *  
     *  \returns the number of differences in this object
     */
    inline size_t GetCount() const;

 private:
    struct DifferenceComparatorPredicate {
        public:
          inline bool operator()( const TDifference & rDif1, 
                                  const TDifference & rDif2 ) const { 
              return rDif1.nCode < rDif2.nCode;
          }
    };

    TVecDifferences m_vecDifferences;
};

(PoDoFo/src/doc/PdfDifferenceEncoding.h)

票数 2
EN

Stack Overflow用户

发布于 2013-06-15 21:47:05

一旦有了指向PoDoFo::PdfFont的指针,就可以通过调用GetObject来访问底层对象,因为它从PoDoFo::PdfElement继承了它。然后调用GetIndirectKey("Encoding")获取一个指向编码字典的指针,其中包含差异数组,并将其传递给PoDoFo::PdfDifferenceEncoding构造函数。

代码语言:javascript
复制
PoDoFo::PdfObject* fntobj = fnt->GetObject();
if (fntobj)
{
    PoDoFo::PdfObject* fntdic = fntobj->GetIndirectKey("Encoding");
    if (fntdic)
    {
        PoDoFo::PdfDifferenceEncoding diff(fntdic);
        PoDoFo::PdfArray diffarray;
        PoDoFo::PdfEncodingDifference d(diff.GetDifferences());
        d.ToArray(diffarray);
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17098356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档