当前位置: 首页 > 知识库问答 >
问题:

在PDF中搜索带下划线和粗体的文本

隗俊誉
2023-03-14

使用iTextSharp,我如何确定解析的文本块是否同时加粗和下划线?

详细信息:
我正在尝试用C#解析。pdf文件,特别是针对既加粗又加下划线的文本。使用ITextSharp,我可以从LocationTextExtractionStrategy派生,并从传递给overridden.RenderText方法的ITextSharp.text.pdf.parser.TextRenderInfo对象获取文本、位置、字体等。
但是,从TextRenderInfo对象确定文本是否加粗和/下划线并不直接。

  • 我试图使用textRenderInfo.getfont()查找字体属性,但没有成功
  • 通过访问TextRenderInfo对象上的private Graphics State字段并检查它的.font.PostScriptFontName属性中的单词“Bold”(很丑,但似乎有效。),我目前可以确定文本是否为粗体。
  • 最大的问题:我没有找到任何东西来确定文本是否带下划线。如何确定?

以下是我目前的尝试:

        private FieldInfo _gsField = typeof(TextRenderInfo).GetField("gs",
        BindingFlags.GetField | BindingFlags.NonPublic | BindingFlags.Instance);

        //Automatically called for each chunk of text in the PDF
        public override void RenderText(TextRenderInfo renderInfo)
        {
            base.RenderText(renderInfo);
            //UNDONE:Need to determine if text is underlined.  How?

            //NOTE: renderInfo.GetFont().FontWeight does not contain any actual information
            var gs = (GraphicsState)_gsField.GetValue(renderInfo);
            var textChunkInfo = new TextChunkInfo(renderInfo);
            _allLocations.Add(textChunkInfo);
            if (gs.Font.PostscriptFontName.Contains("Bold"))
                //Add this to our found collection
                FoundItems.Add(new TextChunkInfo(renderInfo));

            if (!_lineHeights.Contains(textChunkInfo.LineHeight))
                _lineHeights.Add(textChunkInfo.LineHeight);
        }

GitHub Repository中当前尝试的完整源代码(两个示例(example.pdf和example2.pdf)包含了与我将搜索的文本类似的文本)

共有1个答案

端木澄邈
2023-03-14

>

  • 我试图使用textRenderInfo.getFont()查找字体属性,但没有成功

    我目前可以通过访问TextRenderInfo对象上的private Graphics State字段并检查它的.font.PostScriptFontName属性中的单词“Bold”(很丑,但似乎有效)来确定文本是否为粗体

    我不太明白这种区分。textRenderInfo.getfont()textRenderInfo的私有图形状态字段的font属性完全相同。

    话虽如此,但这确实是决定胆量的主要方法之一。

    在PDFs中粗体书写可以通过以下方式实现:

    >

  • 显式粗体字体(这是更好的方式);在这种情况下,可以通过以下方法来确定字体是否为粗体

    >

  • 不仅填充字形轮廓,而且沿着它画了一条更粗的线,以形成大胆的印象,

    画字形两次,第二次略有移位,也是为了给人一种大胆的印象。

    在PDFs中带下划线的书写通常是通过在文本下显式地画一条线或一个非常细的矩形来实现的。您可以通过实现IExtRenderListener来尝试检测这样的行,用它解析有问题的页面以确定行位置,然后在文本提取过程中与文本位置匹配。两者都可以在一次传递中完成,但请注意,下划线不需要在文本之前绘制,甚至在文本之后不久,pdf制作者可能会首先绘制所有文本,然后才绘制所有下划线。此外,我还遇到了一个有趣的结构,非常短(例如1pt)非常宽(例如50pt)的垂直线实际上被视为水平线...

    /**
     * Called when the current path is being modified. E.g. new segment is being added,
     * new subpath is being started etc.
     *
     * @param renderInfo Contains information about the path segment being added to the current path.
     */
    void ModifyPath(PathConstructionRenderInfo renderInfo); 
    

    定义路径所包含的线条和曲线,然后最多调用一次clippath

    /**
     * Called when the current path should be set as a new clipping path.
     *
     * @param rule Either {@link PathPaintingRenderInfo#EVEN_ODD_RULE} or {@link PathPaintingRenderInfo#NONZERO_WINDING_RULE}
     */
    void ClipPath(int rule);
    

    (当且仅当该路径将作为以下绘制操作的剪辑路径),最后正好调用一个renderpath

    /**
     * Called when the current path should be rendered.
     *
     * @param renderInfo Contains information about the current path which should be rendered.
     * @return The path which can be used as a new clipping path.
     */
    Path RenderPath(PathPaintingRenderInfo renderInfo);
    

    定义如何绘制路径(填充其内部和抚摸路径本身的任何组合)。

  •  类似资料:
    • 每个人我试图通过itext从PDF文件中获取一些带下划线的文本,这对我来说似乎非常困难。我已经搜索了很长时间的解决方案,并学习了如何获取文本的字体系列、字体大小和文本位置。但是,没有下划线。期待您的帮助!非常感谢。

    • 问题内容: 我正在尝试使JLabel带有下划线。我到处搜寻,但一无所获。即使在属性中,也没有为JLabel下划线的选项。我能做什么? 问题答案: 要么

    • 在编辑文本中,用户应选择他们键入的内容是粗体、斜体还是正常。在我的情况下,当用户选择粗体时,整个编辑文本将更改为粗体,如果他再次选择斜体,则整个编辑文本将变为斜体。当用户选择粗体键入某些内容时,它应该是粗体的,当他选择斜体或正常时,他键入的单词应该是斜体或正常,而不是前一个粗体。此外,当我在编辑文本中打印输入时,即使以粗体显示,它也被正常打印。 我在底部有我的代码。 这是我将编辑文本设置为粗体或斜

    • 问题 我试图通过搜索文本来确定文档是什么类型(例如恳求、通信、传票等),最好使用python。所有的PDF都是可搜索的,但是我还没有找到用python解析它并应用脚本搜索它的解决方案(除了先将它转换为文本文件,但是对于n个文档来说,这可能是资源密集型的)。 到目前为止,我所做的 我已经研究了pypdf、pdfminer、adobe pdf文档,以及我能在这里找到的任何问题(尽管似乎没有一个能直接解

    • >>> class MyClass(): ... def __init__(self): ... self.__superprivate = "Hello" ... self._semiprivate = ", world!" ... >>> mc = MyClass() >>> print mc.__superprivate Traceback (most recen

    • 我一直在玩PdfBox和PDFTextStripperByArea方法。 如果文本是粗体或斜体字,我能够提取信息,但我无法获得下划线信息。 据我所知,在PDF中,下划线是通过画线来完成的。所以理论上,我应该能够在文本周围的某个地方获得一些关于线条的信息。给出这些信息,我就可以找出文本是加了下划线还是在表格中。 以下是我目前的代码: 我试着绕过PDFStreamEngine类中的processEnc