• 0
Clem

Scriptmaster - Manipulation De Documents Pdf

Question

Pour les scripts proposés ci-dessous:

Eléments requis:

Le plug-in ScriptMaster, l'API iText

Scripts testés avec ScriptMaster 4.4.2 et iText 5.5.4

Scripts testés également avec l'API iText 5.5.10.jar et iText 5.5.11.jar.

Que vos PDFs originaux soient cryptés ou non par mot de passe utilisateur ou/et propiétaire, il est impératif de télécharger également les deux dépendances Bcprov-Jdk15on-1.49.Jar et Bcpkix-Jdk15on-1.49.Jar

______________________________________________________________________________________________

  • Extraire le texte d'un document PDF. (3 méthodes)
  • Extraire les images d'un document PDF.
  • Fusionne une liste de documents PDF en un document PDF final.
  • Créer une copie d'un document PDF en y ajoutant des Métadonnées.
  • iText_ConcatenatePDF ( fm_fileList ; fm_outputPath ; fm_setCompression )
  • iText_SplitPDF ( fm_pathToSrc ; fm_pathToDir )
fapys aime ça

Partager ce message


Lien à poster
Partager sur d’autres sites

31 réponses à cette question

  • 0

*** Extraire le texte d'un document PDF. *** (non protégé)

Retourne l'intégralité textuelle d'un document PDF. Méthode 1.

/** * PDF_ReadContents1( fm_filePath ) 
    * by clem 2011-02-02 
    * v1 
    * Retourne dans un champ fmp le texte d'un document PDF. 
    * * === Parameters === 
    * fm_filePath : String - Chemin valide vers un document PDF.
 **/
import java.io.IOException
import com.itextpdf.text.pdf.PdfReader
import com.itextpdf.text.pdf.parser.PdfTextExtractor

if( fm_filePath == null ){ throw new Exception("File path required !")}
if (new File( fm_filePath ).exists()){
    try{
        reader = new PdfReader(fm_filePath)
        sb = new StringBuffer()
        for (int i = 1; i <= reader.numberOfPages; i++) {
            sb.append PdfTextExtractor.getTextFromPage(reader, i)
        }
        return sb
    } catch (IOException e) {
        e.printStackTrace()
        return "IO ERROR."
    } catch (Exception e) {
        e.printStackTrace()
        return "ERROR."
    }
}
 

Retourne l'intégralité textuelle d'un document PDF (sans les numéros de page et autres annotations). Méthode 2.

/** * PDF_ReadContents2( fm_filePath ) 
    * by clem 2011-02-02 
    * v1 
    * Retourne dans un champ fmp le texte d'un document PDF. 
    * 
    * === Parameters === 
    * fm_filePath : String - Chemin valide vers un document PDF.
**/

import com.itextpdf.text.pdf.PdfReader
import com.itextpdf.text.pdf.parser.PdfReaderContentParser
import com.itextpdf.text.pdf.parser.LocationTextExtractionStrategy
import com.itextpdf.text.pdf.parser.TextExtractionStrategy
if( fm_filePath == null ){ throw new Exception("File path required !")}
if (new File( fm_filePath ).exists()){  
    try{    reader = new PdfReader(fm_filePath)    
        parser = new PdfReaderContentParser(reader);    
        sb = new StringBuffer()    
        def TextExtractionStrategy strategy    
        for (int i = 1; i <= reader.numberOfPages; i++) {      
            strategy = parser.processContent(i, new LocationTextExtractionStrategy())      
            sb.append(strategy.resultantText)    
        }    
        return sb  
    } catch (IOException e) {    
        e.printStackTrace()  
    } catch (Exception e) {    
        e.printStackTrace()  
    }
}
 

Retourne l'intégralité textuelle d'une page donnée d'un document PDF.

/** * PDF_ReadPage( fm_filePath ; fm_pageNumber ) 
    * by clem 2011-02-02 
    * v1 
    * Retourne dans un champ fmp le texte d'une page d'un document PDF. 
    * 
    * === Parameters === 
    * fm_filePath : String - Chemin valide vers un document PDF. 
    * fm_pageNumber : Integer
**/

import java.io.IOException
import com.itextpdf.text.pdf.PdfReader
import com.itextpdf.text.pdf.parser.PdfTextExtractor

if( fm_filePath == null || fm_pageNumber == null){ throw new Exception("Missing arguments !")}
if (new File( fm_filePath ).exists()){  
    try{    r = new PdfReader(fm_filePath)    
        n = Integer.valueOf(fm_pageNumber)    
        if ( n > 0 && n <= r.numberOfPages){      
            return PdfTextExtractor.getTextFromPage(r, n)    
        } else {      
            return "Page number out of range."    
        }  
    } catch (IOException e) {    
        e.printStackTrace()    
        return "IO ERROR"  
    } catch (Exception e) {    
        e.printStackTrace()    
        return "ERROR"  
    }
}
 

clem

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

*** Extraire les images d'un document PDF. *** (non protégé)

/** * PDF_ExtractPictures ( fm_filePath ; fm_destDirPath ; fm_pictPrefix ) * by clem 2011-02-04 * v1 * Extrait vers un dossier les images contenues dans un document PDF  * * === Parameters === * fm_filePath: chemin du document PDF. * fm_destDirPath: chemin du dossier d'acquisition des images. * fm_pictPrefix: prefixe attribué à chaque image extraite (ex: "IMG_")**/import com.itextpdf.text.pdf.PdfNameimport com.itextpdf.text.pdf.PdfReaderimport com.itextpdf.text.pdf.parser.PdfReaderContentParserimport com.itextpdf.text.pdf.parser.ImageRenderInfoimport com.itextpdf.text.pdf.parser.PdfImageObjectimport com.itextpdf.text.pdf.parser.RenderListenerimport com.itextpdf.text.pdf.parser.TextRenderInfoimport java.io.FileOutputStreamimport java.io.IOExceptionimport java.awt.image.BufferedImageimport javax.imageio.ImageIOif ( fm_filePath == null || fm_destDirPath == null || fm_pictPrefix == null ){ throw new Exception("Missing args !")}if (new File(fm_filePath).exists()){  sep = System.getProperty("file.separator")  if (!fm_destDirPath.endsWith(sep)) fm_destDirPath += sep  pictPath = fm_destDirPath + fm_pictPrefix + "%s.%s"  reader = new PdfReader(fm_filePath)  parser = new PdfReaderContentParser(reader);  listener = new MyImageRenderListener(pictPath);  for (int i = 1; i <= reader.getNumberOfPages(); i++) {    parser.processContent(i, listener)  }}class MyImageRenderListener implements RenderListener{  protected String path = ""  MyImageRenderListener(String path) {    this.path = path  }  void renderImage(ImageRenderInfo renderInfo) {    try {      String filename      FileOutputStream os      PdfImageObject image = renderInfo.getImage()      PdfName filter = (PdfName)image.get(PdfName.FILTER)      if (PdfName.DCTDECODE.equals(filter)) {        filename = String.format(path, renderInfo.getRef().getNumber(), "jpg")        os = new FileOutputStream(filename)        os.write image.getStreamBytes()        os.flush()        os.close()      } else      if (PdfName.JPXDECODE.equals(filter)) {        filename = String.format(path, renderInfo.getRef().getNumber(), "jp2")        os = new FileOutputStream(filename)        os.write image.getStreamBytes()        os.flush()        os.close()      } else      if (PdfName.JBIG2DECODE.equals(filter)) {        // ignore: filter not supported.      } else {        BufferedImage awtimage = renderInfo.image.getBufferedImage()        if (awtimage != null) {          filename = String.format(path, renderInfo.getRef().getNumber(), "png")          ImageIO.write(awtimage, "png", new FileOutputStream(filename))        }      }    } catch (IOException e) {      e.printStackTrace()    }  }  void beginTextBlock() {}  void endTextBlock() {}  void renderText(TextRenderInfo renderInfo) {}}

clem

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

*** Fusionne une liste de documents PDF (non protégés) en un document PDF final. ***
tout en respectant l'orientation de chacune des pages.

 

/*** PDF_Merge( fm_filePathList ; fm_filePathOut )
    * by clem 2011-02-02
    * v1
    * Fusionne une liste de documents PDF en un document PDF final.
    *
    * === Parameters ===
    * fm_filePathList: Une liste de chemins à des documents PDF.
    * fm_filePathOut: Le chemin de sortie du document PDF final.
**/
import com.itextpdf.text.Document
import com.itextpdf.text.pdf.PdfReader
import com.itextpdf.text.pdf.PdfCopy
import com.itextpdf.text.pdf.PdfImportedPage

try {
  String[] inFiles = fm_filePathList.tokenize("\n")
  String outFile = fm_filePathOut
  int f = 0
  int pageOffset = 0
  Document document = null
  PdfCopy writer = null

  while (f < inFiles.length) {
    // Create a reader for the next document
    PdfReader reader = new PdfReader(inFiles[f])
    reader.consolidateNamedDestinations()

    // Retrieve the total number of pages
    int n = reader.numberOfPages

    pageOffset += n

    // Create the master document
    if (f == 0) {
      // step 1: Create the document-object
      document = new Document(reader.getPageSizeWithRotation(1))
      // step 2: Create the writer that listens to the document
      writer = new PdfCopy(document, new FileOutputStream(outFile))
      // step 3: Open the document
      document.open()
    }
    // step 4: Add content
    PdfImportedPage page;
    for (int i = 0; i < n; ) {
      ++i
      page = writer.getImportedPage(reader, i)
      writer.addPage(page)
    }
  }
  document.close()
  return 1
} catch (IOException ioe) {
    return ("Error: $ioe.message")
}

clem

 

autre version (plus performante) ici

 

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

Bonjour,

Un grand paquet de remerciements pour cet outil qui vient de tomber en même temps que le besoin chez moi (extraction images)! Même avec le glisser-déposer du Mac je me voyais parti pour une galère ! Cela fonctionne +++ (comme d'hab quand je ne mélange pas les chemins ;) )

Noël

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

Super boulot (auquel je ne comprends pas grand chose ;) ) mais qui servira, c'est sur

Merci Clem

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

Bonjour Clem

J'ai essayé, et si j'ai parfois eu des résultats sans problème, j'ai aussi eu des soucis sur d'autres fichiers.

Si certains fichiers sont entièrement lus et recopiés. D'autres sont interrompus. J'imagine que la mise en page avec des colonnes doit perturber la lecture... Que les entêtes et pieds de page ne sont pas forcément pris en compte?

Il y a certainement des améliorations à trouver pour que ça marche à 100 % ou à un taux s'en rapprochant.

J'ai eu le même problème sur les fichiers .doc dont les zones de texte ne se lisent pas. Mais là c'est identifié...il s'agit des zones de texte.

Si on avait la solution pour les intégrer ce serait formidable.

Cordialement,

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

Joie bonheur, je viens de découvrir ScriptMaster (mieux vaut tard que jamais)

La combinaison de l'usage de ma machine http://www.cogestar.fr/boutique/catalog/product_info.php?products_id=33 , de ReadIris 12 puis de ScriptMaster avec tes fonctions donne un résultat tout simplement merveilleux ! Merci

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

Je suis content que tu aies (enfin) rencontré ScriptMaster. Apparemment la session d'Andries a été un déclencheur.

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

Oui, comme Bernadette Soubirou voyant la vierge !

Il me semblait qu'il y avait un filon mais il a fallut Andries, tes compléments et ceux de Vincent pour que je plonge et me rende compte que j'étais passé à coté de qq chose d'enorme... Qui plus est comme certains modules fonctionnent en IWP... Il faut que je refasse ma session :-)

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

Bonjour et excusez moi de délaisser le forum en ce moment mais là, je dois avouer que je vous envie !!

Le programme de la Conference FileMaker était particulièrement alléchant cet année et ce sujet sur Scriptmaster m'aurait bien plu.

Mais bon je n'ai pas pu me libérer et récemment Clem m'a incité à remettre l'ouvrage sur le métier à propos de Groovy ( que je croyais faussement être du java !).

Je vous livre donc une petite fonction qui manque à Filemaker.

La fonction substRegex (texte,regex,remplacement)

texte = le texte que vous voulez transformer.

regex : l'expression régulière que vous voulez rechercher

remplacement : ce qui va remplacer l'expression régulière trouvée.

D'accord je ne me suis pas foulé, il n'y a que quelques lignes de codes mais il s'agit d'un clin d'oeil en attendant cette fonction dans FM12 évidemment.:siffle:

Il suffit d'avoir le plug in scriptmaster et la fonction devrait fonctionner, elle se charge à l'aide d'une variable par le script d'introduction.

A bientôt

Philippe

Fonctionregex.fp7

Fonctionregex.fp7

Fonctionregex.fp7

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

Un exemple comme celui-ci permet d'appréhender ScriptMaster et de voir groovy dans son plus simple appareil.

Je conseil même à ceux qui souhaitent découvrir ScriptMaster de pose le plug-in et de commencer par cet exemple :-)

Merci Philippe.

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

*** Crée une copie d'un document PDF en y ajoutant des Métadonnées. ***


/**
* iText_MetadataAdd ( fm_pathToSrc ; fm_pathToDest ; fm_title ; fm_author ; fm_subjet ; fm_keywords ; fm_creator )
* 2012-02-13 by clem
* v1.2
* Crée un doc PDF auquel sont ajoutées des métadonnées à celles existant dans le document original .
*
* === Parameters ===
* fm_pathToSrc: Le chemin du document PDF original.
* fm_pathToDest: Le chemin du document PDF modifié.
* fm_title; fm_author; fm_subjet; fm_keywords; fm_creator: les métadonnées à ajouter aux entrées existantes ou non.
**/

// ================================================================

import com.itextpdf.text.pdf.PdfReader
import com.itextpdf.text.pdf.PdfStamper
import com.itextpdf.text.DocumentException

def metaKeys = ["Title", "Author", "Subject", "Keywords", "Creator" ]
def metaValues = [fm_title, fm_author, fm_subjet, fm_keywords, fm_creator]

reader = new PdfReader(fm_pathToSrc)
stamper = new PdfStamper(reader, new FileOutputStream(fm_pathToDest))

try{
// Get the metadata hashmap of the pdf document "info" dictionary.
info = reader.info

// iterate thru metadata keys.
metaKeys.eachWithIndex{it, int i ->
thisExistingValue = info.get(it)
myAddedValue = (metaValues[i] == null) ? "" : metaValues[i]
info.putAt it, ((thisExistingValue != null && myAddedValue != "" ) ?
thisExistingValue + "|" + myAddedValue :
(thisExistingValue != null) ?
thisExistingValue + myAddedValue :
myAddedValue
)
}

stamper.moreInfo = info
stamper.close()
return true

} catch (DocumentException de) {
return de.message
} catch (IOException ioe){
return ioe.message
} finally {
if(stamper != null) {
try {
stamper.close();
stamper = null;
} catch(IOException ioEx) {
// Nothing to do here
}
}
}
[/code]

Note: Concernant les entrées de métadonnées "Producer", "CreationDate" et "ModDate" ...

Ces trois entrées sont remplies automatiquement par iText et ne sont donc pas modifiables.

En manipulant un fichier PDF avec PdfStamper, la date de modification est automatiquement changée. Il en va de même pour le producteur du document.

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

Bonjour à tous, et en particulier à Clem !

J'avais en son temps apprécié le script consacré à l'extraction d'images ; je suis revenu sur ce fil car il y avait des scripts visant à traiter le texte.

J'ai justement besoin d'extraire des données d'un fichier consistant presque uniquement en un tableau ; j'ai ainsi constaté que le script récupère le texte ligne à ligne ce qui crée des décalages lorsque la cellule en contient plusieurs ; ainsi Commune de / naissance qui en créera 3 si a été inscrit

PARIS 19E

ARRONDISSEM

ENT

. Il en irait de même pour un élève nommé DELABRISE-LAMBARDENET... etc...

L'idéal serai de savoir lire les cellules et seul ceux qui pratiquent iText dans le texte sauront m’éclairer !

Cordialement

Noël

Je joins un exemple de pdf et du txt extrait

PDF_INE.txt

PDF_INE.pdf

PDF_INE.txt

PDF_INE.pdf

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

Bonjour,

 

je n'arrive pas  à comprendre le fonctionnement  du plugin script master pour extraire les données d'un pdf, existe'il un fichier de démo qui fonctionne avec l'extraction du texte d'un pdf.

 

Merci d'avance,

fapys

 

Je ne comprend déjà pas ou coller les scripts de clem  -_-

Extraire le texte d'un document PDF.

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

Bonjour,

 

J'ai enfin compris et j'ai laissé un exemple ci-dessous pur extraire le texte d'un pdf, cela pourra peut être aider des personne ayant la même compétence que moi  :w00t: .

 

Par contre je n'arrive pas à faire fonctionner l'exemple sans que ScriptMaster.fmp12 soit lancé, peut être que cela n'est pas possible? ou bien existe il une solution?

 

Merci,

fapys

 

Lien du fichier ScriptMaster.fmp12 - Trop gros pour être sur le forum

 

idem pour le fichier d'exemple--> extractionpdf.fmp12

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

bonsoir

 

Par contre je n'arrive pas à faire fonctionner l'exemple sans
que ScriptMaster.fmp12 soit lancé, peut être que cela n'est pas
possible? ou bien existe il une solution?

 oui en chargeant le jar avant d'enregistrer la fonction

voir le fichier exemple ici

Tag : PDFPDF

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

*** Fusionne une liste de documents PDF (non protégés) en un document PDF final. ***

… une version plus ~smart~ que la précédente …

 

 

iText_ConcatenatePDF ( fm_fileList ; fm_outputPath ; fm_setCompression )

// iText_ConcatenatePDF ( fm_fileList ; fm_outputPath ; fm_setCompression )
// 20150130 Clem
// v1.0
// Concatène une liste de documents pdf.
//
// ***** PARAMETERS *****
// fm_fileList			: Une liste de chemins menant à des documents PDF.
// fm_outputPath		: Le chemin de sortie du document final.
// fm_setCompression    : Active la compression du flux de données. Valeurs acceptées :
//                        Pour activer la compression    : 1, TRUE, true, True, "1", "true", "TRUE".
//				          Pour désactiver la compression : toute autre valeur y compris "". 
// Remarque: Activer la compression génèrera automatiquement un PDF de version 1.5 //
// ***** DEPENDENCIES ***** // iText.jar // http://sourceforge.net/projects/itext/files/iText//// ********************************************************************************************************************

import com.itextpdf.text.Document
import com.itextpdf.text.pdf.PdfReader
import com.itextpdf.text.pdf.PdfSmartCopy
import com.itextpdf.text.pdf.PdfWriter

try {
    def fileArray = fm_fileList.tokenize("\n")
    if (fileArray.empty) throw new Exception("Empty file list.")

    // check for pdf document
    fileArray.each {
        f =  new File(it)
        if ( ! (f.exists() && f.getName().toLowerCase().endsWith(".pdf"))) throw new IOException ("File \"${f}\" not found as file or resource or is not a PDF document.")
    }

    // compression
    try {
        setCompression = fm_setCompression.toBoolean()
    } catch (Exception e) {
        setCompression = false
    }

    // merge pdf documents
    try {
        // Document implements DocListener, IAccessibleElement
        new Document().with { doc ->
            // PdfSmartCopy extends PdfCopy extends PdfWriter extends DocWriter implements PdfViewerPreferences, PdfEncryptionSettings, PdfVersion, PdfDocumentActions, PdfPageActions, PdfRunDirection, PdfAnnotations
            copy = new PdfSmartCopy(doc, new FileOutputStream(fm_outputPath))

            if ( setCompression) {
                // PdfWriter extends DocWriter implements PdfViewerPreferences, PdfEncryptionSettings, PdfVersion, PdfDocumentActions, PdfPageActions, PdfRunDirection, PdfAnnotations
                copy.pdfVersion = PdfWriter.VERSION_1_7
                copy.setFullCompression() // throws DocumentException
            }
            open() // Document
            fileArray.each { f ->
                new PdfReader(f).with {
                    for (page in 1..getNumberOfPages()) {
                        copy.addPage(copy.getImportedPage(it, page))
                    }
                    copy.freeReader(it) // throws IOException
                    close() // PdfReader close
                }
            }
            //copy.close() // PdfCopy close
            close() // Document close
        }
        return 1
    } catch (Exception e){
        return("ERROR: $e.message")
    } finally{
        copy.close()
    }
} catch (Exception e) {
    return ("ERROR: $e.message")
}

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

Bonjour Clément,

 

Merci pour cette fonction.

 

Tu le savais déjà probablement qu'il était possible de faire ainsi, mais j'utilise le Base64 de Filemaker pour transiger de / vers ce dernier. Cela me permet d'offrir à l'utilisateur une expérience plus "seamless" (dans mon cas, bien entendu). J'utilise les fonctions ci-dessous pour fusionner deux PDF (pas une liste, ce qui est ton cas).

 

Bonne journée !

   static private PdfReader getReader ( String strB64PDF ) throws IOException {        InputStream is = new ByteArrayInputStream(Base64.decode(strB64PDF));        PdfReader result = new PdfReader(is);        return result;    }
   static public String AddPDF ( String b64_pdfA, String b64_pdfB) throws IOException, DocumentException {                // Get the Readers for both PDFs        PdfReader reader_pdfA = getReader(b64_pdfA);        PdfReader reader_pdfB = getReader(b64_pdfB);                // the final result to convert back to Base64        ByteArrayOutputStream osResult = new ByteArrayOutputStream();                // Get a new PDF writer        Document document = new Document();        PdfWriter writer = PdfWriter.getInstance(document, osResult);        document.open();        PdfContentByte cb = writer.getDirectContent();              PdfImportedPage page;        Rectangle rect = new Rectangle(0, 0);                for (int i = 1; i <= reader_pdfA.getNumberOfPages(); i++) {            page = writer.getImportedPage(reader_pdfA, i);            document.setPageSize(reader_pdfA.getPageSize(i));            document.newPage();            cb.addTemplate(page, 0, 0);        }                for (int i = 1; i <= reader_pdfB.getNumberOfPages(); i++) {            page = writer.getImportedPage(reader_pdfB, i);            document.setPageSize(reader_pdfB.getPageSize(i));            document.newPage();            cb.addTemplate(page, 0, 0);        }        document.close();         String strResult = Base64.encodeBytes(osResult.toByteArray());        return strResult;    }

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

Salut Clément,

 

j'utilisais déjà ta fonction de fusion, je vais donc voir ce qui change et la mettre à jour, merci !

 

J'en profite en passant, au cas où : tu as un truc équivalent pour séparer (enregistrer en fichiers distincts) un PDF page par page ?

Sinon je fouillerai et j'essayerai de le faire moi-même, mais bon, tu fais ça si bien... :siffle:B):lol::hello:

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

Salut Laurent,

… Da hesch !!! ( N'a strictement rien à voir avec une sombre organisation terroriste… mais ce prononce pareil. Peut se traduire par "Et voilà !"  :) )

// iText_SplitPDF ( fm_pathToSrc ; fm_pathToDir )
// 2015-02-02 by clem
// v.2
// Scinde un document PDF en autant de pages individuelles. Le nom du document original est préservé suivi du numéro de page.
//
// ***** DEPENDENCIES ***** 
// iText.jar // http://sourceforge.net/projects/itext/files/iText
//
// ***** PARAMETERS *****
// fm_pathToSrc			: Un chemin valide au document PDF à "splitter".
// fm_pathToDir			: Un chemin valide au dossier de destination.
//
// ***************************************************************************************************
import com.itextpdf.text.Document
import com.itextpdf.text.DocumentException
import com.itextpdf.text.pdf.PdfReader
import com.itextpdf.text.pdf.PdfSmartCopy

// v.2  2015.02.02
try {
    f = new File(fm_pathToSrc)
    def fname = f.name
    fname = fname.lastIndexOf('.').with { it != -1 ? fname[0..<it] : fname }

    d = new File(fm_pathToDir)
    if (!d.exists()) throw new IOException("Target directory not found.")
    s = d.separator
    dirPath = s + fm_pathToDir.tokenize(s).join(s) + s

    new PdfReader(fm_pathToSrc).with { reader ->
        def n = numberOfPages
        n.times {
            new Document().with { doc ->
                def copy = new PdfSmartCopy(doc, new FileOutputStream(String.format(dirPath + fname + "_p%d.pdf", it + 1)))
                open()
                copy.addPage copy.getImportedPage(reader, it + 1)
                close() // document
            }
        }
        close() //reader
    }

    return 1 // SUCCESS

} catch (IOException ioe){
    return "ERROR (I/O) : $ioe.message"
} catch (DocumentException de){
    return "ERROR (DocException) : $de.message"
} catch (Exception e) {
    return "ERROR: $e.message"
}

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

Formidable ! :)

Merci vielmols ! (n'a rien à voir avec autre chose, et de toute façon ne se prononce pas pareil... :D )

fabriceN aime ça

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

 

Bonjour Clément,

 

Merci pour cette fonction.

 

Tu le savais déjà probablement qu'il était possible de faire ainsi, mais j'utilise le Base64 de Filemaker pour transiger de / vers ce dernier. Cela me permet d'offrir à l'utilisateur une expérience plus "seamless" (dans mon cas, bien entendu). J'utilise les fonctions ci-dessous pour fusionner deux PDF (pas une liste, ce qui est ton cas).

 

Bonne journée !

   static private PdfReader getReader ( String strB64PDF ) throws IOException {        InputStream is = new ByteArrayInputStream(Base64.decode(strB64PDF));        PdfReader result = new PdfReader(is);        return result;    }
   static public String AddPDF ( String b64_pdfA, String b64_pdfB) throws IOException, DocumentException {                // Get the Readers for both PDFs        PdfReader reader_pdfA = getReader(b64_pdfA);        PdfReader reader_pdfB = getReader(b64_pdfB);                // the final result to convert back to Base64        ByteArrayOutputStream osResult = new ByteArrayOutputStream();                // Get a new PDF writer        Document document = new Document();        PdfWriter writer = PdfWriter.getInstance(document, osResult);        document.open();        PdfContentByte cb = writer.getDirectContent();              PdfImportedPage page;        Rectangle rect = new Rectangle(0, 0);                for (int i = 1; i <= reader_pdfA.getNumberOfPages(); i++) {            page = writer.getImportedPage(reader_pdfA, i);            document.setPageSize(reader_pdfA.getPageSize(i));            document.newPage();            cb.addTemplate(page, 0, 0);        }                for (int i = 1; i <= reader_pdfB.getNumberOfPages(); i++) {            page = writer.getImportedPage(reader_pdfB, i);            document.setPageSize(reader_pdfB.getPageSize(i));            document.newPage();            cb.addTemplate(page, 0, 0);        }        document.close();         String strResult = Base64.encodeBytes(osResult.toByteArray());        return strResult;    }

 

Bonjour Steve, joli code!!!

Peux-tu me dire comment tu l'intègres à Filemaker? C'est un Script Java/Groovy?

 

En effet, si ce dernier ne nécessite pas ScriptMaster, il peut être utilisé avec FM Go et donc les Tablettes :-)

 

Merci par avance, Julien

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

Bonjour Julien,

 

cela nécessite ScriptMaster bien entendu, donc malheureusement pas de iOS.

 

Il faut compiler ce code dans une librairie JAR (avec NetBeans ou Eclipse) pour ensuite appeler les fonctions avec ScriptMaster.

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

Bonjour,

J'utilise le script de Clem iText_ConcatenatePDF .

Avec scriptmaster 4.32, c'est nickel, avec la 4.42, ca fait une erreur systématique, "ERROR: the document has no pages".

Des retours ok avec la 4.42 ?

 

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

Bonjour

Pas de réponse, je tente donc un nouveau post... Et avant ça je me dis aide-toi le ciel t'aidera...

J'ai donc essayé de debugger en recopiant le contenu du script dans le fichier FMP de Scriptmaster, histoire d'éviter les problème pouvant survenir de RegisterGroovy, voir fichier joint et capture d'écran.

58e38c78ea14e_ScriptMasterPDFMerge.thumb.png.b085eea8133b554c0ad7366be9790d19.png

-> je reproduis la même erreur qu'avec ma fonction enregistrée : ERROR the document has no pages

-> En différenciant les retours des traitements d'exception, je constate que c'est le deuxième qui "attrape" l'exception, mais bon ca ne m'apprend pas grand chose.

-> En ajoutant des traces de sortie dans un fichier texte, je constate que le problème se produit quelque part dans l'instruction new PdfReader(f).with { ... } car je n'ai que "text1" dans mon fichier de log, mais bon je ne suis même pas certain que ces traces ne modifient pas le comportement du script... Et de même je ne sais pas vraiment quoi faire de cette information, mes connaissances arrivant très vite à leur limite en groovy.

-> J'ai essayé avec les syntaxes C:\Users\Olivier\Desktop/1.pdf et C:/Users/Olivier/Desktop/1.pdf, même résultat...

En gros si quelqu'un peut juste télécharger le fichier, lancer le script et me dire s'il obtient la même erreur que moi ca m'avancerait déjà un peu...

J'ai essayé sur du Windows 10 et du Windows Server 2008, même retour.

Merci d'avance si certains peuvent essayer...

Pour télécharger le fichier fmp12 : http://www.mdpqualite.fr/telechargement/ScriptMaster_PDF_Concat.zip

Olivier

Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !


Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.


Connectez-vous maintenant

  • En ligne récemment   0 membre est en ligne

    Aucun utilisateur enregistré regarde cette page.