Архивирование электронной почты с помощью camel (таленд)

Мое требование: после прочтения электронной почты мне нужно заархивировать его как PDF (на данный момент давайте рассмотрим простой текст и исключим встроенный текст из изображений).

Ниже приведен мой маршрут кода, созданный из Talend-ESB (который, я считаю, является ключевым моментом для объяснения).

Когда я выполняю это, я получаю java.lang.IllegalStateException: Cannot read while there is an open stream writer

        from(
            "imaps://imap.gmail.com:993" + "?username=" + context.username
                    + "&password=" + decryptedPassword_cMail_1
                    + "&contentType=text/plain" + "&" + "peek" + "=true"
                    + "&" + "handleFailedMessage" + "=true" + "&"
                    + "skipFailedMessage" + "=true" + "&"
                    + "mapMailMessage" + "=true")

    .routeId("WriteAsPDF_cMail_1")
            .process(new org.apache.camel.Processor() {
                public void process(org.apache.camel.Exchange exchange)
                        throws Exception {
                    Map<String, Object> map = new java.util.HashMap<String, Object>();

                    map = exchange.getIn().getHeaders();
                    for (String name : map.keySet()) {
                        String key = name.toString();
                        String value = map.get(name).toString();
                        System.out.println(key + " " + value);

                    }
                    String M_Body = exchange.getIn().getBody().toString();
                    org.apache.pdfbox.pdmodel.PDDocument document = new org.apache.pdfbox.pdmodel.PDDocument();

                    org.apache.pdfbox.pdmodel.PDPage page = new org.apache.pdfbox.pdmodel.PDPage();

                    document.addPage(page);
                    org.apache.pdfbox.pdmodel.font.PDFont pdfFont = org.apache.pdfbox.pdmodel.font.PDType1Font.HELVETICA_BOLD;
                    org.apache.pdfbox.pdmodel.PDPageContentStream contentStream = new org.apache.pdfbox.pdmodel.PDPageContentStream(
                            document, page);
                    contentStream.beginText();
                    contentStream.setFont(pdfFont, 12);
                    contentStream.moveTextPositionByAmount(100, 700);
                    contentStream.drawString(M_Body);
                    document.save("C:/Hari/poller/zipper/BlankPage.pdf");
                    contentStream.close();
                    document.close();
                }

            }).id("WriteAsPDF_cProcessor_1");
}

============================================

Детали исключения:

[ПРЕДУПРЕЖДЕНИЕ]: org.apache.camel.component.mail.MailConsumer - Ошибка обмена, поэтому откат статуса сообщения: Exchange [MailMessage @ 0xcdf6432] java.lang.IllegalStateException: не удается прочитать, пока есть открытый модуль записи потока в org.apache .pdfbox.cos.COSStream.createRawInputStream (COSStream.java:129) в org.apache.pdfbox.pdfwriter.COSWriter.visitFromStream (COSWriter.java:1177) в org.apache.pdfbox.cos.COSStream.accept (COSStream.accept (COSStream.accept) : 372) на org.apache.pdfbox.pdfwriter.COSWriter.doWriteObject (COSWriter.java:561) на org.apache.pdfbox.pdfwriter.COSWriter.doWriteObjects (COSWriter.java:490) ... ...... . .. [ОШИБКА]: org.apache.camel.processor.DefaultErrorHandler - Неудачная доставка для (MessageId: ID-EINLW2ABC-60843-1468402879061-0-1 на ExchangeId: ID-EINLW2ABC-60843-1468402879061-0-2). Исчерпано после попытки доставки: 1 поймано: java.lang.IllegalStateException: невозможно прочитать, пока есть открытый писатель потока

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


person Hari R    schedule 13.07.2016    source источник
comment
Пожалуйста, отредактируйте свой вопрос и добавьте снимок экрана с программой Talend.   -  person tobi6    schedule 13.07.2016
comment
contentStream.close (); нужно было сделать перед сохранением. (не знаю, причина ли в этом)   -  person Tilman Hausherr    schedule 13.07.2016
comment
Привет, @TilmanHausherr. Действительно, это остановило ошибку. :) Мой код, однако, необходимо исправить, поскольку PDF-файл создается, но только с пустой страницей. Однако большое спасибо за ваш вклад.   -  person Hari R    schedule 14.07.2016
comment
Пустая страница также связана с поздним закрытием (см. stackoverflow.com/questions/31391337/). Если после этого по-прежнему отображается пустая страница, то я подозреваю, что M_Body пуст.   -  person Tilman Hausherr    schedule 14.07.2016
comment
Привет, @TilmanHausherr, основываясь на вашем вчерашнем комментарии, я выполнил contentStream.close () сразу после contentStream.drawString (M_Body); После чего исключение было остановлено, создан PDF (но пустой). Я тоже считаю, что M_Body пусто. Однако я еще раз проверю свой код / ​​логику.   -  person Hari R    schedule 14.07.2016
comment
Есть новости по этому поводу? Если вы ее решили, удалите вопрос. Если нет, я бы посоветовал вам тоже удалить его и создать новый вопрос.   -  person Tilman Hausherr    schedule 07.08.2016
comment
Я думал, что ваш комментарий поможет другим участникам, которые столкнулись с подобной проблемой, решить. Да, ваше предложение помогло мне исправить. Я не осведомлен о правилах форума, если вы считаете, что удалить вопрос - это хорошо, то я так и сделаю.   -  person Hari R    schedule 09.08.2016