Как правильно слить документы?

У меня возникает следующая проблема при печати PDF-файла после слияния, документы PDF обрезаются. Иногда это происходит потому, что документы не являются 8.5 x 11, они могут быть похожими на 11 x 17.

Можем ли мы определить размер страницы, а затем использовать тот же размер страницы для этих документов? Или, если нет, возможно ли это соответствовать странице?

Ниже приведен код:

package com.sumit.program; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import com.itextpdf.text.Document; import com.itextpdf.text.PageSize; import com.itextpdf.text.Rectangle; import com.itextpdf.text.pdf.BaseFont; import com.itextpdf.text.pdf.PdfContentByte; import com.itextpdf.text.pdf.PdfImportedPage; import com.itextpdf.text.pdf.PdfReader; import com.itextpdf.text.pdf.PdfWriter; public class MergePdf { public static void main(String[] args) { try { List pdfs = new ArrayList(); pdfs.add(new FileInputStream("C:\\Documents and Settings\\Sumit\\Desktop\\NewEcnProject\\Document1.pdf")); pdfs.add(new FileInputStream("C:\\Documents and Settings\\Sumit\\Desktop\\NewEcnProject\\Landscape.pdf")); OutputStream output = new FileOutputStream("C:\\Documents and Settings\\Sumit\\Desktop\\NewEcnProject\\merge1.pdf"); MergePdf.concatPDFs(pdfs, output, true); } catch (Exception e) { e.printStackTrace(); } } public static void concatPDFs(List streamOfPDFFiles, OutputStream outputStream, boolean paginate) { Document document = new Document(); try { List pdfs = streamOfPDFFiles; List readers = new ArrayList(); int totalPages = 0; Iterator iteratorPDFs = pdfs.iterator(); // Create Readers for the pdfs. int i=1; while (iteratorPDFs.hasNext()) { InputStream pdf = iteratorPDFs.next(); PdfReader pdfReader = new PdfReader(pdf); System.out.println("Page size is "+pdfReader.getPageSize(1)); readers.add(pdfReader); totalPages += pdfReader.getNumberOfPages(); i++; } // Create a writer for the outputstream PdfWriter writer = PdfWriter.getInstance(document, outputStream); writer.setCompressionLevel(9); 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 iteratorPDFReader = readers.iterator(); // Loop through the PDF files and add to the output. while (iteratorPDFReader.hasNext()) { PdfReader pdfReader = iteratorPDFReader.next(); // Create a new page in the target for each source page. System.out.println("No. of pages "+pdfReader.getNumberOfPages()); i=0; while (pageOfCurrentReaderPDF < pdfReader.getNumberOfPages()) { Rectangle r=pdfReader.getPageSize(pdfReader.getPageN(pageOfCurrentReaderPDF+1)); if(r.getWidth()==792.0 && r.getHeight()==612.0) document.setPageSize(PageSize.A4.rotate()); else document.setPageSize(PageSize.A4); document.newPage(); pageOfCurrentReaderPDF++; currentPageNumber++; i++; page = writer.getImportedPage(pdfReader, pageOfCurrentReaderPDF); System.out.println("Width is "+page.getWidth()); System.out.println("Height is "+page.getHeight()); cb.newlineText(); cb.addTemplate(page, 0, 0); // Code for pagination. if (paginate) { cb.beginText(); cb.setFontAndSize(bf, 9); cb.showTextAligned(PdfContentByte.ALIGN_CENTER, "" + currentPageNumber + " of " + totalPages, 520, 5, 0); cb.endText(); } } pageOfCurrentReaderPDF = 0; } outputStream.flush(); document.close(); outputStream.close(); System.out.println("Merging of Pdfs is done......."); } catch (Exception e) { e.printStackTrace(); } finally { if (document.isOpen()) document.close(); try { if (outputStream != null) outputStream.close(); } catch (IOException ioe) { ioe.printStackTrace(); } } } } 

введите описание изображения здесь

Использование classа Document и PdfWriter в сочетании с addTemplate() для объединения документов – плохая идея. Это не то, для чего addTemplate() метод addTemplate() . Вы явно или неявно определили размер страницы для Document , с которым работаете. С помощью addTemplate() вы добавляете экземпляры PdfImportedPage и

  • когда вы добавляете новую страницу с тем же размером страницы и ротацией, вы выбрасываете всю интерактивность, которая существует на этой странице, но в остальном все хорошо,
  • когда вы добавляете новую страницу с разным размером страницы и rotationм, вы получаете результат, который вы описываете. Из-за разницы в размере импортированная страница и новая страница не совпадают. Части обрезаются, появляются дополнительные поля, разные вращения и т. Д.

Все это объясняется в главе 6 моей книги . Вы должны использовать PdfCopy вместо PdfWriter . См. Например, пример FillFlattenMerge2 :

 Document document = new Document(); PdfCopy copy = new PdfSmartCopy(document, new FileOutputStream(dest)); document.open(); PdfReader reader; String line = br.readLine(); // loop over readers // add the PDF to PdfCopy reader = new PdfReader(baos.toByteArray()); copy.addDocument(reader); reader.close(); // end loop document.close(); 

В вашем случае вам также нужно добавить номера страниц, вы можете сделать это во второй раз, как это сделано в примере StampPageXofY :

 PdfReader reader = new PdfReader(src); int n = reader.getNumberOfPages(); PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest)); PdfContentByte pagecontent; for (int i = 0; i < n; ) { pagecontent = stamper.getOverContent(++i); ColumnText.showTextAligned(pagecontent, Element.ALIGN_RIGHT, new Phrase(String.format("page %s of %s", i, n)), 559, 806, 0); } stamper.close(); reader.close(); 

Или вы можете добавить их при слиянии, как это делается в примере MergeWithToc .

 Document document = new Document(); PdfCopy copy = new PdfCopy(document, new FileOutputStream(filename)); PageStamp stamp; document.open(); int n; int pageNo = 0; PdfImportedPage page; Chunk chunk; for (Map.Entry entry : filesToMerge.entrySet()) { n = entry.getValue().getNumberOfPages(); for (int i = 0; i < n; ) { pageNo++; page = copy.getImportedPage(entry.getValue(), ++i); stamp = copy.createPageStamp(page); chunk = new Chunk(String.format("Page %d", pageNo)); if (i == 1) chunk.setLocalDestination("p" + pageNo); ColumnText.showTextAligned(stamp.getUnderContent(), Element.ALIGN_RIGHT, new Phrase(chunk), 559, 810, 0); stamp.alterContents(); copy.addPage(page); } } document.close(); for (PdfReader r : filesToMerge.values()) { r.close(); } reader.close(); 

Я настоятельно рекомендую использовать PdfWriter для слияния документов! Это не невозможно, если вы измените размер страницы и поворот страницы в classе Document , но вы усложняете себя. Более того: использование PdfWriter также PdfWriter всю интерактивность (ссылки, annotations, ...), которая существует на страницах, которые вы объединяете. Ваш клиент может испытывать это как ошибку.

Давайте будем гением компьютера.