gpt4 book ai didi

c++ - 使用 PoDoFo 访问/差异数组

转载 作者:搜寻专家 更新时间:2023-10-31 01:49:00 26 4
gpt4 key购买 nike

这个问题是关于PoDoFo的具体问题图书馆。

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

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

来自 PDFSpec(我只担心 Type 1 字体):

Encoding

(Optional) A specification of the font’s character encoding if different from its built-in encoding. The value of Encoding shall be either the name of a predefined encoding (MacRomanEncoding, MacExpertEncoding, or WinAnsiEncoding, as described in Annex D) or an encoding dictionary that shall specify differences from the font’s built-in encoding or from a specified predefined encoding (see 9.6.6, "Character Encoding").

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

(我刚才在 PoDoFo 邮件列表上询问过,但在这里发帖是为了看看是否有了解 PoDoFo 和 pdf 的人可以提供帮助)。

最佳答案

PoDoFo 知道许多不同种类的编码类,参见。编码对象工厂:

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 的一个实例,您可以使用:

/** 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 在同一个头类中声明并提供了一些有趣的方法:

/** 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)

关于c++ - 使用 PoDoFo 访问/差异数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17098356/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com