Accueil > > > COMPTER LE NOMBRE DE PAGES D'UN FICHIER PDF
COMPTER LE NOMBRE DE PAGES D'UN FICHIER PDF
Information sur la source
Description
Ce petit code source permet de compter le nombre de pages dans un fichier PDF. Fonctionne au moins avec les PDF jusqu'au 1.4 les spécifications 1.5 voient entrer la compression de la table XRef... du coup, pour ce simple comptage, le code se voit allongé de deux a trois fois sa taille actuelle, d'après mes premières estimations. vu que j'ai écrit ce code rapidement, pour un cadre précis, avec des fichiers 1.4...
Source
- #if defined(WIN32)
- #define _CRT_SECURE_NO_WARNINGS
- #endif
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
-
- int CountPDFPage(char *Fichier) {
- FILE *pdf;
- unsigned int count = 0;
- int offset;
- int len;
- int i;
- int refCount;
- char *p;
- char buf[1024];
- unsigned int *XRef;
- if ((pdf = fopen(Fichier, "rb")) == NULL) {
- printf("Impossible d'ouvrir le fichier PDF.\n");
- return -1;
- }
-
- fread(buf, 1, 5, pdf);
- if (strncmp(buf, "%PDF-", 5)) {
- printf("fichier non PDF.\n");
- return -2;
- }
-
- fseek(pdf, 0, SEEK_END);
- offset = ftell(pdf)-60;
- fseek(pdf, offset, SEEK_SET);
- len = fread(buf, 1, 60, pdf);
- if (len!=60) {
- printf("fichier PDF corrompu\n");
- return -3;
- }
-
- buf[60] = 0;
- for(;;) {
- len = strlen(buf);
- if (len==60)
- break;
- else
- buf[len] = 32;
- }
-
- p = strstr(buf, "startxref");
- if (p==0) {
- printf("Erreur dans l'analyse du pdf. Impossible de trouver le StartXRef\n");
- return -4;
- }
-
- p+=10;
- while (*p==32 || *p==10 || *p==13) p++;
- offset = atoi(p);
- if (offset<=0) {
- printf("Erreur dans l'analyse du pdf. StartXRef==%d\n", offset);
- return -5;
- }
- fseek(pdf, offset, SEEK_SET);
-
- /* On récupère le nombre d'entree de la XRef */
- fread(buf, 1, 40, pdf);
-
- if (strncmp(buf, "xref", 4)) {
- printf("XRef incompatible. Peut être s'agit il d'un fichier PDF 1.5 ou superieur\n");
- return -6;
- }
-
- p=buf+4;
- while (*p==32 || *p==10 || *p==13) p++;
- while (*p>='0' && *p<='9') p++;
- while (*p==32) p++;
-
- refCount = atoi(p);
- if (refCount<=0) {
- printf("Erreur dans l'analyse du pdf. XRef==%d\n", refCount);
- return -7;
- }
-
- /* On va conserver la XRef en memoire. */
- XRef = malloc(sizeof(unsigned int)*--refCount);
- fseek(pdf, offset+32, SEEK_SET);
- for (i=0; i<refCount;) {
- len = fread(buf, 1, 1024, pdf);
- for(p=buf; i<refCount && p<(buf+len); p+=20) {
- XRef[i] = atoi(p);
- i++;
- }
- }
-
- /* Pour chaque object de la XRef... */
- for (i=0; i<refCount; i++) {
- fseek(pdf, XRef[i], SEEK_SET);
- fread(buf, 1, 1024, pdf);
- p = strstr(buf, "/Type ");
- if (p) {
- if (strncmp(p, "/Type /Pages", 12))
- break; /* Seuls les /Pages nous interessent... */
- p = strstr(buf, ">>");
- if (p)
- *p=0; /* Permet de ne pas tenir compte du 'trop-lu' du fichier */
- /* Un fichier PDF peut contenir n groupes de pages. */
- /* Seul l'element racine nous interesse : celui qui n'a pas de Parent */
- if (strstr(buf, "/Parent ") == NULL) {
- p = strstr(buf, "/Count ");
- if (p) {
- count = atoi(p+7); /* Voila notre nombre de pages */
- break;
- }
- }
- }
- }
-
- free(XRef);
-
- fclose(pdf);
- return count;
- }
-
- int main(int argc, char *argv[]) {
- int rc;
- if (argc!=2) {
- printf("Compte le nombre de pages d'un fichier PDF dont le chemin est donne en parametre.\n");
- return 1;
- }
- rc = CountPDFPage(argv[1]);
- if (rc>0) {
- printf("%d\n", rc);
- return 0;
- }
- printf("%d\n", rc);
- return rc;
- }
#if defined(WIN32)
#define _CRT_SECURE_NO_WARNINGS
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int CountPDFPage(char *Fichier) {
FILE *pdf;
unsigned int count = 0;
int offset;
int len;
int i;
int refCount;
char *p;
char buf[1024];
unsigned int *XRef;
if ((pdf = fopen(Fichier, "rb")) == NULL) {
printf("Impossible d'ouvrir le fichier PDF.\n");
return -1;
}
fread(buf, 1, 5, pdf);
if (strncmp(buf, "%PDF-", 5)) {
printf("fichier non PDF.\n");
return -2;
}
fseek(pdf, 0, SEEK_END);
offset = ftell(pdf)-60;
fseek(pdf, offset, SEEK_SET);
len = fread(buf, 1, 60, pdf);
if (len!=60) {
printf("fichier PDF corrompu\n");
return -3;
}
buf[60] = 0;
for(;;) {
len = strlen(buf);
if (len==60)
break;
else
buf[len] = 32;
}
p = strstr(buf, "startxref");
if (p==0) {
printf("Erreur dans l'analyse du pdf. Impossible de trouver le StartXRef\n");
return -4;
}
p+=10;
while (*p==32 || *p==10 || *p==13) p++;
offset = atoi(p);
if (offset<=0) {
printf("Erreur dans l'analyse du pdf. StartXRef==%d\n", offset);
return -5;
}
fseek(pdf, offset, SEEK_SET);
/* On récupère le nombre d'entree de la XRef */
fread(buf, 1, 40, pdf);
if (strncmp(buf, "xref", 4)) {
printf("XRef incompatible. Peut être s'agit il d'un fichier PDF 1.5 ou superieur\n");
return -6;
}
p=buf+4;
while (*p==32 || *p==10 || *p==13) p++;
while (*p>='0' && *p<='9') p++;
while (*p==32) p++;
refCount = atoi(p);
if (refCount<=0) {
printf("Erreur dans l'analyse du pdf. XRef==%d\n", refCount);
return -7;
}
/* On va conserver la XRef en memoire. */
XRef = malloc(sizeof(unsigned int)*--refCount);
fseek(pdf, offset+32, SEEK_SET);
for (i=0; i<refCount;) {
len = fread(buf, 1, 1024, pdf);
for(p=buf; i<refCount && p<(buf+len); p+=20) {
XRef[i] = atoi(p);
i++;
}
}
/* Pour chaque object de la XRef... */
for (i=0; i<refCount; i++) {
fseek(pdf, XRef[i], SEEK_SET);
fread(buf, 1, 1024, pdf);
p = strstr(buf, "/Type ");
if (p) {
if (strncmp(p, "/Type /Pages", 12))
break; /* Seuls les /Pages nous interessent... */
p = strstr(buf, ">>");
if (p)
*p=0; /* Permet de ne pas tenir compte du 'trop-lu' du fichier */
/* Un fichier PDF peut contenir n groupes de pages. */
/* Seul l'element racine nous interesse : celui qui n'a pas de Parent */
if (strstr(buf, "/Parent ") == NULL) {
p = strstr(buf, "/Count ");
if (p) {
count = atoi(p+7); /* Voila notre nombre de pages */
break;
}
}
}
}
free(XRef);
fclose(pdf);
return count;
}
int main(int argc, char *argv[]) {
int rc;
if (argc!=2) {
printf("Compte le nombre de pages d'un fichier PDF dont le chemin est donne en parametre.\n");
return 1;
}
rc = CountPDFPage(argv[1]);
if (rc>0) {
printf("%d\n", rc);
return 0;
}
printf("%d\n", rc);
return rc;
}
Conclusion
Rien de bien sorcier, mais outil bien utile au quotidien (enfin, dans mon quotidien en tous cas)
Historique
- 14 février 2012 08:42:10 :
- J'ai utilisé la commande gcc -W -Wall -ansi -pedantic pdf_pagecount.c -g
sur mon AIX cible, afin de voir plus de Warnings, et de les corriger. (Merci CptPingu)
J'en ai profité pour ajouter un test: vérifier que le fichier commence bien par %PDF-
- 14 février 2012 11:20:43 :
- Ajout de davantage de controles sur le Pdf
- 14 février 2012 11:21:38 :
- Erreur de mise a jour
- 16 février 2012 09:34:16 :
- Ajout de commentaires
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Retours à la ligne [ par Gerald ]
Quelqu'un pourrait-il me dire comment faire pour compter le nombre de retours à la ligne dans un fichier texte?voici mon programme Dos:unsigned int n,
Comment compter le nombre d'espaces [ par xabi62 ]
Je voudrais savoir comment il faut faire pour compter le nombre de mots dans une phrase, je pense qu'en comptant le nombre d'espace, on doit pouvoir l
API pour visualiser des pages HTML???????? [ par Tropdemalaveclesapi ]
QQN connait une api pour afficher à l'écran une page HTML? merci à tous de réfléchir à la question!
Compter les lignes d un fichier texte [ par DeepThroat ]
Bonjour a tous !J'aimerai trouver une fontion simple qui retourne le nombre de lignes dans un fichier , ou bien qui affiche ce nombre de lignes.j'imag
fichier pdf [ par llo ]
l'losalut,je recherche le glossaire sur la syntaxe interne des fichiers pdf (acrobat).1 - objectif : générer par codes des pages non modifiables2 - ob
COMPTER LE NOMBRES D'IMPRESSIONS [ par bilal ]
VGTABONJOUR G cherché et essayé et toujour pas trouvé ou je dois attaquer pour faire mon petit soft.enfait je voudrai juste compter le nombre d'impres
COMPTER le nbr d impression [ par bilal ]
VGTAVGTABONJOUR G cherché et essayé et toujour pas trouvé ou je dois attaquer pour faire mon petit soft.enfait je voudrai juste compter le nombre d'im
compter et extraire des mots : I NEED HELP !!!!! [ par ben01n ]
salut j'ai une variable "buf" qui contient une phrase saisie par l'utilisateurje voudrais compter le nombre de mots puis les extraires un par un pour
generer du pdf ou rtf en C++ -=help=- [ par cartouh ]
voila, je suis en train de faire une appli qui travaille des images grace à la lib FreeImage (mici BruNews).une fois que j'ai ces images, je voudrais
nombre de pages imprimés [ par revelata ]
Salut,je dois compter les pages imprimés par utilisateur sur une imprimante! J'utilise IADS ou winspool.hµ? Si vous avez des exemples, merci...
|
Derniers Blogs
VOTEZ POUR LE TOP 10 DES INFLUENCEURS SHAREPOINT FRANCOPHONES !VOTEZ POUR LE TOP 10 DES INFLUENCEURS SHAREPOINT FRANCOPHONES ! par Patrick Guimonet
Si ce n'est déjà fait (comme plus de 600 personnes déjà), il est encore temps de voter pour le concours TOP 10 des influenceurs SharePoint francophones ! Il est organisé par harmon.ie et accessible ici : http://harmon.ie/top-...
Cliquez pour lire la suite de l'article par Patrick Guimonet [CONF'SHAREPOINT] DERNIER RAPPEL ! :-)[CONF'SHAREPOINT] DERNIER RAPPEL ! :-) par Patrick Guimonet
La Conf'SharePoint en chiffres c'est : 3 jours de SharePoint ! 4 parcours et 60 sessions 17 partenaires représentant toutes les fac...
Cliquez pour lire la suite de l'article par Patrick Guimonet [ #SHAREPOINT 2013 ] LES MODèLES DE SITES STANDARDS.[ #SHAREPOINT 2013 ] LES MODèLES DE SITES STANDARDS. par Patrick Guimonet
C'est un point peu mis en avant mais SharePoint 2013 a été l'occasion de remettre de l'ordre dans les modèles de sites. Tout d'abord, un certain nombre de modèles ont été tout simplement rendus obsolètes (cf. Fonctionnalités déco...
Cliquez pour lire la suite de l'article par Patrick Guimonet 10 ERREURS DE COMPRéHENSION CONCERNANT SHAREPOINT.10 ERREURS DE COMPRéHENSION CONCERNANT SHAREPOINT. par Patrick Guimonet
Une excellente infographie (qui a sa source ici :http://www.evokeit.com/sharepoint-blog/misconceptions-of-microsoft-sharepoint) que j'ai traduite et commentée sur le blog d'Abalon : http://abalon.fr/blog/10-erreurs-de-comprhension-...
Cliquez pour lire la suite de l'article par Patrick Guimonet
Logiciels
Nego Facturation (1.84)NEGO FACTURATION (1.84)Nego Facturation est un logiciel complet qui permet de gérer vos factures et devis très simplemen... Cliquez pour télécharger Nego Facturation Revealer Keylogger Free (2.07)REVEALER KEYLOGGER FREE (2.07)Keylogger invisible et gratuit pour Windows 8, 7, Vista ou XP. Revealer Keylogger Free vous perme... Cliquez pour télécharger Revealer Keylogger Free Devis-Factures PHMSD (2.1.0.1)DEVIS-FACTURES PHMSD (2.1.0.1)Configuration minimale
Nécessite Windows™ 2000, XP, Windows 7, 8, Vista (Service Pack à... Cliquez pour télécharger Devis-Factures PHMSD Ludoprêt (3.2)LUDOPRêT (3.2)Logiciel gratuit de gestion de ludothèque.
Gestion des jeux et des adhérents.
Gestion des for... Cliquez pour télécharger Ludoprêt 974 Application Server (13.2.1.3)974 APPLICATION SERVER (13.2.1.3)Ecommerce, Blogueur, Vitrine, Newsletter, Java IDE, ..., in the cloud et sous haute dispo. Facile... Cliquez pour télécharger 974 Application Server
|