Itext 7 bug with GetCtm() on pages>1
Itext 7 bug with GetCtm() on pages>1
上下文:
- 从 pdf 中提取文本
- 使用 IEventListener - TextRenderInfo
- 一页以上的pdf文档
- c#.net核心程序
问题:
要计算文本的确切 X、Y 位置,我使用以下代码:
var textMatrix =textRenderInfo.GetTextMatrix().Multiply(textRenderInfo.GetGraphicsState().GetCtm());
float X = textMatrix.Get(6);
float Y = textMatrix.Get(7);
这在第一页上工作正常。对于后续页面,CTM 似乎计算为:Power(ctm, pagenumber) 并且 X、Y 结果显然不正确。
更多说明:我有一份文档,在同一位置的每一页上都有重复的日期。因此,它的文本矩阵在每一页上都是相同的。但是第 1 页的 CTM 看起来像这样:
{0,05 0 0
0 0,05 0
0 0 1}
第 2 页:
{0,0025000002 0 0
0 0,0025000002 0
0 0 1}
第 3 页:
{0,000125 0 0
0 0,000125 0
0 0 1}
等等...
所以看起来每个值都由页码提供支持。这可能是一个错误吗?
Could this be a bug?
更有可能是 API 用法不正确...
很遗憾,您没有显示您的关键代码。不过,我假设您对所有页面重复使用相同的 PdfCanvasProcessor
。您是否考虑过 ProcessPageContent
文档中的注释?
/// <summary>Processes PDF syntax.</summary>
/// <remarks>
/// Processes PDF syntax.
/// <strong>Note:</strong> If you re-use a given
/// <see cref="PdfCanvasProcessor"/>
/// , you must call
/// <see cref="Reset()"/>
/// </remarks>
/// <param name="page">the page to process</param>
public virtual void ProcessPageContent(PdfPage page)
即
Note: If you re-use a given PdfCanvasProcessor
, you must call Reset()
[between ProcessPageContent
calls]
上下文:
- 从 pdf 中提取文本
- 使用 IEventListener - TextRenderInfo
- 一页以上的pdf文档
- c#.net核心程序
问题: 要计算文本的确切 X、Y 位置,我使用以下代码:
var textMatrix =textRenderInfo.GetTextMatrix().Multiply(textRenderInfo.GetGraphicsState().GetCtm());
float X = textMatrix.Get(6);
float Y = textMatrix.Get(7);
这在第一页上工作正常。对于后续页面,CTM 似乎计算为:Power(ctm, pagenumber) 并且 X、Y 结果显然不正确。
更多说明:我有一份文档,在同一位置的每一页上都有重复的日期。因此,它的文本矩阵在每一页上都是相同的。但是第 1 页的 CTM 看起来像这样:
{0,05 0 0
0 0,05 0
0 0 1}
第 2 页:
{0,0025000002 0 0
0 0,0025000002 0
0 0 1}
第 3 页:
{0,000125 0 0
0 0,000125 0
0 0 1}
等等... 所以看起来每个值都由页码提供支持。这可能是一个错误吗?
Could this be a bug?
更有可能是 API 用法不正确...
很遗憾,您没有显示您的关键代码。不过,我假设您对所有页面重复使用相同的 PdfCanvasProcessor
。您是否考虑过 ProcessPageContent
文档中的注释?
/// <summary>Processes PDF syntax.</summary>
/// <remarks>
/// Processes PDF syntax.
/// <strong>Note:</strong> If you re-use a given
/// <see cref="PdfCanvasProcessor"/>
/// , you must call
/// <see cref="Reset()"/>
/// </remarks>
/// <param name="page">the page to process</param>
public virtual void ProcessPageContent(PdfPage page)
即
Note: If you re-use a given
PdfCanvasProcessor
, you must callReset()
[betweenProcessPageContent
calls]