将 itext pdf 保存为没有物理存在的 blob。

Posted

技术标签:

【中文标题】将 itext pdf 保存为没有物理存在的 blob。【英文标题】:Save itext pdf as blob without physical existence. 【发布时间】:2015-04-14 02:12:35 【问题描述】:

我正在使用此代码使用 iText 生成 PDF。首先,它创建 html 到 PDF,然后将 PDF 转换为字节数组或 BLOB 或字节数组。 我不想在我的服务器上创建任何 pdf 的物理存储。首先,我想使用 itext 将 HTML 转换为 PDF 的 blob,然后我想将该 blob 存储在我的 DB 中(我会在 DB 中存储)。

          String userAccessToken=requests.getSession()
                    .getAttribute("access_token").toString();
          Document document = new Document(PageSize.LETTER);
          String name="/pdf/invoice.pdf";
          PdfWriter pdfWriter = PdfWriter.getInstance
               (document, new FileOutputStream(requests.getSession().getServletContext().getRealPath("")+"/assets"+name));
          document.open();
          document.addAuthor("Real Gagnon");
          document.addCreator("Real's HowTo");
          document.addSubject("Thanks for your support");
          document.addTitle("Please read this ");
          XMLWorkerHelper worker = XMLWorkerHelper.getInstance();

          //data is an html string 
          String str = data;
          worker.parseXHtml(pdfWriter, document, new StringReader(str));
          document.close();
          ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
          PdfWriter.getInstance(document, byteArrayOutputStream);
          byte[] pdfBytes = byteArrayOutputStream.toByteArray();

          link=name;
          System.out.println("Byte array is "+pdfBytes);

问题:- 使用 itext 将 html 转换为 pdf BLOB,没有 PDF 的物理存在。

【问题讨论】:

这里有什么问题? 不,它正在工作。但它会在服务器上创建第一个物理 PDF,我不想在服务器上创建物理 PDF (/pdf/invoice.pdf)。 【参考方案1】:

写入ByteArrayOutputStream(而不是FileOutputStream):

PdfWriter pdfWriter = PdfWriter.getInstance
           (document, new ByteArrayOutputStream());

【讨论】:

【参考方案2】:

这个问题的另一个答案几乎是正确的,但并不完全正确。

您可以在创建PdfWriter 时使用任何OutputStream。如果你想创建一个完全在内存中的文件,你可以像这样使用ByteArrayOutputStream

ByteArrayOutputStream baos = new ByteArrayOutputStream();
Document document = new Document();
PdfWriter.getInstance(document, baos);
document.open();
// add stuff
document.close();
byte[] pdf = baos.toByteArray();

简而言之:你首先创建一个ByteArrayOutputStream,然后将这个OutputStream 传递给PdfWriter,在文档关闭后,你可以从OutputStream 获取字节。

(在另一个答案中,无法检索字节。另外:重要的是不要在文档关闭之前尝试检索字节。)

【讨论】:

如何从byte[] 数组中取回document 您的其他问题不清楚。如果你想将字节数组写入文件,那么这里有几个选项:***.com/questions/4350084/byte-to-file-in-java 如果你想进一步操作 PDF,你需要创建一个PdfReader 实例。请注意,这个问题是关于 iText 的旧版本。在 iText 7 中,Document 对象完全不同。

以上是关于将 itext pdf 保存为没有物理存在的 blob。的主要内容,如果未能解决你的问题,请参考以下文章

java 已经获取pdf代码,如何把他pdf文件保存到本机 要求用输出流做

iText7 将 HTML 转换为 PDF“System.NullReferenceException”。

作家无法解决itext

iText 7 PDF 可访问性:“表格标题单元格没有关联的子单元格”

使用 iText 将 HTML 转换为 PDF

使用 Itext 将 Pdf 页面转换为字节数组