Application qui compare deux fichiers pdf

[Fermé]
Signaler
Messages postés
8
Date d'inscription
lundi 5 mai 2014
Statut
Membre
Dernière intervention
5 juin 2014
-
Messages postés
8
Date d'inscription
lundi 5 mai 2014
Statut
Membre
Dernière intervention
5 juin 2014
-
Bonjour,
dans le cadre de mon stage, je dois fournir un outil a mon responsable, qui compare deux fichiers pdf et affiche la modification apporté à l'ancienne version dans un autre fichier, je ne sais pas comment commencer surtout que je ne suis pas à l'aise avec le JAVA.
Merci pour vos aide :)
A voir également:

2 réponses

Messages postés
16400
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
21 septembre 2021
2 878
Bonsoir,

Le format PDF n'est pas le plus facile, en particulier parce qu'il peut être utilisé un peu pour tout et n'importe quoi (texte, images, etc.)

"affiche la modification apporté à l'ancienne version dans un autre fichier"
La notion de modification d'un fichier PDF est assez floue, car la plupart des PDF sont générés à partir d'outils tiers (Word par exemple) et que la modification du fichier source (Word) va générer deux fichiers PDF distincts qui ne seront pas la modification l'un de l'autre.

Il faudrait voir quel est le cadre exact de ton projet, mais je pense que le plus pertinent serait de comparer le contenu texte du fichier (parce que les images, la mise en forme, etc. ça paraît délicat et pas forcément utile)

Dans ce cas il faut ouvrir le PDF et en extraire le texte, avec une bibliothèque comme PDFTextStream par exemple. Reste alors à comparer le texte de deux fichiers avec une bibliothèque comme java-diff-utils par exemple.
Tu mélanges le tout pour que ça aille bien ensemble et voilà...
2
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 42674 internautes nous ont dit merci ce mois-ci

Messages postés
8
Date d'inscription
lundi 5 mai 2014
Statut
Membre
Dernière intervention
5 juin 2014

salut,
j'ai utilisé les tutos que tu m'a envoyé, c'est très utiles merci donc j'ai fait c'est deux code compare les deux fichier pdf et qui m'affiche le resultalt en console, comment je fais si je veux enregister le resultat dans autre fichier pdf ????
import java.io.IOException;

import java.util.List;

import com.snowtide.pdf.OutputTarget;
import com.snowtide.pdf.PDFTextStream;

import difflib.Chunk;

public class ExtractTextAllPages {

public static <File> void main (String[] args) throws IOException {
String pdfFilePath = "D://test.pdf";
PDFTextStream pdfts = new PDFTextStream(pdfFilePath);
StringBuilder text = new StringBuilder(1024);

pdfts.pipe(new OutputTarget(text));
pdfts.close();


String pdfFilePath2 = "D://test2.pdf";
PDFTextStream pdfts2 = new PDFTextStream(pdfFilePath2);
StringBuilder text2 = new StringBuilder(1024);

pdfts2.pipe(new OutputTarget(text2));
pdfts2.close();

FileComparator fileComparator=new FileComparator(text, text2);

final List<Chunk> changesFromOriginal = fileComparator.getChangesFromOriginal();

for(int i=0;i<changesFromOriginal.size();i++)
System.out.println(changesFromOriginal.get(i).toString());


}

}

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
import difflib.Chunk;
import difflib.Delta;
import difflib.DiffUtils;
import difflib.Patch;

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

public class FileComparator {

private final StringBuilder original;

private final StringBuilder revised;

public FileComparator(StringBuilder original, StringBuilder revised) {
this.original = original;
this.revised = revised;
}

public List<Chunk> getChangesFromOriginal() throws IOException {
return getChunksByType(Delta.TYPE.CHANGE);
}

public List<Chunk> getInsertsFromOriginal() throws IOException {
return getChunksByType(Delta.TYPE.INSERT);
}

public List<Chunk> getDeletesFromOriginal() throws IOException {
return getChunksByType(Delta.TYPE.DELETE);
}

private List<Chunk> getChunksByType(Delta.TYPE type) throws IOException {
final List<Chunk> listOfChanges = new ArrayList<Chunk>();
final List<Delta> deltas = getDeltas();
for (Delta delta : deltas) {
if (delta.getType() == type) {
listOfChanges.add(delta.getRevised());
}
}
return listOfChanges;
}

private List<Delta> getDeltas() throws IOException {

final List<String> originalFileLines = fileToLines(original);
final List<String> revisedFileLines = fileToLines(revised);

final Patch patch = DiffUtils.diff(originalFileLines, revisedFileLines);

return patch.getDeltas();
}

private List<String> fileToLines(StringBuilder file) throws IOException {
final List<String> lines = new ArrayList<String>();
String line="";

for(int i=0;i<file.length();i++)
{
if(file.charAt(i)=='\n')
{
lines.add(line);
line="";
}
else
line+=file.charAt(i);
}
lines.add(line);

return lines;
}

}
Messages postés
16400
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
21 septembre 2021
2 878
Du coup il n'y aura pas beaucoup de mise en forme et une bibliothèque basique suffira.

En voici quelques unes : https://java-source.net/open-source/pdf-libraries
Je n'en connais aucune, donc je ne sais pas trop laquelle te conseiller.

Idéalement, tu peux peut-être chercher une bibliothèque qui permet aussi de lire les pdf, et ainsi remplacer PDFTextStream (qui ne faisait que la lecture) par une autre qui fait lecture et écriture.
Messages postés
8
Date d'inscription
lundi 5 mai 2014
Statut
Membre
Dernière intervention
5 juin 2014

d'accord merci c gentil :)
Messages postés
8
Date d'inscription
lundi 5 mai 2014
Statut
Membre
Dernière intervention
5 juin 2014

j'ai un autre probleme c'est que je dois récupérer le contenu de ce site et le mettre dans fichier et l'enregistrer sur la machine j'ai essayer avec pdf c marche mais avec .jsp c marche pas, je sais pas si tu as une idée

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URL;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.util.List;

import com.snowtide.pdf.OutputTarget;
import com.snowtide.pdf.PDFTextStream;

import difflib.Chunk;

public class ExtractTextAllPages {

public static void main (String[] args) throws IOException {

System.setProperty("http.proxyHost", "172.20.0.9");
System.setProperty("http.proxyPort", "3128");

URL website = new URL("https://community.jalios.com/jcms/arw_73906/fr/accueil?jsp=plugins%2FJXPlugin%2Fjsp%2FpluginList.jsp");
ReadableByteChannel rbc = Channels.newChannel(website.openStream());
FileOutputStream fos = new FileOutputStream("D://download.pdf");
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);

String pdfFilePath = "D://download.pdf";
PDFTextStream pdfts = new PDFTextStream(pdfFilePath);
StringBuilder text = new StringBuilder(1024);

pdfts.pipe(new OutputTarget(text));
pdfts.close();


String pdfFilePath2 = "D://test2.pdf";
PDFTextStream pdfts2 = new PDFTextStream(pdfFilePath2);
StringBuilder text2 = new StringBuilder(1024);

pdfts2.pipe(new OutputTarget(text2));
pdfts2.close();

FileComparator fileComparator=new FileComparator(text, text2);

final List<Chunk> changesFromOriginal = fileComparator.getChangesFromOriginal();

PrintWriter out = new PrintWriter("D://Resultat.txt");
for(int i=0;i<changesFromOriginal.size();i++)
{
System.out.println(changesFromOriginal.get(i).toString());
out.println(changesFromOriginal.get(i).toString());
}

out.close();


}

}
Messages postés
16400
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
21 septembre 2021
2 878
Bonsoir,

Tu devrais juste adapter ta méthode
List<String> fileToLines
que tu avais défini pour la comparaison, pour qu'elle puisse prendre en paramètre un URL :

public static List<String> fileToLines(URL url) throws IOException
{
    List<String> list = new ArrayList<String>();
    Scanner sc = new Scanner(url.openStream());
    while (sc.hasNextLine())
        list.add(sc.nextLine());
    sc.close();
    return list;
}
Messages postés
8
Date d'inscription
lundi 5 mai 2014
Statut
Membre
Dernière intervention
5 juin 2014

salut, j'ai encore un probelem au niveau de cette application,
j'ai fais ce code il recuper le contenu du site ds un fichier download.html
moi j'ai mi un regex pattern pour recuperer le contenu a partir d'un div <div class="plugin-list">
et ensuite le stocket ds everything mais je sais pas comment parcourir le ficiher et comment a enregister a partir de ce div
public class ExtractTextAllPages {



public static void main (String[] args) throws IOException {

System.setProperty("http.proxyHost", "172.20.0.9");
System.setProperty("http.proxyPort", "3128");

String pathDownloadHTML = "D://download.html";

URL website = new URL("https://community.jalios.com/jcms/arw_73906/fr/accueil?jsp=plugins%2FJXPlugin%2Fjsp%2FpluginList.jsp");
ReadableByteChannel rbc = Channels.newChannel(website.openStream());
FileOutputStream fos = new FileOutputStream(pathDownloadHTML);
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);

File myFile = new File(pathDownloadHTML);
BufferedReader br = new BufferedReader(new FileReader(myFile));
try {
StringBuilder sb = new StringBuilder();
String line = br.readLine();
while (line != null) {
if(line="<div class=plugin-list>"){
sb.append(line);
sb.append(System.lineSeparator());
line = br.readLine();
}
String everything = sb.toString();

String pattern1 = "<div class=plugin-list>";
String pattern2 = "</table>";
String text = everything;

Pattern p = Pattern.compile(Pattern.quote(pattern1) + "(.*?)" + Pattern.quote(pattern2));
Matcher m = p.matcher(text);
while (m.find()) {
System.out.println(m.group(1));
}
}
} finally {
br.close();
}