2017-01-17 8 views
0

Я использую IText создать файл PDF и распечатать его с помощью следующего кодапечати Диалог Pdf печати с использованием IText

    Document iText_xls_2_pdf = new Document(PageSize.A4.rotate()); 
       PdfWriter writer = PdfWriter.getInstance(iText_xls_2_pdf, response.getOutputStream()); 
       iText_xls_2_pdf.open(); 

       PdfAction action = new PdfAction(PdfAction.PRINTDIALOG); 
       writer.setOpenAction(action); 
        iText_xls_2_pdf.close(); 

Он отлично работает в первый раз, то есть она открывает диалоговое окно печати, как ожидалось. Как только пользователь закрывает диалоговое окно печати и снова вызывает тот же код, он ничего не делает.

Я делаю что-то неправильно здесь?

Примечание: Я делаю эту операцию в методе doGet сервлета

+0

Я не уверен, почему ваш вопрос получил проголосовать. Вы даете описание проблемы таким образом, чтобы любой разработчик мог ее понять. Возможно, нет решения вашей проблемы (в случае, если проблема вызвана зрителем на стороне клиента), но (1) есть некоторые вещи, которые вы можете попробовать в любом случае (см. Мой ответ) и (2.) if у вас нет решения вашей проблемы, люди должны сказать это, вместо того, чтобы отказаться от голосования. Я проголосовал за то, чтобы вернуть вас на нейтральный счет. –

ответ

0

Сначала это: код, который вы используете, чтобы добавить открытые действия правильно. Любой просмотрщик PDF, который открывает создаваемый PDF-документ, должен запустить диалоговое окно печати.

Вы знаете, что ваш код iText прав, потому что он работает при первом открытии PDF-файла. В вашем случае это происходит в браузере. Неясно, какой PDF-просмотрщик используется: pdf.js в Firefox? Просмотр PDF в Chrome? Предварительный просмотр на Apple? Adobe Reader?

Примечание: вы не должны считать, что каждый зритель PDF реализует полную спецификацию PDF. Некоторые зрители игнорируют открытое действие, другие даже не знают, что такое действие PrintDialog.

Вы пишете: Как только пользователь закрывает диалоговое окно печати и снова вызывает тот же код, он ничего не делает.

Это странный способ поместить вещи. Пользователь не запускает код. Действие инициируется действием open, а не нажатием какой-либо кнопки или выбором какой-либо опции меню. Это поможет, если вы объясните, что вы имеете в виду, когда говорите: «снова вызывает тот же код».

В настоящее время предположим, что «вызов того же кода снова» является эквивалентом обновления/перезагрузки страницы. В этом случае возможно, что PDF никогда не открывается повторно, поскольку он еще не истек. Возможно, просмотрщик PDF в вашем браузере говорит: «Эй, документ, который я показываю сейчас, это тот же самый документ, который у меня есть в моем кеше. Мне не нужно его снова открывать». И если документ никогда не открывается снова, нет причин снова запускать открытое действие.

Когда вы подаете PDF в браузер, какие заголовки вы настраиваете?

Вы можете попробовать добавить эти строки в соответствующем месте в методе doGet():

response.setHeader("Expires", "0"); 
response.setHeader("Cache-Control", 
    "must-revalidate, post-check=0, pre-check=0"); 
response.setHeader("Pragma", "public"); 
response.setContentType("application/pdf"); 
response.setContentLength(baos.size()); 

baos Обратите внимание, что это ByteArrayOutputStream.Это неправильно, чтобы сделать это:

PdfWriter writer = PdfWriter.getInstance(iText_xls_2_pdf, response.getOutputStream()); 

Вы должны сделать это так:

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
PdfWriter writer = PdfWriter.getInstance(iText_xls_2_pdf, baos); 
// do a lot of other stuff 

В самом последнем (особенно после настройки заголовков), вы пишете содержимое на OutputStream из response объект:

OutputStream os = response.getOutputStream(); 
baos.writeTo(os); 
os.flush(); 
os.close(); 

Смотрите официальный FAQ: How can I serve a PDF to a browser without storing a file on the server side?

Если все это не помогает, ваша проблема вызвана чем-то на стороне клиента. В этом случае на ваш вопрос нет ответа. Мы можем только сказать вам, что вы не делаете ничего плохого. Это правильный способ добавить открытые действия:

PdfAction action = new PdfAction(PdfAction.PRINTDIALOG); 
writer.setOpenAction(action); 

Если это не работает, единственный ответ, который вы можете получить на переполнение стека будет: «Вы код правильный» (при условии, что вы будете следовать советы по ByteArrayOutputStream и HTTP-заголовкам).

Смежные вопросы