IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Compter les pages d'un fichier PDF


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Compter les pages d'un fichier PDF
    Bonjour tout le monde,voilà mon problème : je développe un programme en C capable de trouver combien de pages possède un PDF,après quelques recherches j'ai trouvé 2 solutions à mon problème,l'une consiste à chercher le nombre de fois ou apparait "/Type/Page" ce qui donnera le nombre de pages,l'autre à lire le nombre écrit après "/Count".

    J'ai essayé la 1ère méthode,elle semble ne pas marcher pour tout les fichiers pdf.
    J'ai essayé la 2ème avec /Count et je trouve le bon nombre de pages disons 50% du temps,le problème étant qu'un fichier pdf contient plusieurs fois le terme "/Count" et il arrive que le nombres de pages soit faux.

    Ce que je souhaite faire,c'est lancer plusieurs fois la recherche du terme /Count et enregistrer les nombres de pages dans des variables pour ensuite prendre la plus grande.

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
     
     
    void lirePage(char nom[])
    {
        FILE *pdf;
        char zone[5];
        int taille,cpt,i=0,pages;
        long int position,reste;
     
        strcat(nom,".pdf");
     
        pdf=fopen(nom,"r");
        if (pdf==NULL)
        {
            printf ("Fichier introuvable.\n");
            getch();
            exit (1);
        }
     
        fseek(pdf,0,SEEK_SET);
    /*for(cpt=0;cpt<10;cpt++)
    {*/
        while(feof(pdf)!=EOF)
        {
            if(fgetc(pdf)=='/')
            {
                if(fgetc(pdf)=='C')
                {
                    printf("2eme lettre trouvee.\n");
                    if(fgetc(pdf)=='o')
                    {
                        printf("3eme lettre trouvee.\n");
                        if(fgetc(pdf)=='u')
                        {
                            printf("4eme lettre trouvee.\n");
                            if(fgetc(pdf)=='n')
                            {
                                printf("5eme lettre trouvee.\n");
                                if(fgetc(pdf)=='t')
                                {
                                    printf("Position trouvee !\n");
                                    position=ftell(pdf);
                                    break;
                                }
                            }
                            if(feof(pdf)!=EOF)
                            {
                                fseek(pdf,-1,SEEK_CUR);
                            }
                        }
     
                        if(feof(pdf)!=EOF)
                        {
                            fseek(pdf,-1,SEEK_CUR);
                        }
                    }
     
                    if(feof(pdf)!=EOF)
                    {
                        fseek(pdf,-1,SEEK_CUR);
                    }
                }
                if(feof(pdf)!=EOF)
                {
                    fseek(pdf,-1,SEEK_CUR);
                }
            }
            if(feof(pdf)!=EOF)
            {
                fseek(pdf,0,SEEK_CUR);
            }
            if(feof(pdf)!=0) break;
        }
     
    //}
     
     
        position=position+1;
        fseek(pdf,position,SEEK_SET);
        fread(zone,5,1,pdf);
        pages=atoi(zone);
        printf("\nCe fichier contient %d pages.\n",pages);
        fclose(pdf);
     
    }
     
     
     
    int main()
    {
     
        char fichier[20];
        int p1;
     
        printf("Entrez le nom du fichier : ");
        scanf("%s",fichier);
        lirePage(fichier);
     
        getch();
    }

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Déjà une première chose, utilise les balise CODE.

  3. #3
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Sinon un simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int i = 0;
    while(fscanf("/Count")
            i++;
    Ne marcherait-il pas?

    PS : je me suis trompé de bouton j'ai cliqué sur 'poster' au lieu de 'éditer'

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    J'ai ouvert 2 PDF générés avec MikTex et le dernier /Count correspond à la somme des précédents. A voir si c'est généralisable.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Tout d'abord désolé d'avoir tardé à répondre et,non Neckara,cette solution ne fonctionne pas.

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 369
    Points : 23 623
    Points
    23 623
    Par défaut
    Hello,

    Citation Envoyé par Kishikage Voir le message
    … j'ai trouvé 2 solutions à mon problème,l'une consiste à chercher le nombre de fois ou apparait "/Type/Page" ce qui donnera le nombre de pages,l'autre à lire le nombre écrit après "/Count".

    J'ai essayé la 1ère méthode,elle semble ne pas marcher pour tout les fichiers pdf.
    J'ai essayé la 2ème avec /Count et je trouve le bon nombre de pages disons 50% du temps,le problème étant qu'un fichier pdf contient plusieurs fois le terme "/Count" et il arrive que le nombres de pages soit faux.
    Tu n'étais pas très loin de la solution. :-)
    Les spécifications du format PDF disent ceci :

    Citation Envoyé par PDF 1.7
    3.6.2 Page Tree
    The pages of a document are accessed through a structure known as the page tree,
    which defines the ordering of pages in the document. […]

    Page Tree Nodes
    Table 3.26 shows the required entries in a page tree node.

    Type name (Required) The type of PDF object that this dictionary describes; must be Pages for a page tree node.
    Parent dictionary (Required except in root node; must be an indirect reference) The page tree node that is the immediate parent of this one.
    Kids array (Required) An array of indirect references to the immediate children of this node. The children may be page objects or other page tree nodes.
    Count integer (Required) The number of leaf nodes (page objects) that are descendants of this node within the page tree.

    Donc :

    • Un dictionnaire de type « /Pages » n'est pas une page mais une collection de page ;
    • Un tel dictionnaire — appelé Page Tree — contient soit des pages, soit d'autres pages Page Trees ;
    • L'entrée /Count d'un Page Tree donne le nombre total de « feuilles », c'est-à-dire de terminaisons de l'arbre, contenu dans ce dictionnaire et tous ses descendants.


    Donc, compter le nombre de « /Type /Pages » ne donne pas le nombre de pages, et faire la somme de toutes les valeurs de /Count additionnerait plusieurs fois les mêmes pages et, en plus, le mot-clé « /Count » n'est pas propre aux Pages Trees. Il peut être utilisé dans d'autres objets… y compris ceux qui sont propres à certains logiciels et qui ne sont pas définis dans la spécification !

    Par contre, en remontant à l'envers, tous ces sous-arbres sont eux-mêmes réunis dans un seul arbre racine et comme /Count donne le nombre total de feuilles, la valeur à coté /Count dans la racine correspond forcément au nombre total du document, et c'est ce que l'on cherche.

    Par conséquent, il faut :

    • Trouver le trailer ;
    • Trouver l'entrée /Root dans ce trailer et relever la référence de l'objet indiqué, à savoir un « Catalogue », qui est lui-même un dictionnaire contenant « /Type /Catalog » et d'autres entrées obligatoires ;
    • Trouver dans ce catalogue l'entrée « /Page » qui référence la racine de l'arbre, à savoir un Page Tree ;
    • Trouver dans cette racine l'entrée /Count. Sa valeur est celle que tu cherches.


    Je viens d'essayer sur une demi-douzaine de documents et ça fonctionne à chaque fois.

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/08/2014, 12h43
  2. compter les pages d'un pdf ou fichier tiff
    Par anelinette dans le forum WinDev
    Réponses: 15
    Dernier message: 14/02/2013, 15h02
  3. Compter les paragraphes d'un fichier
    Par vince2005 dans le forum Pascal
    Réponses: 4
    Dernier message: 16/02/2007, 15h13
  4. [CSV] Compter les lignes d’un fichier csv
    Par sam01 dans le forum Langage
    Réponses: 3
    Dernier message: 24/01/2007, 11h16
  5. compter les occurences dans un fichier avec fgetc
    Par deathsurfer dans le forum C
    Réponses: 21
    Dernier message: 21/01/2007, 13h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo