Analyser des fichiers PDF (en particulier avec des tables) avec PDFBox


J'ai besoin d'analyser un fichier PDF qui contient des données tabulaires. J'utilise PDFBox pour extraire le texte du fichier pour analyser le résultat (chaîne) plus tard. Le problème est que l'extraction de texte ne fonctionne pas comme prévu pour les données tabulaires. Par exemple, j'ai un fichier qui contient une table comme celle-ci (7 colonnes: les deux premières ont toujours des données, une seule colonne de complexité a des données, une seule colonne de financement a des données):

+----------------------------------------------------------------+
| AIH | Value | Complexity                     | Financing       |
|     |       | Medium | High | Not applicable | MAC/Other | FAE |
+----------------------------------------------------------------+
| xyz | 12.43 | 12.34  |      |                | 12.34     |     |
+----------------------------------------------------------------+
| abc | 1.56  |        | 1.56 |                |           | 1.56|
+----------------------------------------------------------------+

Ensuite, j'utilise PDFBox:

PDDocument document = PDDocument.load(pathToFile);
PDFTextStripper s = new PDFTextStripper();
String content = s.getText(document);

Ces deux-là les lignes de données seraient extraites comme ceci:

xyz 12.43 12.4312.43
abc 1.56 1.561.56

Il n'y a pas d'espaces blancs entre les deux derniers nombres, mais ce n'est pas le plus gros problème. Le problème est que je ne sais pas ce que signifient les deux derniers chiffres: Moyen, Élevé, Sans objet? MAC / Autre, FAE? Je n'ai pas la relation entre les nombres et leurs colonnes.

Il n'est pas nécessaire pour moi d'utiliser la bibliothèque PDFBox, donc une solution qui utilise une autre bibliothèque est très bien. Ce que je veux, c'est pouvoir analyser le fichier et savoir ce que signifie chaque nombre analysé.

Author: Brian Tompsett - 汤莱恩, 2010-07-08

19 answers

Vous devrez concevoir un algorithme pour extraire les données dans un format utilisable. Quelle que soit la bibliothèque PDF que vous utilisez, vous devrez le faire. Les personnages et les graphiques sont dessinés par une série d'opérations de dessin avec état, c'est-à-dire se déplacer à cette position sur l'écran et dessiner le glyphe pour le caractère 'c'.

Je suggère d'étendre org.apache.pdfbox.pdfviewer.PDFPageDrawer et de remplacer la méthode strokePath. De là vous pouvez intercepter les opérations de dessin pour les segments de ligne horizontaux et verticaux et l'utiliser informations pour déterminer les positions des colonnes et des lignes de votre table. Ensuite, il s'agit simplement de configurer des régions de texte et de déterminer quels chiffres/lettres/caractères sont dessinés dans quelle région. Puisque vous connaissez la disposition des régions, vous serez en mesure de dire à quelle colonne appartient le texte extrait.

De plus, la raison pour laquelle vous ne pouvez pas avoir d'espaces entre le texte qui est visuellement séparé est que très souvent, un caractère d'espace n'est pas dessiné par le PDF. Au lieu de cela la matrice de texte est mise à jour et une commande de dessin pour 'move' est émise pour dessiner le caractère suivant et une "largeur d'espace" en dehors du dernier.

Bonne chance.

 20
Author: purecharger, 2010-08-12 21:47:34

J'avais utilisé de nombreux outils pour extraire la table du fichier pdf mais cela n'a pas fonctionné pour moi.

J'ai donc implémenté mon propre algorithme ( son nom est traprange) pour analyser les données tabulaires dans les fichiers pdf.

Voici quelques exemples de fichiers PDF et de résultats:

  1. fichier d'Entrée: exemple-1.pdf , résultat: échantillon-1.code html
  2. fichier d'Entrée: exemple-4.pdf , résultat: échantillon-4.code html

Visitez la page de mon projet à traprange.

 15
Author: Tho, 2015-04-12 10:39:13

Vous pouvez extraire du texte par zone dans PDFBox. Voir le fichier d'exemple ExtractByArea.java, dans l'artefact pdfbox-examples si vous utilisez Maven. Un extrait ressemble à

   PDFTextStripperByArea stripper = new PDFTextStripperByArea();
   stripper.setSortByPosition( true );
   Rectangle rect = new Rectangle( 464, 59, 55, 5);
   stripper.addRegion( "class1", rect );
   stripper.extractRegions( page );
   String string = stripper.getTextForRegion( "class1" );

Le problème est d'obtenir les coordonnées en premier lieu. J'ai réussi à étendre le TextStripper normal, à remplacer processTextPosition(TextPosition text) et à imprimer les coordonnées de chaque caractère et à déterminer où elles se trouvent dans le document.

Mais il existe un moyen beaucoup plus simple, du moins si vous êtes sur un Mac. Ouvrez le PDF en aperçu ,I I pour afficher le Inspecteur, choisissez l'onglet Recadrer et assurez-vous que les unités sont en points, dans le menu Outils, choisissez Sélection rectangulaire et sélectionnez la zone d'intérêt. Si vous sélectionnez une zone, l'inspecteur vous montrera les coordonnées, que vous pouvez compléter et alimenter le Rectangle arguments du constructeur. Vous avez juste besoin de confirmer où se trouve l'origine, en utilisant la première méthode.

 13
Author: Emerson Farrugia, 2013-06-30 22:02:48

Il est peut-être trop tard pour ma réponse, mais je pense que ce n'est pas si difficile. Vous pouvez étendre la classe PDFTextStripper et remplacer writePage () et processTextPosition(...) méthode. Dans votre cas, je suppose que les en-têtes de colonne sont toujours les mêmes. Cela signifie que vous savez la coordonnée x de chaque en-tête de colonne et vous pouvez comparer la coordonnée x de l'chiffres à ceux d'en-têtes de colonne. S'ils sont assez proches (vous devez tester pour décider de la proximité), vous pouvez dire que cela nombre appartient à cette colonne.

Une autre approche serait d'intercepter le vecteur "charactersByArticle" après l'écriture de chaque page:

@Override
public void writePage() throws IOException {
    super.writePage();
    final Vector<List<TextPosition>> pageText = getCharactersByArticle();
    //now you have all the characters on that page
    //to do what you want with them
}

Connaissant vos colonnes, vous pouvez faire votre comparaison des coordonnées x pour décider à quelle colonne appartient chaque nombre.

La raison pour laquelle vous n'avez pas d'espaces entre les nombres est que vous devez définir la chaîne de séparateur de mots.

J'espère que cela vous sera utile ou utile à d'autres personnes qui pourraient essayer des choses similaires.

 11
Author: impeto, 2012-09-22 17:15:19

Il y a PDFLayoutTextStripper qui a été conçu pour conserver le format des données.

Du fichier README:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import org.apache.pdfbox.pdfparser.PDFParser;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.util.PDFTextStripper;

public class Test {

    public static void main(String[] args) {
        String string = null;
        try {
            PDFParser pdfParser = new PDFParser(new FileInputStream("sample.pdf"));
            pdfParser.parse();
            PDDocument pdDocument = new PDDocument(pdfParser.getDocument());
            PDFTextStripper pdfTextStripper = new PDFLayoutTextStripper();
            string = pdfTextStripper.getText(pdDocument);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        };
        System.out.println(string);
    }
}
 10
Author: Matthias Braun, 2017-02-26 19:04:01

J'ai eu un succès décent avec l'analyse des fichiers texte générés par l'utilitaire pdftotext (sudo apt-get install poppler-utils).

File convertPdf() throws Exception {
    File pdf = new File("mypdf.pdf");
    String outfile = "mytxt.txt";
    String proc = "/usr/bin/pdftotext";
    ProcessBuilder pb = new ProcessBuilder(proc,"-layout",pdf.getAbsolutePath(),outfile); 
    Process p = pb.start();

    p.waitFor();

    return new File(outfile);
}
 4
Author: scott, 2012-10-01 01:21:49

Essayez d'utiliser TabulaPDF (https://github.com/tabulapdf/tabula) . C'est une très bonne bibliothèque pour extraire le contenu de la table du fichier PDF. Il est très attendu.

Bonne chance. :)

 4
Author: SURESH KUMAR S, 2018-08-22 07:36:08

L'extraction de données à partir d'un PDF est forcément semée d'embûches. Les documents sont-ils créés par une sorte de processus automatique? Si c'est le cas, vous pouvez envisager de convertir les PDF en PostScript non compressé (essayez pdf2ps) et de voir si le PostScript contient une sorte de modèle régulier que vous pouvez exploiter.

 2
Author: Todd Owen, 2010-07-09 14:15:18

J'ai eu le même problème en lisant le fichier pdf dans lequel les données sont au format tabulaire. Après une analyse régulière à l'aide de PDFBox, chaque ligne a été extraite avec une virgule comme séparateur... perdre la position colonnaire. Pour résoudre ce problème, j'ai utilisé PDFTextStripperByArea et en utilisant les coordonnées, j'ai extrait les données colonne par colonne pour chaque ligne. Ceci est à condition que vous ayez un format fixe pdf.

        File file = new File("fileName.pdf");
        PDDocument document = PDDocument.load(file);
        PDFTextStripperByArea stripper = new PDFTextStripperByArea();
        stripper.setSortByPosition( true );
        Rectangle rect1 = new Rectangle( 50, 140, 60, 20 );
        Rectangle rect2 = new Rectangle( 110, 140, 20, 20 );
        stripper.addRegion( "row1column1", rect1 );
        stripper.addRegion( "row1column2", rect2 );
        List allPages = document.getDocumentCatalog().getAllPages();
        PDPage firstPage = (PDPage)allPages.get( 2 );
        stripper.extractRegions( firstPage );
        System.out.println(stripper.getTextForRegion( "row1column1" ));
        System.out.println(stripper.getTextForRegion( "row1column2" ));

Puis ligne 2 et ainsi de suite...

 2
Author: manu, 2014-11-18 15:32:45

Vous pouvez utiliser PDFBox PDFTextStripperByArea classe pour extraire du texte d'une région spécifique d'un document. Vous pouvez vous appuyer sur cela en identifiant la région de chaque cellule de la table. Ce n'est pas fourni hors de la boîte, mais l'exemple DrawPrintTextLocations la classe montre comment vous pouvez analyser les boîtes de délimitation de caractères individuels dans un document (ce serait génial d'analyser les boîtes de délimitation de chaînes ou de paragraphes, mais je n'ai pas vu de support dans PDFBox pour cela - voir cette question). Vous peut utiliser cette approche pour regrouper toutes les boîtes de délimitation touchantes pour identifier les cellules distinctes d'un tableau. Une façon de le faire est de maintenir un ensemble boxes de Rectangle2D régions, puis pour chaque caractère analysé trouver la zone de délimitation du caractère comme dans DrawPrintTextLocations.writeString(String string, List<TextPosition> textPositions) et le fusionner avec le contenu existant.

Rectangle2D bounds = s.getBounds2D();
// Pad sides to detect almost touching boxes
Rectangle2D hitbox = bounds.getBounds2D();
final double dx = 1.0; // This value works for me, feel free to tweak (or add setter)
final double dy = 0.000; // Rows of text tend to overlap, so no need to extend
hitbox.add(bounds.getMinX() - dx , bounds.getMinY() - dy);
hitbox.add(bounds.getMaxX() + dx , bounds.getMaxY() + dy);

// Find all overlapping boxes
List<Rectangle2D> intersectList = new ArrayList<Rectangle2D>();
for(Rectangle2D box: boxes) {
    if(box.intersects(hitbox)) {
        intersectList.add(box);
    }
}

// Combine all touching boxes and update
for(Rectangle2D box: intersectList) {
    bounds.add(box);
    boxes.remove(box);
}
boxes.add(bounds);

Vous pouvez ensuite passer ces régions à PDFTextStripperByArea.

Vous pouvez également aller plus loin et séparer les composantes horizontales et verticales de ces régions, et ainsi déduire les régions de tous les les cellules de la table, qu'elles contiennent ou non du contenu.

J'ai eu raison d'effectuer ces étapes et j'ai finalement écrit ma propre classe PDFTableStripperen utilisant PDFBox. J'ai partagé mon code en tant que essentiel sur GitHub. L'main méthode donne un exemple de la façon dont la classe peut être utilisée:

try (PDDocument document = PDDocument.load(new File(args[0])))
{
    final double res = 72; // PDF units are at 72 DPI
    PDFTableStripper stripper = new PDFTableStripper();
    stripper.setSortByPosition(true);

    // Choose a region in which to extract a table (here a 6"wide, 9" high rectangle offset 1" from top left of page)
    stripper.setRegion(new Rectangle(
        (int) Math.round(1.0*res), 
        (int) Math.round(1*res), 
        (int) Math.round(6*res), 
        (int) Math.round(9.0*res)));

    // Repeat for each page of PDF
    for (int page = 0; page < document.getNumberOfPages(); ++page)
    {
        System.out.println("Page " + page);
        PDPage pdPage = document.getPage(page);
        stripper.extractTable(pdPage);
        for(int c=0; c<stripper.getColumns(); ++c) {
            System.out.println("Column " + c);
            for(int r=0; r<stripper.getRows(); ++r) {
                System.out.println("Row " + r);
                System.out.println(stripper.getText(r, c));
            }
        }
    }
}
 2
Author: beldaz, 2018-07-13 22:59:27

Que diriez-vous d'imprimer sur l'image et de faire de l'OCR là-dessus?

Semble terriblement inefficace, mais c'est pratiquement le but même du PDF de rendre le texte inaccessible, vous devez faire ce que vous devez faire.

 0
Author: Carl Smotricz, 2010-07-17 14:26:09

Http://swftools.org/ ces gars-là ont un pdf2swf composant. Ils sont également capables d'afficher des tableaux. Ils donnent aussi la source. Donc, vous pourriez peut-être vérifier.

 0
Author: kaushalc, 2010-10-26 13:26:43

Cela fonctionne bien si le fichier PDF a "Uniquement une table rectangulaire" en utilisant pdfbox 2.0.6. Ne fonctionnera avec aucune autre table que la table rectangulaire.

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import org.apache.pdfbox.text.PDFTextStripperByArea;
public class PDFTableExtractor {
    public static void main(String[] args) throws IOException {
        ArrayList<String[]> objTableList = readParaFromPDF("C:\\sample1.pdf", 1,1,6);
        //Enter Filepath, startPage, EndPage, Number of columns in Rectangular table
    }
    public static ArrayList<String[]> readParaFromPDF(String pdfPath, int pageNoStart, int pageNoEnd, int noOfColumnsInTable) {
        ArrayList<String[]> objArrayList = new ArrayList<>();
        try {
            PDDocument document = PDDocument.load(new File(pdfPath));
            document.getClass();
            if (!document.isEncrypted()) {
                PDFTextStripperByArea stripper = new PDFTextStripperByArea();
                stripper.setSortByPosition(true);
                PDFTextStripper tStripper = new PDFTextStripper();
                tStripper.setStartPage(pageNoStart);
                tStripper.setEndPage(pageNoEnd);
                String pdfFileInText = tStripper.getText(document);
                // split by whitespace
                String Documentlines[] = pdfFileInText.split("\\r?\\n");
                for (String line : Documentlines) {
                    String lineArr[] = line.split("\\s+");
                    if (lineArr.length == noOfColumnsInTable) {
                        for (String linedata : lineArr) {
                            System.out.print(linedata + "             ");
                        }
                        System.out.println("");
                        objArrayList.add(lineArr);
                    }
                }
            }
        } catch (Exception e) {
            System.out.println("Exception " +e);
        }
            return objArrayList;
    }
}
 0
Author: Sunil K Chaudhary, 2017-09-14 06:04:33

Pour tous ceux qui veulent faire la même chose que OP (comme je le fais), après des jours de recherche Amazon Textract est la meilleure option (si votre volume est faible, le niveau gratuit pourrait suffire).

 0
Author: UnderBlue592, 2020-09-10 07:03:44

Il n'est pas nécessaire pour moi d'utiliser la bibliothèque PDFBox, donc une solution qui utilise une autre bibliothèque est bien

Camelot et Excalibur

, Vous pouvez essayer de bibliothèque Python Camelot, une bibliothèque open source pour Python. Si vous n'êtes pas enclin à écrire du code, vous pouvez utiliser l'interface web Excalibur créée autour de Camelot. Vous "téléchargez" le document sur un serveur Web localhost, et "téléchargez" le résultat de ce localhost serveur.

Voici un exemple d'utilisation de ce code python:

import camelot
tables = camelot.read_pdf('foo.pdf', flavor="stream")
tables[0].to_csv('foo.csv')

L'entrée est un pdf contenant ce tableau:

PDF-Échantillon TREX

Exemple de tableau de l'ensemble PDF-TREX

Aucune aide n'est fournie à camelot, il travaille seul en regardant des morceaux d'alignement relatif du texte. Le résultat est renvoyé dans un fichier csv:

Tableau PDF extrait de l'échantillon par camelot

PDF tableau extrait de l'échantillon par camelot

" Règles " peut de ajouté pour aider camelot à identifier où se trouvent les filets dans les tables sophistiquées:

Règle ajoutée à Excalibur
Règle ajoutée dans Excalibur. Source

GitHub:

Les deux projets sont actifs.

Ici est une comparaison avec d'autres logiciels (avec test basé sur des documents réels), Tabula, pdfplumber, pdftables, pdf-table-de l'extrait de.


Je veux pouvoir analyser le fichier et savoir ce que signifie chaque nombre analysé

Vous ne pouvez pas le faire automatiquement, car le pdf n'est pas structuré sémantiquement.

Livre versus document

Les "documents" pdf ne sont pas structurés d'un point de vue sémantique (c'est comme un fichier bloc-notes), le document pdf donne des instructions sur l'endroit où imprimer un fragment de texte, sans rapport avec d'autres fragments de la même section, il n'y a pas de séparation entre le contenu (quoi imprimer, et s'il s'agit d'un fragment d'un titre, d'un tableau ou d'une note de bas de page) et la représentation visuelle (police, emplacement, etc.). Pdf est une extension dePostScript , qui décrit un Hello world! page de cette façon:

!PS
 /Courier             % font
 20 selectfont        % size
 72 500 moveto        % current location to print at
 (Hello world!) show  % add text fragment
 showpage             % print all on the page

(Wikipedia).
On peut imaginer à quoi ressemble une table avec les mêmes instructions.

On pourrait dire que html n'est pas plus clair, mais il y a une grande différence: Html décrit le contenu sémantique (titre, paragraphe, liste, en-tête de tableau, cellule de tableau ...) et associe le css pour produire une forme visuelle, donc le contenu est entièrement accessible. En ce sens, html est un descendant simplifié de sgml qui met des contraintes pour permettre le traitement des données:

Le balisage doit décrire la structure d'un document et d'autres attributs plutôt que de spécifier le traitement à effectuer, car il est moins susceptible d'entrer en conflit avec les futurs développement.

Exactement le contraire de PostScript/Pdf. SGML est utilisé dans la publication. Pdf n'intègre pas cette structure sémantique, il ne porte que l'équivalent css associé aux chaînes de caractères simples qui peuvent ne pas être des mots ou des phrases complets. Pdf est utilisé pour les documents fermés et maintenant pour la soi-disant gestion du flux de travail.

Après avoir expérimenté l'incertitude et la difficulté à essayer d'extraire des données à partir de pdf, il est clair que pdf n'est pas du tout une solution pour préserver un contenu de document pour l'avenir (malgré Adobe a obtenu de leurs paires un pdf standard).

Ce qui est en fait bien conservé, c'est la représentation imprimée, car le pdf était entièrement dédié à cet aspect lors de sa création. Les PDF sont presque aussi morts que les livres imprimés.

Lors de la réutilisation du contenu, il faut à nouveau compter sur la saisie manuelle des données, comme à partir d'un livre imprimé (éventuellement en essayant de faire de l'OCR dessus). C'est de plus en plus vrai, comme beaucoup de pdf même empêcher l'utilisation de copier-coller, en introduisant plusieurs espaces entre les mots ou produire un charabia de caractères non ordonnés lorsque une "optimisation" est effectuée pour une utilisation Web.

Lorsque le contenu du document, et non sa représentation imprimée, est précieux, le format pdf n'est pas le bon. Même Adobe est incapable de recréer parfaitement la source d'un document à partir de son rendu pdf.

Les données ouvertes ne doivent donc jamais être publiées au format pdf, ce qui limite leur utilisation à la lecture et à l'impression (lorsqu'il est autorisé), et rend la réutilisation plus difficile ou impossible.

 0
Author: mins, 2020-10-18 14:07:15
ObjectExtractor oe = new ObjectExtractor(document);

SpreadsheetExtractionAlgorithm sea = new SpreadsheetExtractionAlgorithm(); // Tabula algo.

Page page = oe.extract(1); // extract only the first page

for (int y = 0; y < sea.extract(page).size(); y++) {
  System.out.println("table: " + y);
  Table table = sea.extract(page).get(y);

  for (int i = 0; i < table.getColCount(); i++) {
    for (int x = 0; x < table.getRowCount(); x++) {
      System.out.println("col:" + i + "/lin:x" + x + " >>" + table.getCell(x, i).getText());
    }
  }
}
 0
Author: Thiago Rabelo, 2020-11-11 16:38:06

Envisagez d'utiliser PDFTableStripper.classe

La classe est disponible sur git : https://gist.github.com/beldaz/8ed6e7473bd228fcee8d4a3e4525be11#file-pdftablestripper-java-L1

 0
Author: Winter MC, 2021-01-03 22:01:49

Je ne connais pas PDFBox, mais vous pouvez essayer de regarderitext . Même si la page d'accueil indique la génération de PDF, vous pouvez également effectuer la manipulation et l'extraction de PDF. Jetez un oeil et voyez si cela correspond à votre cas d'utilisation.

 -1
Author: Paul Sanwald, 2010-07-08 13:53:26

Pour lire le contenu de la table à partir d'un fichier pdf,vous devez simplement convertir le fichier pdf en un fichier texte en utilisant n'importe quelle API(j'ai utilisé PdfTextExtracter.getTextFromPage () de iText), puis lisez ce fichier txt par votre programme java..maintenant, après l'avoir lu, la tâche principale est terminée.. vous devez filtrer les données de votre besoin. vous pouvez le faire en utilisant continuellement la méthode split de la classe String jusqu'à ce que vous trouviez l'enregistrement de votre intrest.. voici mon code par lequel j'ai extrait une partie de l'enregistrement par un PDF fichier et écrire dans un .Fichier CSV.. L'url du fichier PDF est.. http://www.cea.nic.in/reports/monthly/generation_rep/actual/jan13/opm_02.pdf

Code: -

public static void genrateCsvMonth_Region(String pdfpath, String csvpath) {
        try {
            String line = null;
            // Appending Header in CSV file...
            BufferedWriter writer1 = new BufferedWriter(new FileWriter(csvpath,
                    true));
            writer1.close();
            // Checking whether file is empty or not..
            BufferedReader br = new BufferedReader(new FileReader(csvpath));

            if ((line = br.readLine()) == null) {
                BufferedWriter writer = new BufferedWriter(new FileWriter(
                        csvpath, true));
                writer.append("REGION,");
                writer.append("YEAR,");
                writer.append("MONTH,");
                writer.append("THERMAL,");
                writer.append("NUCLEAR,");
                writer.append("HYDRO,");
                writer.append("TOTAL\n");
                writer.close();
            }
            // Reading the pdf file..
            PdfReader reader = new PdfReader(pdfpath);
            BufferedWriter writer = new BufferedWriter(new FileWriter(csvpath,
                    true));

            // Extracting records from page into String..
            String page = PdfTextExtractor.getTextFromPage(reader, 1);
            // Extracting month and Year from String..
            String period1[] = page.split("PEROID");
            String period2[] = period1[0].split(":");
            String month[] = period2[1].split("-");
            String period3[] = month[1].split("ENERGY");
            String year[] = period3[0].split("VIS");

            // Extracting Northen region
            String northen[] = page.split("NORTHEN REGION");
            String nthermal1[] = northen[0].split("THERMAL");
            String nthermal2[] = nthermal1[1].split(" ");

            String nnuclear1[] = northen[0].split("NUCLEAR");
            String nnuclear2[] = nnuclear1[1].split(" ");

            String nhydro1[] = northen[0].split("HYDRO");
            String nhydro2[] = nhydro1[1].split(" ");

            String ntotal1[] = northen[0].split("TOTAL");
            String ntotal2[] = ntotal1[1].split(" ");

            // Appending filtered data into CSV file..
            writer.append("NORTHEN" + ",");
            writer.append(year[0] + ",");
            writer.append(month[0] + ",");
            writer.append(nthermal2[4] + ",");
            writer.append(nnuclear2[4] + ",");
            writer.append(nhydro2[4] + ",");
            writer.append(ntotal2[4] + "\n");

            // Extracting Western region
            String western[] = page.split("WESTERN");

            String wthermal1[] = western[1].split("THERMAL");
            String wthermal2[] = wthermal1[1].split(" ");

            String wnuclear1[] = western[1].split("NUCLEAR");
            String wnuclear2[] = wnuclear1[1].split(" ");

            String whydro1[] = western[1].split("HYDRO");
            String whydro2[] = whydro1[1].split(" ");

            String wtotal1[] = western[1].split("TOTAL");
            String wtotal2[] = wtotal1[1].split(" ");

            // Appending filtered data into CSV file..
            writer.append("WESTERN" + ",");
            writer.append(year[0] + ",");
            writer.append(month[0] + ",");
            writer.append(wthermal2[4] + ",");
            writer.append(wnuclear2[4] + ",");
            writer.append(whydro2[4] + ",");
            writer.append(wtotal2[4] + "\n");

            // Extracting Southern Region
            String southern[] = page.split("SOUTHERN");

            String sthermal1[] = southern[1].split("THERMAL");
            String sthermal2[] = sthermal1[1].split(" ");

            String snuclear1[] = southern[1].split("NUCLEAR");
            String snuclear2[] = snuclear1[1].split(" ");

            String shydro1[] = southern[1].split("HYDRO");
            String shydro2[] = shydro1[1].split(" ");

            String stotal1[] = southern[1].split("TOTAL");
            String stotal2[] = stotal1[1].split(" ");

            // Appending filtered data into CSV file..
            writer.append("SOUTHERN" + ",");
            writer.append(year[0] + ",");
            writer.append(month[0] + ",");
            writer.append(sthermal2[4] + ",");
            writer.append(snuclear2[4] + ",");
            writer.append(shydro2[4] + ",");
            writer.append(stotal2[4] + "\n");

            // Extracting eastern region
            String eastern[] = page.split("EASTERN");

            String ethermal1[] = eastern[1].split("THERMAL");
            String ethermal2[] = ethermal1[1].split(" ");

            String ehydro1[] = eastern[1].split("HYDRO");
            String ehydro2[] = ehydro1[1].split(" ");

            String etotal1[] = eastern[1].split("TOTAL");
            String etotal2[] = etotal1[1].split(" ");
            // Appending filtered data into CSV file..
            writer.append("EASTERN" + ",");
            writer.append(year[0] + ",");
            writer.append(month[0] + ",");
            writer.append(ethermal2[4] + ",");
            writer.append(" " + ",");
            writer.append(ehydro2[4] + ",");
            writer.append(etotal2[4] + "\n");

            // Extracting northernEastern region
            String neestern[] = page.split("NORTH");

            String nethermal1[] = neestern[2].split("THERMAL");
            String nethermal2[] = nethermal1[1].split(" ");

            String nehydro1[] = neestern[2].split("HYDRO");
            String nehydro2[] = nehydro1[1].split(" ");

            String netotal1[] = neestern[2].split("TOTAL");
            String netotal2[] = netotal1[1].split(" ");

            writer.append("NORTH EASTERN" + ",");
            writer.append(year[0] + ",");
            writer.append(month[0] + ",");
            writer.append(nethermal2[4] + ",");
            writer.append(" " + ",");
            writer.append(nehydro2[4] + ",");
            writer.append(netotal2[4] + "\n");
            writer.close();

        } catch (IOException ioe) {
            ioe.printStackTrace();
        }

    }
 -1
Author: Abhishek Yadav, 2014-02-27 12:16:10