Есть ли способ конвертировать двоичный файл, содержащий несколько изображений внутри, в PDF - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь преобразовать двоичный файл, содержащий несколько изображений внутри, в документ pdf, используя java, с помощью itextpdf было единственным решением, которое я получил преобразованный файл в правильном формате, но проблема здесь заключается в том, что на выходе он предоставил мне только одно изображение (первое) и потерял остальные, которые находятся внутри двоичного файла.

Я уже доказал, что использую itextpdf для добавления изображений в документ, а также некоторые другие решения, подобные этому: https://www.mkyong.com/java/how-to-convert-array-of-bytes-into-file/ или
Создать PDF из двоичных данных в Java

Как я понимаю, проблема в моем случае заключается в том, что я прочитал свой двоичный файл и сохранил их в байте [], а после того, как я передал содержимое файла в Vector,

Я создал функцию, которая получает в качестве аргумента Vector и создает PDF-файл с изображениями внутри, проблема в том, что он вставляет только первое изображение в PDF-файл, поскольку он не может отделить внутри Vector конец первого изображение и начало второго изображения, как в этом случае (файлы изображений JPEG начинаются с FF D8 и заканчиваются FF D9.):

Как определить содержимое байта [] в формате JPEG?

File imgFront = new File("C:/Users/binaryFile");
byte[] fileContent;       

Vector<byte[]> records = new Vector<byte[]>();

try {

    fileContent = Files.readAllBytes(imgFront.toPath());
    records.add(fileContent);  // add the result on Vector<byte[]>

} catch (IOException e1) {
    System.out.println( e1 );
}

...

 public static String ImageToPDF(Vector<byte[]> imageVector, String pathFile) {
        String FileoutputName = pathFile + ".pdf";
        Document document = null;

        try {
            FileOutputStream fos = new FileOutputStream(FileoutputName );
            PdfWriter writer = PdfWriter.getInstance(document, fos);

            writer.open();
            document.open();  

     //loop here the ImageVector in order to get one by one the images, 
     //but I get only the first one 

            for (byte[] img : imageVector) {
                Image image = Image.getInstance(img);

                image.scaleToFit(500, 500); //size

                document.add(image);
            }
            document.close();
            writer.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return FileoutputName ;

    }

Я ожидаю, что в pdf будут все изображения внутри, а не только одно.

1 Ответ

0 голосов
/ 15 января 2019

Я нашел обходной путь решения, используя библиотеку itextpdf.

Сначала я преобразую двоичный файл в байты, после использования преобразования, чтобы преобразовать байты в целое число и определить тип изображения с помощью массива байтов, http://www.sparkhound.com/blog/detect-image-file-types-through-byte-arrays

Я узнал, что мой тип был Tiff из вывода: var tiff2 = new byte [] {77, 77, 42}; // TIFF

Я изменил параметры с Vector imageVector на ==> byte [] байтов, когда я передаю массив байтов byte [] fileContent;

byte[] fileContent; 
fileContent = Files.readAllBytes(ImgFront.toPath());

ImageToPDF(fileContent, "C:/Users/Desktop/pdfWithImages");

Теперь я получаю количество страниц, которые использует двоичный файл: int numberOfPages = TiffImage.getNumberOfPages (ra); // Из itextpdf

    public static String ImageToPDF(byte[] bytes, String pathFile) {
        String fileName= pathFile + ".pdf";
        Document document = null;

            document = new Document();

        try {
            FileOutputStream fos = new FileOutputStream(fileName);
            PdfWriter writer = PdfWriter.getInstance(document, fos);

            writer.open();
            document.open();

            // Array of bytes we have read from the Binary file
            RandomAccessFileOrArray ra = new RandomAccessFileOrArray(bytes);

            // Get the number of pages the the binary file have inside
            int numberOfPages = TiffImage.getNumberOfPages(ra);

            // Loop through numberOfPages and add them on the document 
            // one by one
            for(int page = 1; page <= numberOfPages; page ++){
                Image image = TiffImage.getTiffImage(new RandomAccessFileOrArray(bytes),page);
                image.scaleAbsolute(500, 500);
                document.add(image);
            }                   

            document.close();
            writer.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return fileName;

}

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

...