在Java中读取PDF文件-没有外部库



在过去的几周里,我一直在编写一个简单的Java服务器。

首先,我想根据启动服务器的位置显示文件系统。例如,如果您在src目录下启动服务器,打开浏览器,转到localhost:5555,您将看到src中包含的文件和目录。每一个都是相互联系的。我让它工作得很好。

如果您单击一个目录,它会显示它的内容(就像我提到的)。如果单击一个文件,它将读取该文件并以纯文本形式显示该文件。如果您单击图像,它将提供该图像。这一切都在浏览器中进行,您可以使用后退按钮返回到之前查看的目录列表或文件。这也可以很好地工作,并且不使用外部库。

这是我用来读取文本文件的代码(使用阅读器):

private String readFile() {
    BufferedReader reader;
    String response = "";
    try {
        FileReader fileReader = new FileReader(requestedFile);
        reader = new BufferedReader(fileReader);
        String line;
        while ((line = reader.readLine()) != null) {
            response += line + "n";
        }
        reader.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return response;
}

这是我用来提供图像的代码(输入流而不是阅读器):

public byte[] getByteArray() throws IOException {
    byte[] byteArray = new byte[(int) requestedFile.length()];
    InputStream inputStream;
    String fileName = String.valueOf(requestedFile);
    inputStream = new BufferedInputStream(new FileInputStream(fileName));
    int bytesRead = 0;
    while (bytesRead < byteArray.length) {
        int bytesRemaining = byteArray.length - bytesRead;
        int read = inputStream.read(byteArray, bytesRead, bytesRemaining);
        if (read > 0) {
            bytesRead += read;
        }
    }
    inputStream.close();
    FilterOutputStream binaryOutputStream = new FilterOutputStream(outputStream);
    byte [] binaryHeaders = headers.getBytes();
    byte [] fullBinaryResponse = new byte[binaryHeaders.length + byteArray.length];
    System.arraycopy(binaryHeaders, 0, fullBinaryResponse, 0, binaryHeaders.length);
    System.arraycopy(byteArray, 0, fullBinaryResponse, binaryHeaders.length, byteArray.length);
    try {
        binaryOutputStream.write(fullBinaryResponse);
        binaryOutputStream.flush();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

我现在尝试的是提供pdf。如果我在其中一个目录中有一个PDF文件,我点击它,它应该打开那个PDF文件(在浏览器使用的任何默认阅读器中)。

我已经在谷歌上搜索了这个话题,并尝试了一两天的一些东西,但我似乎不能得到它。我发现很奇怪,当我点击我的代码当前的PDF时,浏览器似乎正在打开PDF,但没有出现任何文本。它是标准的浏览器内PDF查看器,当我们点击PDF链接时,我们都习惯看到它。但是没有内容。只是一些空白页。

有人能帮忙吗?我不打算使用外部库。我只是想了解如何在Java中打开PDF文件。

谢谢!

不要将其解析为文本,这将转换字符,可能是结束行,并可能更改您不希望的内容。不要将整个内容缓冲为字节数组,而是直接写入输出流,这样就不会出现内存问题。相反,只需像这样提供文件:

public class FileServer extends javax.servlet.http.HttpServlet
{
public void doGet(HttpServletRequest req, HttpServletResponse resp)
{
    OutputStream out=null;
    try {
        HttpSession session = req.getSession();
        out = resp.getOutputStream();
        resp.setContentType(-- specify content type here --);
        req.setCharacterEncoding("UTF-8");
        String pathInfo = req.getPathInfo();
        String fullPath = -- figure out the path to the file in question --;
        FileInputStream fis = new FileInputStream(fullPath);
        byte[] buf = new byte[2048];
        int amtRead = fis.read(buf);
        while (amtRead > 0) {
            out.write(buf, 0, amtRead);
            amtRead = fis.read(buf);
        }
        fis.close();
        out.flush();
    }
    catch (Exception e) {
        try {
            resp.setContentType("text/html");
            if (out == null) {
                out = resp.getOutputStream();
            }
            Writer w = new OutputStreamWriter(out);
            w.write("<html><body><ul><li>Exception: ");
            w.write(e.toString());
            w.write("</ul></body></html>");
            w.flush();
        }
        catch (Exception eeeee) {
            //nothing we can do here...
        }
    }
}
}

最新更新