I am using PdfBox's .net to parse to extract text from a pdf alongwith text location.For that, while searching I found the following java code:

PDFTextStripper stripper = new PDFTextStripper()
{
    @Override
    protected void writeString(String text, List<TextPosition> textPositions) throws IOException
    {
        super.writeString(text, textPositions);

        TextPosition firstProsition = textPositions.get(0);
        TextPosition lastPosition = textPositions.get(textPositions.size() - 1);
        writeString(String.format("[%s - %s / %s]", firstProsition.getXDirAdj(), lastPosition.getXDirAdj() + lastPosition.getWidthDirAdj(), firstProsition.getYDirAdj()));
    }
};
stripper.setSortByPosition(true);
return stripper.getText(document);

I converted it to .net in the following way:

class PDFTextLocationStripper : PDFTextStripper
{
    public string textWithPostion = "";
    protected override void processTextPosition(TextPosition text)
    {
            textWithPostion += "String[" + text.getXDirAdj() + "," +
            text.getYDirAdj() + " fs=" + text.getFontSize() + " xscale=" +
            text.getXScale() + " height=" + text.getHeightDir() + " space=" +
            text.getWidthOfSpace() + " width=" +
            text.getWidthDirAdj() + "]" + text.getCharacter();
    }

    protected override void writeString(java.lang.String text, java.util.List textPositions) 
    {
            base.writeString(text, textPositions);
            TextPosition firstProsition = (TextPosition)textPositions.get(0);
            TextPosition lastPosition =(TextPosition) textPositions.get(textPositions.size() - 1);
            writeString(String.Format("[%s - %s / %s]", firstProsition.getXDirAdj(), lastPosition.getXDirAdj() + lastPosition.getWidthDirAdj(), firstProsition.getYDirAdj()));
    }

}

But, I get compilation error for the above code that :

Error 1 No overload for method 'writeString' takes 2 arguments

Error 2 'PDFTextLocationStripper.writeString(java.lang.String, java.util.List)': no suitable method found to override

So ,how do I override writeString method so that I can extract text along with location?

1

There are 1 answers

0
V K On BEST ANSWER

Since, I wasn't able to overload the writeString method.I used the processTextPosition to extract words from a pdf along with their positions.Here is the code:

class PDFTextLocationStripper : PDFTextStripper
    {
        public string textWithPostion = "";
        public Dictionary<float, Dictionary<float, PdfWord>> pdfWordsByXByY;

        public PDFTextLocationStripper(): base()
        {
            try
            {
                textWithPostion = "";
                pdfWordsByXByY = new Dictionary<float, Dictionary<float, PdfWord>>();
            }
            catch (Exception ex)
            {

            }
        }

        protected override void processTextPosition(TextPosition text)
        {
            try
            {
                float textX = text.getXDirAdj();
                float textY = text.getYDirAdj();
                if (!String.IsNullOrWhiteSpace(text.getCharacter()))
                {
                    if (pdfWordsByXByY.ContainsKey(textY))
                    {
                        Dictionary<float, PdfWord> wordsByX = pdfWordsByXByY[textY];
                        if (wordsByX.ContainsKey(textX))
                        {
                            PdfWord word = wordsByX[textX];
                            wordsByX.Remove(word.Right);
                            word.EndCharWidth = text.getWidthDirAdj();
                            word.Height = text.getHeightDir();
                            word.EndX = textX;
                            word.Text += text.getCharacter();
                            if (!wordsByX.Keys.Contains(word.Right))
                            {
                                wordsByX.Add(word.Right, word);
                            }
                        }
                        else
                        {
                            float requiredX = -1;
                            float minDiff = float.MaxValue;
                            for (int index = 0; index < wordsByX.Keys.Count; index++)
                            {
                                float key = wordsByX.Keys.ElementAt(index);
                                float diff = key - textX;
                                if (diff < 0)
                                {
                                    diff = -diff;
                                }
                                if (diff < minDiff)
                                {
                                    minDiff = diff;
                                    requiredX = key;
                                }
                            }
                            if (requiredX > -1 && minDiff <= 1)
                            {
                                PdfWord word = wordsByX[requiredX];
                                wordsByX.Remove(requiredX);
                                word.EndCharWidth = text.getWidthDirAdj();
                                word.Height = text.getHeightDir();
                                word.EndX = textX;
                                word.Text += text.getCharacter();
                                if (!wordsByX.ContainsKey(word.Right))
                                {
                                    wordsByX.Add(word.Right, word);
                                }
                            }
                            else
                            {
                                PdfWord word = new PdfWord();
                                word.Text = text.getCharacter();
                                word.EndX = word.StartX = textX;
                                word.Y = textY;
                                word.EndCharWidth = word.StartCharWidth = text.getWidthDirAdj();
                                word.Height = text.getHeightDir();
                                if (!wordsByX.ContainsKey(word.Right))
                                {
                                    wordsByX.Add(word.Right, word);
                                }
                                pdfWordsByXByY[textY] = wordsByX;
                            }
                        }
                    }
                    else
                    {
                        Dictionary<float, PdfWord> wordsByX = new Dictionary<float, PdfWord>();
                        PdfWord word = new PdfWord();
                        word.Text = text.getCharacter();
                        word.EndX = word.StartX = textX;
                        word.Y = textY;
                        word.EndCharWidth = word.StartCharWidth = text.getWidthDirAdj();
                        word.Height = text.getHeightDir();
                        wordsByX.Add(word.Right, word);
                        pdfWordsByXByY.Add(textY, wordsByX);
                    }
                }
            }
            catch (Exception ex)
            {

            }
        }
    }

And here is the PdfWord class.

 class PdfWord
    {
        public float StartX { get; set; }
        public float EndX { get; set; }
        public float Y { get; set; }
        public float StartCharWidth { get; set; }
        public float EndCharWidth { get; set; }
        public float Height { get; set; }
        public string Text { get; set; }
        public float Right { get { return EndX + EndCharWidth; } }
    }