PDF / Объединение Itext 5 Java - PullRequest
       29

PDF / Объединение Itext 5 Java

0 голосов
/ 24 октября 2018

Я пытаюсь объединить два PDF-файла с itext 5. Когда процесс заканчивается, генерируется один PDF-файл, но программа для чтения foxit не читает PDF-файл.Неверный формат Это мой код

    public static byte[] mergePdf(byte[][] streamOfPDFFiles) throws IOException, DocumentException {

      ByteArrayOutputStream baos = new ByteArrayOutputStream();
      float MARGIN_OF_ONE_CM = 28.8f;
      Document document = new Document(PageSize.A4, MARGIN_OF_ONE_CM, MARGIN_OF_ONE_CM, MARGIN_OF_ONE_CM,MARGIN_OF_ONE_CM);
      document.addLanguage("pt-BR");
      List<PdfReader> readers = new ArrayList<PdfReader>();       
      int totalPages = 0;
      byte[][] pdfs = streamOfPDFFiles;
      try {

        // Create Readers for the pdfs.
        for (byte[] bs : pdfs) {
            PdfReader pdfReader = new PdfReader(bs);
            readers.add(pdfReader);
            totalPages += pdfReader.getNumberOfPages();
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
      // step 2
      PdfACopy copy = new PdfACopy(document, baos, PdfAConformanceLevel.PDF_A_1A);
      // step 3
      document.open();
      // step 4

      int n;
      // loop over the documents you want to concatenate
      for (int i = 0; i < readers.size(); i++) {              
          // loop over the pages in that document
          n = readers.get(i).getNumberOfPages();
          for (int page = 1; page <= n;) {
              copy.addDocument(readers.get(i));
              ++page;
          }
          copy.freeReader(readers.get(i));
          readers.get(i).close();
      }
      byte[] pdfRetorno = baos.toByteArray();
      return pdfRetorno;
}

Может кто-нибудь мне помочь?заранее спасибо

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Здесь правильный код:

public static byte[] mergePdf(byte[][] streamOfPDFFiles) throws IOException, DocumentException {

    final float MARGIN_OF_ONE_CM = 28.8f;
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    Document document = new Document(PageSize.A4, MARGIN_OF_ONE_CM, MARGIN_OF_ONE_CM, MARGIN_OF_ONE_CM,
            MARGIN_OF_ONE_CM);
    List<PdfReader> readers = new ArrayList<PdfReader>();

    byte[][] pdfs = streamOfPDFFiles;
    try {

        // Create Readers for the pdfs.
        for (byte[] bs : pdfs) {
            PdfReader pdfReader = new PdfReader(bs);
            readers.add(pdfReader);             
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

    PdfACopy copy = new PdfACopy(document, baos, com.itextpdf.text.pdf.PdfAConformanceLevel.PDF_A_1A);

    copy.setTagged();
    document.open();
    copy.createXmpMetadata();
    copy.setLanguage("pt-br");                  

    int n;
    for (int i = 0; i < readers.size(); i++) {          
        n = readers.get(i).getNumberOfPages();
        for (int page = 1; page <= n;) {
            copy.addDocument(readers.get(i));
            ++page;
        }
        copy.freeReader(readers.get(i));            
    }

    document.close();
    byte[] pdfRetorno = baos.toByteArray();
    return pdfRetorno;
}
0 голосов
/ 24 октября 2018

Всякий раз, когда вы открываете что-то, вы должны в конечном итоге закрыть его снова, в частности, поскольку закрытие может включать в себя больше, чем освобождение ресурсов, это может также включать добавление последнего фрагмента к записанным данным.

Это также имеет место здесь, вы открываете Document document:

document.open();

, но не закрываете его после этого.Таким образом, PDF-файл, записанный в ByteArrayOutputStream baos, является неполным, по крайней мере, отсутствуют окончательная таблица перекрестных ссылок объектов PDF и трейлер.

Таким образом, закройте document, прежде чем работать с результатом в baos:

for (int i = 0; i < readers.size(); i++) {
    [...]
}
document.close();
byte[] pdfRetorno = baos.toByteArray();
return pdfRetorno;
...