【问题标题】:Convert pdf to byte[] and vice versa with pdfbox使用 pdfbox 将 pdf 转换为 byte[],反之亦然
【发布时间】:2013-07-16 12:03:48
【问题描述】:

我已经阅读了文档和示例,但我很难将它们放在一起。我只是想获取一个测试 pdf 文件,然后将其转换为字节数组,然后获取字节数组并将其转换回 pdf 文件,然后将 pdf 文件创建到磁盘上。

这可能没有多大帮助,但这是我目前所得到的:

package javaapplication1;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import org.apache.pdfbox.cos.COSStream;
import org.apache.pdfbox.exceptions.COSVisitorException;
import org.apache.pdfbox.pdmodel.PDDocument;

public class JavaApplication1 {

    private COSStream stream;

    public static void main(String[] args) {
        try {
            PDDocument in = PDDocument.load("C:\\Users\\Me\\Desktop\\JavaApplication1\\in\\Test.pdf");
            byte[] pdfbytes = toByteArray(in);
            PDDocument out;
        } catch (Exception e) {
            System.out.println(e);
        }
    }

    private static byte[] toByteArray(PDDocument pdDoc) throws IOException, COSVisitorException {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        try {
            pdDoc.save(out);
            pdDoc.close();
        } catch (Exception ex) {
            System.out.println(ex);
        }
        return out.toByteArray();
    }

    public void PDStream(PDDocument document) {
        stream = new COSStream(document.getDocument().getScratchFile());
    }
}

【问题讨论】:

  • PDF 是一个字节数组,只需读取二进制文件即可。但也许你的意思不同?
  • 由于某种原因,当我将 PDF 转换为字节数组然后再转换回 PDF 时,当我尝试打开新创建的 PDF 时,它说它已损坏。所以我决定使用 pdfbox 来避免这种情况。是否可以跳过 pdfbox 并执行此操作并返回工作 pdf?
  • 你的最终目标是什么?我看不到将 PDF 转换为字节数组并返回的任何自给自足的用途。
  • 好吧,我正在测试是否可以将 PDF 存储在数据库中。我知道应该使用文件系统进行存储,但我还是想将它存储在数据库中。我能做到这一点的唯一方法是它的形式是 byte[] 数组
  • 只需将其作为文件流读取即可。我真的看不出它不应该起作用的原因。

标签: java pdf pdf-generation pdfbox


【解决方案1】:

您可以使用Apache commons,这在任何 java 项目 IMO 中都是必不可少的。

然后你可以使用FileUtilsreadFileToByteArray(File file)writeByteArrayToFile(File file, byte[] data)

(这里是commons-io,也就是FileUtils所在的地方:http://commons.apache.org/proper/commons-io/download_io.cgi

例如,我刚刚在这里尝试过,效果很好。

try {
    File file = new File("/example/path/contract.pdf");
    byte[] array = FileUtils.readFileToByteArray(file);
    FileUtils.writeByteArrayToFile(new File("/example/path/contract2.pdf"), array);

} catch (IOException e) {
    e.printStackTrace();
}

【讨论】:

  • 当我使用它时,它会在将 byte[] 转换回文件时创建损坏的 pdf 文件......你能成功地做到这一点吗?
  • 即使使用 FileUtils?我经常使用它来处理很多不同的文件,包括一些 pdf,并且从来没有遇到过任何问题):
  • 你有任何旧代码可以粘贴来演示一下吗?
  • 用我刚才在这里运行的测试中的代码更新了代码(除了“/example/path”,它是一个真实的路径)
  • 没问题,伙计,我们是来互相帮助的 :D 很高兴我能提供帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-14
  • 1970-01-01
  • 2012-10-13
相关资源
最近更新 更多