Как извлечь массив byte [] из PdfDocument

#java #arrays #pdf #inputstream #itext7

#java #массивы #PDF #входной поток #itext7

Вопрос:

После долгих исследований я все еще не могу найти способ извлечь byte[] из объекта PdfDocument. Как я могу этого добиться?

Я пробовал использовать FileInputStream, но на самом деле у меня нет «физического пути» к PdfDocument, потому что я создаю его программно. Более того, я не очень хорошо знаком с byte[] .

Может ли кто-нибудь помочь мне с этим?

     PdfDocument pdfDocumentWithoutSplit = getPdfUtils().generatePdfDocumentByMedia(shippingLabel);

        for (int i = 1; i < pdfDocumentWithoutSplit.getNumberOfPages()   1; i  ) {
            final ByteArrayOutputStream pdfByteArray = new ByteArrayOutputStream();
            final PdfDocument pdfDocument = new PdfDocument(new PdfWriter(pdfByteArray));

            pdfDocument.movePage(pdfDocumentWithoutSplit.getPage(i), i);
            pdfByteArray.close();
             //now here I need to get the bytes of each pdfDocument somehow

        }
  

Приветствия

Комментарии:

1. Можете ли вы добавить код? Будьте более откровенны с «Я создаю его программно», какова ваша цель?. Если вы создаете PDF, это означает, что у вас есть текст в некоторой переменной, скорее всего, String, поэтому вы можете извлечь массив byte из String. Если вы хотите извлечь массив byte из формата PdfDocument, вы можете создать временный файл pdf

2. Я фактически добился разделения страниц psyhical pdf на PdfDocuments (1 страница, 1 PdfDocument), и теперь мне нужно получить байты этого PdfDocuments, ни один из которых не имеет психического пути. Я добавил фрагмент в вопрос о моем коде

Ответ №1:

         final ByteArrayOutputStream baos = new ByteArrayOutputStream();
        final PdfDocument pdfDocument = new PdfDocument(new PdfWriter(baos ));
        pdfDocument.movePage(pdfDocumentWithoutSplit.getPage(i), i);
        pdfDocument.close();
        // should close the PdfWriter, and hence the ByteArrayOutputStream
        baos .close();
        byte[] bytes = baos .toByteArray();
  

Закрытие процесса очистит все буферизованные данные в памяти и заполнит поток ByteArrayOutputStream.

Комментарии:

1. baos. toByteArray() возвращает только 15 байт большого документа (невозможно), также выдает эту ошибку [PdfReader], возникшую при чтении таблицы перекрестных ссылок. Таблица перекрестных ссылок будет перестроена. com.itextpdf.io.IOException: PDF startxref не найден. , есть какая-нибудь подсказка?

2. @Saliffanag PdfDocument.movePage задокументирован для перемещения страницы в новое место в том же документе ! Вы пытаетесь использовать его для перемещения страницы из pdfDocumentWithoutSplit в pdfDocument . Очевидно, что это не сработает. В частности, скорее всего, будет выдано какое-то исключение. Вы случайно не перехватываете и не игнорируете исключения?

3. @Joop Eggen большое вам спасибо, это действительно помогло мне.

Ответ №2:

Все в PDF должно обрабатываться как строка. Сначала вам нужно будет выполнить поиск физического пути (вы можете использовать регулярное выражение или аналогичную обработку строк для поиска пути на основе того, как вы его генерируете и какой язык используете). Затем выполните поиск в PDF-файле с помощью программы чтения PDF (поскольку это не обычный текстовый документ) строки, которая выглядит как ваш байтовый массив. Наконец, вам нужно будет преобразовать строку в массив, извлекая данные внутри и используя метод разделения или генерации массива. Удачи.