Java: PDF конвертер работает в Mac, но в Windows создает пустой PDF-файл - PullRequest
3 голосов
/ 29 августа 2011

Мне нужна небольшая помощь с моей программой для конвертации PDF.

Итак, я делаю конвертер PDF для мобильного агента с использованием JADE Framework. Но проблема, с которой я сталкиваюсь, больше связана с тем, как я конвертирую текстовый файл в PDF, отправляю его по сети в виде двоичного файла и восстанавливаю обратно файл PDF.

Программа, которую я написал, правильно работает на моем MacBook. Но в Windows он восстанавливает мой PDF-файл как пустой PDF.

Вот мой код, который я использую для отправки PDF-файла.

private void sendPDF(File f, String recipient) {
    String content = "";

    if(f != null) {
        try {
            FileInputStream fis = new FileInputStream(f);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();

            int noBytesRead = 0;
            byte[] buffer = new byte[1024];

            while((noBytesRead = fis.read(buffer)) != -1) {
                baos.write(buffer, 0, noBytesRead);
            }

            content = baos.toString();
            fis.close();
            baos.close();

            System.out.println("Successful PDF-to-byte conversion.");
        } catch (Exception e) {
            System.out.println("Exception while converting PDF-to-byte.");
            content = "failed";
            e.printStackTrace();
        }
    } else {
        System.out.println("PDF-to-file conversion failed.");
        content = "failed";
    }

    ACLMessage message = new ACLMessage(ACLMessage.INFORM);
    message.addReceiver(new AID(recipient, AID.ISLOCALNAME));
    message.setContent(content);

    myAgent.send(message);
    System.out.println("PDF document has been sent to requesting client.");
}

И вот код, который я использую для восстановления PDF обратно.

private File restorePDF(String content) {
    String dirPDF = dirBuffer + "/" + new Date().getTime() + ".pdf";
    File f = new File(dirPDF);

    try {
        if(!f.exists()) f.createNewFile();

        byte[] buffer = new byte[1024];
        ByteArrayInputStream bais = new ByteArrayInputStream(content.getBytes());
            FileOutputStream fos = new FileOutputStream(f);

        int noBytesRead = 0;
        while((noBytesRead = bais.read(buffer)) != -1) {
                fos.write(buffer, 0, noBytesRead);
    }

        fos.flush();
        fos.close();
        bais.close();
    } catch (Exception e) {
        e.printStackTrace();
        f = null;
    }

    return f;
}

Любая помощь по этому вопросу будет высоко ценится! :)

Ответы [ 3 ]

1 голос
/ 29 августа 2011

Вопрос немного сбивает с толку, поскольку в содержимом PDF нет ничего конкретного.

Я предполагаю, что вы действительно хотите отправлять байты, отправлять строку, а кодировка строки на клиенте исервер.

Обычно здесь возникают проблемы:

 content = baos.toString();

и:

 content.getBytes()
1 голос
/ 29 августа 2011

PDF-файл - это двоичный формат файла со справочными таблицами и множеством двоичных блоков данных, чтобы сделать его String сломает его.Если вы хотите узнать о внутренностях файла PDF, я написал о нем множество постов в блоге (http://www.jpedal.org/PDFblog/2010/09/understanding-the-pdf-file-format-series/)

0 голосов
/ 29 августа 2011

Одна из проблем заключается в том, что вы используете неправильный разделитель символов.Java имеет встроенную функцию, которая будет возвращать правильный символ для правильной ОС.См. символ разделителя .

Ваш код будет выглядеть примерно так

String dirPDF = dirBuffer + File.separatorChar + new Date().getTime() + ".pdf";

Для справки:

separatorChar

Системно-зависимый символ разделителя имен по умолчанию.Это поле инициализируется, чтобы содержать первый символ значения системного свойства file.separator. В системах UNIX значение этого поля равно '/';в системах Microsoft Windows это '\'.

...