Application qui compare deux fichiers pdf

Fermé
clotidina Messages postés 8 Date d'inscription lundi 5 mai 2014 Statut Membre Dernière intervention 5 juin 2014 - 5 mai 2014 à 11:11
clotidina Messages postés 8 Date d'inscription lundi 5 mai 2014 Statut Membre Dernière intervention 5 juin 2014 - 15 mai 2014 à 17:14
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

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
5 mai 2014 à 20:23
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
clotidina Messages postés 8 Date d'inscription lundi 5 mai 2014 Statut Membre Dernière intervention 5 juin 2014
12 mai 2014 à 14:01
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;
}

}
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
12 mai 2014 à 18:30
Qu'est ce que tu voudrais mettre dans le troisième pdf ? Si c'est une modification de l'un des deux premiers ça paraît compliqué. Si par contre c'est un nouveau fichier - avec juste le contenu des Delta par exemple - tu peux utiliser une autre bibliothèque qui fera l'écriture d'un fichier pdf.
0
clotidina Messages postés 8 Date d'inscription lundi 5 mai 2014 Statut Membre Dernière intervention 5 juin 2014
12 mai 2014 à 20:21
oui c'est pour mettre le résultat de la comparaison
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
12 mai 2014 à 20:30
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.
0
clotidina Messages postés 8 Date d'inscription lundi 5 mai 2014 Statut Membre Dernière intervention 5 juin 2014
12 mai 2014 à 20:42
d'accord merci c gentil :)
0
clotidina Messages postés 8 Date d'inscription lundi 5 mai 2014 Statut Membre Dernière intervention 5 juin 2014
Modifié par clotidina le 13/05/2014 à 14:28
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();


}

}
0