Вывод PDF с использованием ServletOutputStream - PullRequest
0 голосов
/ 24 августа 2011

Я просто хочу спросить, есть ли возможность выводить PDF-файлы на веб-страницу, используя ServletOutputStream?Например, я хочу, чтобы PDF-файл все еще отображался, если не установлен плагин Adobe или Chrome не используется.

Ответы [ 3 ]

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

У пользователя будет , чтобы на его ПК была установлена ​​программа просмотра PDF для открытия / чтения файла PDF, будь то Adobe Reader или что-то еще. Вы можете отправить пользователю файл PDF либо для открытия в браузере, либо для загрузки (Сохранить как вложение), просто отправив правильные заголовки HTTP. В частности:

Content-type: application/pdf
Content-Disposition: attachment; filename=downloaded.pdf
Content-Length: XXX
Content-Transfer-Encoding: base64

Заголовок Content-Disposition - это заголовок, который предлагает загрузку вместо "открыть в браузере". Однажды ты отправили заголовки, отправьте пустую строку и затем запишите свои данные (часто в кодировке base64).

0 голосов
/ 23 ноября 2016

+ 1, потому что это правильный вопрос.

Клиентская сторона

Вы можете использовать pdf.js библиотеку javascript из mozilla для отображения pdf в виде изображений

Сторона сервера

Если ваш pdf находится в файловой системе изменен отсюда

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String pdfFileName = "pdf-test.pdf";
    String contextPath = getServletContext().getRealPath(File.separator);
    File pdfFile = new File(contextPath + pdfFileName);

    response.setContentType("application/pdf");
    response.addHeader("Content-Disposition", "inline; filename=" + pdfFileName)
    response.setContentLength((int) pdfFile.length());

    FileInputStream fileInputStream = new FileInputStream(pdfFile);
    OutputStream responseOutputStream = response.getOutputStream();
    int bytes;
    while ((bytes = fileInputStream.read()) != -1) {
        responseOutputStream.write(bytes);
    }
}

Если вы генерируете pdf в памяти с использованием таких библиотек, как pdfbox

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    int marginTop = 30;
    String title = "HELLO WORLD";

    final PDFont fontData = PDType1Font.HELVETICA;
    final int fontSize = 8;

    //java8 color issue
    System.setProperty("sun.java2d.cmm", "sun.java2d.cmm.kcms.KcmsServiceProvider");

    final PDPage page = new PDPage();
    final PDFont fontLabel = PDType1Font.HELVETICA_BOLD;
    final int titleFontSize = 12;
    float heightLabelText = fontLabel.getFontDescriptor().getFontBoundingBox().getHeight() / 1000 * fontSize;

    try (final PDDocument pdf = new PDDocument())
    {
        pdf.addPage(page);
        try (PDPageContentStream stream = new PDPageContentStream(pdf, page)) {
            float top = page.getMediaBox().getHeight() - marginTop;

            float titleWidth = fontLabel.getStringWidth(title) / 1000 * titleFontSize;

            stream.setFont(fontLabel, titleFontSize);
            stream.beginText();
            stream.newLineAtOffset((page.getMediaBox().getWidth() - titleWidth) / 2, top - 25);
            stream.showText(title);
            stream.endText();
        }
        try(ByteArrayOutputStream output = new ByteArrayOutputStream()) {
            pdf.save(output);
            resp.setContentType("application/pdf");
            resp.addHeader("Content-Type", "application/pdf");
            resp.addHeader("Content-Disposition", "inline; filename=\"yourFile" + "-" + new Random().nextInt() + ".pdf" + "\"");
            byte[] bytes = output.toByteArray();
            resp.getOutputStream().write(bytes);
            resp.setContentLength((int) bytes.length);
        }

    }
}
0 голосов
/ 24 августа 2011

Ваш сервлет может выводить любой тип документа, который он хочет; тем не менее, браузер будет отображать только те документы, которые он знает, как изначально (например, HTML, текст, GIF, PNG, JPG и т. д.), так и через плагин (PDF, SWF и т. д.).

Если ваш сервлет выводит действительный документ PDF и браузер не может отобразить его изначально (как в Chrome) или не может загрузить плагин для его отображения (например, Adobe), то он, вероятно, попросит пользователя сохранить его или выберите программу, которая может отображать ее.

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