comment remplacer une phrase par une autre avec un script ?

billboc

Membre expert
Club iGen
7 Février 2000
1 786
24
entre <head> et </body>
bonjour,

j'ai besoins de changer manuellement la versions d'un pdf à chaque fois que je fais un scan

pour le moment voici ce que je dois faire manuellement

- ouvrir le fichier .pdf avec textedit
- remplacer la premier ligne "%PDF-1.3" par "%PDF-1.4"

est-il possible d'automatiser ces actions à chaque fois que je place ce fichier .pdf avec une action de dossier (applescript) ?
si oui pourriez vous me montrer un exemple ?

merci pour votre aide
bonne journée
 
chercher des scripts find and replace text
mais gaffe à la date du script
car la syntaxe a legerement changé,pour certains détails, dans Applescript avec les OS récents
et tu ne donnes pas l'OS
 
donc "recent"

ceci dit certaines versions d'acrobat peuvent traiter des lots , mais je doute que cela inclut remplacement de texte

ce serait moins cher de pister un scenar automator ou script

( note pour les scripts je crois que la date charniere du mini changement de syntaxe c'est après SL donc 10.7 et suivants)
 
vous connaissez des sites un peu spécialisés dans le domaine (et pour os x) pour trouver des "modèles" car je n'y connais rien du tout ;-)
 
y en a plein ( la majorité en anglais)

par contre, autre angle, contacte des bons en pdf ( du genre magicPDF ou d'autres grands intervenants de fils pdfesques)
ils ont peut etre des scripts sous le coude

les anciens messages privés c'est maintenant via le bouton conversations ( en haut à droite dans la barre noire)
 
j'ai trouvé ce script sur MacG


  • on adding folder items to this_folder after receiving these_items
  • repeat with i in these_items
  • if (i as string) ends with ".pdf" then
  • set tFile to quoted form of POSIX path of i
  • do shell script "/usr/bin/perl -i -p -e 's/<i>//g;' " & tFile
  • end if
  • end repeat
  • end adding folder items to


    est-ce que quelqu'un pourrais m'aider à le modifier pour arriver à atteindre enfin mon but ultime !!
    par contre je ne sais pas si c'est pou un os récent ??
 
excusez je me suis trompé de code ! voici ce que je voulais coller…

  1. on adding folder items to this_folder after receiving these_items
  2. repeat with i in these_items
  3. if (i as string) ends with ".srt" then
  4. set tFile to quoted form of POSIX path of i
  5. do shell script "/usr/bin/perl -i -p -e 's/<\\/?i>//g;' " & tFile
  6. end if
  7. end repeat
  8. end adding folder items to
 
Bonjour,
j'ai trouvé ce script sur MacG

  • est-ce que quelqu'un pourrais m'aider à le modifier pour arriver à atteindre enfin mon but ultime !!
    par contre je ne sais pas si c'est pou un os récent ??
Voici le script pour les fichiers PDF :
AppleScript:
on adding folder items to this_folder after receiving these_items
    repeat with i in these_items
        if (i as string) ends with ".pdf" then
            do shell script "/usr/bin/perl -i -pe 's/%PDF-1.3/%PDF-1.4/ if 1 .. 1;' " & quoted form of POSIX path of i
        end if
    end repeat
end adding folder items to
La commande perl dans ce script remplace seulement la première occurrence de "%PDF-1.3" dans la première ligne du fichier PDF.
La syntaxe de perl fonctionne sur toutes les versions de l'OS.
 
Dernière édition par un modérateur:
Bonjour, vous êtes ici chanceux, en effet, que le` header` soit "lisible" en tant que chaîne de caractères, généralement l'on utilise une representation binaire pour faire ce genre d'opération: ainsi je vous propose ici un petit utilitaire écrit rapidement le temps de lire ce fil, donc; ouvre un fichier en mode binaire, cherche si il y trouve la mention "%PDF-1.3" à l'emplacement [0, 8] et la remplace par "%PDF-1.4" toujours à [0, 8].

C:
// cc -Wall pdf13_to_pdf14.c -o pdf13_to_pdf14
// usage pdf13_to_pdf14 file.pdf

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define _PDF_MAGIC_SIZE 8

int main(int argc, const char * argv[])
{
    const char * pdf13 = "%PDF-1.3";
    const char * pdf14 = "%PDF-1.4";
    char * buffer = NULL;
    FILE * fp = NULL;
    long filesize = 0L;

    if (argc == 2) {
        if ((fp = fopen(argv[1], "rb+"))) {
            fprintf(stderr, "+ file open '%s'\n", argv[1]);
            // adding +1 to be able to print the `buffer` as string.
            if((buffer = malloc(sizeof(char) * (_PDF_MAGIC_SIZE + 1)))) {
                // end-zero-terminated-string, calloc would work in this case, the buffer is tiny.
                memset(buffer, 0, sizeof(char) * (_PDF_MAGIC_SIZE + 1));
            
                fseek(fp, 0, SEEK_END);
                filesize = ftell(fp);
                fseek(fp, 0, SEEK_SET);
        
                if (filesize > _PDF_MAGIC_SIZE) {
                    if(fread(buffer, sizeof(char), sizeof(char) * _PDF_MAGIC_SIZE, fp) == sizeof(char) * _PDF_MAGIC_SIZE) {
                        fprintf(stderr, "+ file read '%s'\n", buffer);
                        if (memcmp(pdf13, buffer, sizeof(char) * _PDF_MAGIC_SIZE) == 0) {
                            fprintf(stderr, "+ file updating '%s' => '%s'\n", pdf13, pdf14);
                            fseek(fp, 0, SEEK_SET);
                            fwrite(pdf14, sizeof(char), sizeof(char) * _PDF_MAGIC_SIZE, fp);
                        }
                    }
                }
                free(buffer);
                buffer = NULL;
            }
            fclose(fp);
            fp = NULL;
        }
    }
    return 0;
}

//
 
Dernière édition par un modérateur:
je viens de tester le script de JacqR qui fonctionne très bien, mais je garde la proposition de Mboum pour d'autres projets ultérieurs !!

ps: j'ai essayé de rajouter une ligne en fin de script pour être sur que tout est bien terminé du genre

Bloc de code:
display dialog "Le fichier est totalement copié !"

Mais ça ne fonctionne pas. Il faut el mettre avant ou après le

Bloc de code:
end adding folder items to

Merci beaucoup pour le coup de main en tous cas ;-)
 
je viens de tester le script de JacqR qui fonctionne très bien, mais je garde la proposition de Mboum pour d'autres projets ultérieurs !!

ps: j'ai essayé de rajouter une ligne en fin de script pour être sur que tout est bien terminé du genre
Mais ça ne fonctionne pas. Il faut el mettre avant ou après le

Bloc de code:
end adding folder items to
Oui, juste avant la ligne "end adding folder items to"

Probablement que vous aurez besoin de la commande activate pour que le dialogue s'affiche au premier-plan, mais je ne suis pas sur.

AppleScript:
    activate
    display dialog "Le fichier est totalement copié !"
end adding folder items to
 
Bonjour, si toutefois, vous êtes amené à utiliser le code que je vous ai proposé dans un futur projet ; j'en apporte ici une nouvelle version corrigée.

Bloc de code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// cc -Wall pdf13_to_pdf14.c -o pdf13_to_pdf14
// usage pdf13_to_pdf14 file.pdf

#define _PDF_MAGIC_SIZE 8

int main(int argc, const char * argv[])
{
    const char * pdf13 = "%PDF-1.3";
    const char * pdf14 = "%PDF-1.4";
    char * buffer = NULL;
    FILE * fp = NULL;
    long filesize = 0L;
 
    if (argc == 2) {
        if ((fp = fopen(argv[1], "rb+"))) {
            fprintf(stderr, "+ file open '%s'\n", argv[1]);
         
            // sanity check
            fseek(fp, 0, SEEK_END);
            filesize = ftell(fp);
            fseek(fp, 0, SEEK_SET);
         
            if (filesize > _PDF_MAGIC_SIZE) {
                // sizeof(char) == 1 byte, this is here and there, only to show how to handle sample based reads ;
                // indeed, we could use an uint32_t buffer ((e.g 8 bytes chunk)) instead of, then comparing the memory.
                // padding, adding +1 to be able to print the `buffer` as string.
                // we could use a static buffer, we know.
                if ((buffer = malloc(sizeof(char) * _PDF_MAGIC_SIZE + 1))) {
                    // end-zero-terminated-string, calloc would work in this case, the buffer is tiny.
                    memset(buffer, 0, sizeof(char) * _PDF_MAGIC_SIZE + 1);         
                    if (fread(buffer, sizeof(char), sizeof(char) * _PDF_MAGIC_SIZE, fp) == sizeof(char) * _PDF_MAGIC_SIZE) {
                        fprintf(stderr, "+ file read [0, 8] '%s'\n", buffer);
                        if (memcmp(pdf13, buffer, sizeof(char) * _PDF_MAGIC_SIZE) == 0) {
                            fprintf(stderr, "+ file updating '%s' => '%s'\n", pdf13, pdf14);
                            fseek(fp, 0, SEEK_SET);
                            fwrite(pdf14, sizeof(char), sizeof(char) * _PDF_MAGIC_SIZE, fp);
                        } else {
                            fprintf(stderr, "+ aborting header '%s' not found \n", pdf13);
                        }
                    }
                    free(buffer);
                    buffer = NULL;
                }
            } else {
                fprintf(stderr, "+ file too small '%s'\n", argv[1]);
            }
            fclose(fp);
            fp = NULL;
            fprintf(stderr, "+ file close '%s'\n", argv[1]);
        } else {
            fprintf(stderr, "+ cannot open file '%s'\n", argv[1]);
        }
    }
    return 0;
}

//
 
Dernière édition:
  • J’aime
Réactions: billboc
un grand merci à tous les 2 ;-)

je suis bluffé par l'intérêt des scripts et action de dossier !! super pratique, énorme gain de temps. Mes scan sont traités instantanément dès leur arrivée dans le dossier cible, génial !
 
  • J’aime
Réactions: Mboum