English 中文(简体)
如何在C#使用iTextSharp的pdf档案中找到具体段落?
原标题:how to get the particular paragraph in pdf file using iTextSharp in C#?

我在C#获胜form申请中使用iTextSharp。 我想在人民抵抗力量的档案中找到一个段落。 这在ITextSharp是否可行?

最佳回答

是的,不是。

第一段。 PDF格式没有文字结构的概念,如段落、判决甚至字句,它只是行文。 两种案文几乎相互接近,以便我们认为其结构是人为的。 当你看到国防军中三个字段时,实际上,产生国防军的方案实际上把案文分为三个不相关的文字线,然后将每一条线打到具体的Xy坐标。 更糟糕的是,视设计者所欲为,每一行案文可能由较小的行文组成,这些行文可以是说话,甚至是公正的。 因此,可在10、10、10、10、10、10、14、10、8、18、10、18、10、18、10、0、0、10、0、0、0、0、0、0、0、0、0、0、1、3、4、5、4、5、5、5、5、5、5、6、5、5、5、6、7、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5 这实际上与Adobe InDesign等精心设计的方案的国防军相当常见。

现在是。 其实,它可能是大的。 如果你愿意做些什么工作,你就能够做你所期待的工作。 有一个称为<代码>PdfTexttractor的类别,其方法称为GetTextFromPage,所有原始文本都将从一个网页上获取。 这种方法的最后参数是实施<代码>技术推广战略>接口的物体。 如果你创建自己的班子来实施这一接口,你就可以处理每一行文,并履行自己的逻辑。

在这一接口中,采用了一种称为<代码>RenderText的方法,每个版本都需要使用。 页: 1 您从中获取原始案文的物体,以及像目前座标开始的原体、现线等其它东西。 由于案文的直观线可以由多管构成,因此,你可以采用这种方法将运行的基线(起点×协调)与以往的操作进行比较,以确定其是否属于同一视线。

以下是实施这一接口的一个实例:

    public class TextAsParagraphsExtractionStrategy : iTextSharp.text.pdf.parser.ITextExtractionStrategy {
        //Text buffer
        private StringBuilder result = new StringBuilder();

        //Store last used properties
        private Vector lastBaseLine;

        //Buffer of lines of text and their Y coordinates. NOTE, these should be exposed as properties instead of fields but are left as is for simplicity s sake
        public List<string> strings = new List<String>();
        public List<float> baselines = new List<float>();

        //This is called whenever a run of text is encountered
        public void RenderText(iTextSharp.text.pdf.parser.TextRenderInfo renderInfo) {
            //This code assumes that if the baseline changes then we re on a newline
            Vector curBaseline = renderInfo.GetBaseline().GetStartPoint();

            //See if the baseline has changed
            if ((this.lastBaseLine != null) && (curBaseline[Vector.I2] != lastBaseLine[Vector.I2])) {
                //See if we have text and not just whitespace
                if ((!String.IsNullOrWhiteSpace(this.result.ToString()))) {
                    //Mark the previous line as done by adding it to our buffers
                    this.baselines.Add(this.lastBaseLine[Vector.I2]);
                    this.strings.Add(this.result.ToString());
                }
                //Reset our "line" buffer
                this.result.Clear();
            }

            //Append the current text to our line buffer
            this.result.Append(renderInfo.GetText());

            //Reset the last used line
            this.lastBaseLine = curBaseline;
        }

        public string GetResultantText() {
            //One last time, see if there s anything left in the buffer
            if ((!String.IsNullOrWhiteSpace(this.result.ToString()))) {
                this.baselines.Add(this.lastBaseLine[Vector.I2]);
                this.strings.Add(this.result.ToString());
            }
            //We re not going to use this method to return a string, instead after callers should inspect this class s strings and baselines fields.
            return null;
        }

        //Not needed, part of interface contract
        public void BeginTextBlock() { }
        public void EndTextBlock() { }
        public void RenderImage(ImageRenderInfo renderInfo) { }
    }

我们:

        PdfReader reader = new PdfReader(workingFile);
        TextAsParagraphsExtractionStrategy S = new TextAsParagraphsExtractionStrategy();
        iTextSharp.text.pdf.parser.PdfTextExtractor.GetTextFromPage(reader, 1, S);
        for (int i = 0; i < S.strings.Count; i++) {
            Console.WriteLine("Line {0,-5}: {1}", S.baselines[i], S.strings[i]);
        }

我们实际上从<代码>GetTextFromPage中删除了价值,而是对工人的<代码>底线<>/代码>和<编码>进行了检测。 下一步是比较基线,并设法确定如何将线段合并成段落。

我应该指出,并非所有段落的间隔都不同于个别案文。 例如,如果你通过上述法典管理以下的PDF,那么你就会发现,每一行的案文都彼此相距18点,不论该行文是否构成新的段落。 如果你们打开人民抵抗力量,它就在缩略语中产生,并涵盖除每一行的第一封信外的一切,你就会看到,你的眼睛甚至可以说明一条线的中断和一段的中断之间的区别。

        using (FileStream fs = new FileStream(workingFile, FileMode.Create, FileAccess.Write, FileShare.None)) {
            using (Document doc = new Document(PageSize.LETTER)) {
                using (PdfWriter writer = PdfWriter.GetInstance(doc, fs)) {
                    doc.Open();
                    doc.Add(new Paragraph("Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas porttitor congue massa. Fusce posuere, magna sed pulvinar ultricies, purus lectus malesuada libero, sit amet commodo magna eros quis urna."));
                    doc.Add(new Paragraph("This"));
                    doc.Add(new Paragraph("Is"));
                    doc.Add(new Paragraph("A"));
                    doc.Add(new Paragraph("Test"));
                    doc.Close();
                }
            }
        }
问题回答

暂无回答




相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...

热门标签