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
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
A voir également:
- Comment ouvrir un fichier websitenew ?
- Comment ouvrir un fichier epub ? - Guide
- Comment ouvrir un fichier docx ? - Guide
- Ouvrir fichier .bin - Guide
- Fichier rar - Guide
- Comment ouvrir un fichier dat - Guide
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
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à...
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à...
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
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;
}
}
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;
}
}
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
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.
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
12 mai 2014 à 20:21
oui c'est pour mettre le résultat de la comparaison
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
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.
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.
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
12 mai 2014 à 20:42
d'accord merci c gentil :)
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
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();
}
}
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();
}
}