IMPORTANT OutOfMemoryError !
Salut,
Voila mon code qui fusionne des pdf, sachant que des le nombre des fichier a fusionner est trés grand.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
|
public class Ms {
public static void main(String path ,int n) throws FileNotFoundException {
int t = 0;
String[] R = lister(path);
for (int i =0;i<R.length;i++){
R[i]=path.concat("\\"+R[i]);
}
List<InputStream> pdfs = new ArrayList<InputStream>();
int m =R.length;
do{
if (m<=5000){
for (int i =0;i<m;i++){
pdfs.add(new FileInputStream(R[t]));
t=t+1;
}
OutputStream output = new FileOutputStream(path+t+".pdf");
Ms.concatPDFs(pdfs, output, true);
System.out.println("fin traitement");
}
else{
for (int i =0;i<5000;i++){
pdfs.add(new FileInputStream(R[t]));
t=t+1;
}
OutputStream output = new FileOutputStream(path+t+".pdf");
Ms.concatPDFs(pdfs, output, true);
pdfs = new ArrayList<InputStream>();
m=m-5000;
System.out.println("fin traitement");
}
} while(t<R.length);
} |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| public static void concatPDFs(List<InputStream> streamOfPDFFiles,
OutputStream outputStream, boolean paginate) {
Document document = new Document();
try {
List<InputStream> pdfs = streamOfPDFFiles;
List<PdfReader> readers = new ArrayList<PdfReader>();
int totalPages = 0;
Iterator<InputStream> iteratorPDFs = pdfs.iterator();
// Create Readers for the pdfs
while (iteratorPDFs.hasNext()) {
InputStream pdf = iteratorPDFs.next();
PdfReader pdfReader = new PdfReader(pdf);
readers.add(pdfReader);
totalPages += pdfReader.getNumberOfPages();
}
// Create a writer for the outputstream
PdfWriter writer = PdfWriter.getInstance(document, outputStream);
document.open();
BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA,
BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
PdfContentByte cb = writer.getDirectContent(); // Holds the PDF
// data
PdfImportedPage page;
int currentPageNumber = 0;
int pageOfCurrentReaderPDF = 0;
Iterator<PdfReader> iteratorPDFReader = readers.iterator();
// Loop through the PDF files and add to the output.
while (iteratorPDFReader.hasNext()) {
PdfReader pdfReader = iteratorPDFReader.next();
// Creer new page
while (pageOfCurrentReaderPDF < pdfReader.getNumberOfPages()) {
document.newPage();
pageOfCurrentReaderPDF++;
currentPageNumber++;
page = writer.getImportedPage(pdfReader,
pageOfCurrentReaderPDF);
cb.addTemplate(page, 0, 0);
// Code pour pagination.
if (paginate) {
cb.beginText();
cb.setFontAndSize(bf, 9);
cb.showTextAligned(PdfContentByte.ALIGN_CENTER, ""
+ currentPageNumber + " of " + totalPages, 520,
5, 0);
cb.endText();
}
}
pageOfCurrentReaderPDF = 0;
}
document.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (document.isOpen())
document.close();
try {
if (outputStream != null)
outputStream.close();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
} |
l'orsque le dossier dont les fichiers doivent etre fusioner est de tres grande taille le programme affiche
Citation:
fin traitement
fin traitement
fin traitement
fin traitement
fin traitement
fin traitement
fin traitement
fin traitement
fin traitement
fin traitement
fin traitement
fin traitement
fin traitement
fin traitement
fin traitement
fin traitement
fin traitement
fin traitement
fin traitement
fin traitement
fin traitement
fin traitement
fin traitement
fin traitement
fin traitement
fin traitement
fin traitement
fin traitement
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Unknown Source)
at java.io.ByteArrayOutputStream.grow(Unknown Source)
at java.io.ByteArrayOutputStream.ensureCapacity(Unknown Source)
at java.io.ByteArrayOutputStream.write(Unknown Source)
at com.itextpdf.text.io.StreamUtil.inputStreamToArray(StreamUtil.java:74)
at com.itextpdf.text.io.RandomAccessSourceFactory.createSource(RandomAccessSourceFactory.java:146)
at com.itextpdf.text.pdf.PdfReader.<init>(PdfReader.java:350)
at com.itextpdf.text.pdf.PdfReader.<init>(PdfReader.java:370)
at test.Ms.concatPDFs(Ms.java:91)
at test.Ms.main(Ms.java:58)
at test.List.main(List.java:20)
Sachant que les variables Xms et Xmx sont au max.
aidez moi svp!!