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

如何使用ITextSharp读取线宽注释的外观?

田鸿彩
2023-03-14
//main function for setting inner content to appearance value
public void changeAnnotationContentToAppearance(PdfDictionary dict)
        {

                string surface = pdfTextParser.retrieveText(dict);
                if (surface != null)
                {
                   //update CONTENTS with appearance
                   //for changing line width, I would instead modify the /BS dictionary's /W key value, i think
                   dict.Put(PdfName.CONTENTS, new PdfString(surface));
                }
        }

//get text from /AP dictionary
public string retrieveText(PdfDictionary annotDictionary)
    {

        PdfDictionary appearancesDictionary = annotDictionary.GetAsDict(PdfName.AP);
        foreach (PdfName key in appearancesDictionary.Keys)
        {
            PdfStream value = appearancesDictionary.GetAsStream(key);
            if (value != null)
            {
                String text = ExtractAnnotationText(value);
                return text;
            }
        }
        return null;

    }

//read the appearance stream and extract text contents
public String ExtractAnnotationText(PdfStream xObject)
{
    PdfDictionary resources = xObject.GetAsDict(PdfName.RESOURCES);
    ITextExtractionStrategy strategy = new LocationTextExtractionStrategy();

    PdfContentStreamProcessor processor = new PdfContentStreamProcessor(strategy);
    processor.ProcessContent(ContentByteUtils.GetContentBytesFromContentObject(xObject), resources);
    return strategy.GetResultantText();
}

如果我读对了,这个问题,这个问题,这个问题表明我需要实现一个类,但我不确定我应该用哪个子类来获取行数据,或者我应该如何去做。

编辑:我还想获得定义文本框中矩形的点的外观数据。尽管这可能是一个不同的问题,但它似乎与这个问题密切相关:检索定义注释外观流的非文本图形数据。

共有1个答案

纪辰沛
2023-03-14

您需要PathRenderInfo对象来获取有关线条和形状的信息。在iText7中引入了PathRenderInfo对象。这是我很快写的概念证明:

public static void main(String args[]) throws IOException {
    PdfDocument document = new PdfDocument(new PdfReader(SRC));
    PdfPage page = document.getPage(1);
    PdfCanvasProcessor processor = new PdfCanvasProcessor(new IEventListener() {
        public void eventOccurred(IEventData data, EventType type) {
            if (type == EventType.RENDER_PATH) {
                PathRenderInfo renderinfo = (PathRenderInfo) data;
                int i = renderinfo.getOperation();
                switch (i) {
                    case 1:
                        System.out.print("Stroke: ");
                        break;
                    case 2:
                        System.out.print("Fill: ");
                        break;
                    default:
                        System.out.print("No: ");
                }
                for (Subpath p : renderinfo.getPath().getSubpaths()) {
                    for (IShape shape : p.getSegments()) {
                        for (Point point : shape.getBasePoints()) {
                            System.out.println(String.format("x = %s; y = %s", point.getX(), point.getY()));
                        }
                    }
                }
            }
        }
        public Set<EventType> getSupportedEvents() {
            return null;
        }
    });
    processor.processPageContent(page);
}

我在一个有很多行的PDF上运行它,这是输出的一部分:

Stroke: x = -406.0; y = -240.0
x = 406.0; y = -240.0
x = -406.0; y = -200.0
x = 406.0; y = -200.0
x = -406.0; y = -160.0
x = 406.0; y = -160.0
x = -406.0; y = -120.0
x = 406.0; y = -120.0
x = -406.0; y = -80.0
x = 406.0; y = -80.0
x = -406.0; y = -40.0
x = 406.0; y = -40.0
x = -406.0; y = 0.0
x = 406.0; y = 0.0
x = -406.0; y = 40.0
x = 406.0; y = 40.0
x = -406.0; y = 80.0

您必须升级到iText7才能完成这项工作,还必须了解PathRenderInfoSubpathISHAPE对象中包含哪些信息。

外观是由查看器根据以下值创建的:

  • /c:颜色:红色=0,绿色=0,蓝色=1(因此行是蓝色)
  • /le:行尾(在本例中为菱形)
  • L:(x=20,y=790)和(x=575,y=790)
  • 之间的线
  • ...

如果在注释字典中手头有所有必要的信息,为什么还要解析外观?

 类似资料:
  • //获取和设置 以下是我给用户的POJO:

  • 嗨,我想使用comment将属性和函数分开。 如何在代码中注释像绿线一样实现?

  • 问题内容: 如何在React组件的方法内部使用注释? 我有以下组成部分: 我的评论显示在用户界面中。 在组件的渲染方法中应用单行和多行注释的正确方法是什么? 问题答案: 因此,在方法内允许使用注释,但为了在JSX中使用它们,必须将它们用大括号括起来并使用多行样式的注释。 您可以在此处阅读有关注释如何在JSX中工作的更多信息

  • 我正在尝试使用Hibernate注释为我的数据库表编写一个模型类。 我有两个表,每个表都有一个主键用户和问题。 问题桌。 并且我还有一个表UserAnswer,它有userId和questionId作为来自上面两个表的外键。 但我无法找到如何在UserAnswer表中引用这些约束。 我怎样才能做到这一点呢?

  • 问题内容: 在Python中,我刚刚阅读了一个文本文件中的一行,并且我想知道如何编写代码以忽略该行开头带有#的注释。 我认为应该是这样的: 但是我是Python的新手,我不知道语法 问题答案: 您可以使用startswith() 例如

  • 是否可以使用反射读取注释元素的值?我想使用元素名称的字符串来访问元素的值。这可能吗? 注释: 示例用法: 我目前使用开关提取元素的值: 我想做这样的事情: 我尝试了: 我得到了一个NoSuchFieldException: 我试过这些,看看能不能买到什么: 但是当我遍历并执行System.out.println()时,看起来唯一有用的是getDeclaredMethod()的输出: