OpenPDF / iText поврежденные документы - PullRequest
3 голосов
/ 22 марта 2019

Я пытался повторно реализовать объединенный пример из OpenPDF 1.2.4 и 1.2.11 в Scala:

def mergePdfs(docs: Seq[Array[Byte]]): Array[Byte] = {
    log.debug(s"merging ${docs.size} PDFs")
    val output = new ByteArrayOutputStream()
    val document = new Document()
    val copy = new PdfCopy(document, output)
    getPageSize(docs.headOption) foreach document.setPageSize
    document.open()
    docs foreach { doc =>
      val reader = new PdfReader(doc)
      1 to reader.getNumberOfPages foreach { pageNum =>
        copy.addPage(copy.getImportedPage(reader, pageNum))
      }
    }
    document.close()
    output.toByteArray
  }

Здесь Здесь - пример выходного документа. Я сгенерировал его из двух копий этого , а затем из трех копий этого .

Я вижу две проблемы:

- Документ поврежден (открывается только в FireFox), частично из-за линии разрыва непосредственно между заголовком и первым объектом. Удаление ошибочной строки не исправляет ошибку документа в коде клиента, спасибо @mkl!

  • Некоторые страницы (обычно одна, но недетерминированные) выглядят пустыми. Никаких шаблонов, в которых я видел. Кроме того, текст каждой страницы появляется дважды в файле. например в приведенном выше примере:
$ strings out.pdf | grep "A Simple PDF File" | wc -l | tr -d ' '
6

В одном случае я использовал vim, чтобы удалить первый поток контента, и это привело к тому, что текст появился на первой странице.

Я неправильно использую API?

1 Ответ

1 голос
/ 23 марта 2019

Первые 17465 байт вашего файла результатов являются фактическим результатом вашего кода ( "две копии этого и затем три копии этого" ). Остальные байты файла 31181 байта состоят из фрагментов других PDF-файлов.

В комментарии вы говорите, что "вызываете Files.write с полученным байтовым массивом." Какие OpenOption s вы используете? Возможно CREATE, но не TRUNCATE_EXISTING?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...