【问题标题】:Is there a way in iText PDF writer to dynamically check PDF size?iText PDF writer 中有没有办法动态检查 PDF 大小?
【发布时间】:2012-06-27 19:15:59
【问题描述】:

我知道这里有一个类似的问题,来自一个想将单个文件分成多个文件的人。但遗憾的是,由于创建新文件会产生一定的开销,因此此解决方案对我不起作用。

背景(非必读):

我要做的是生成任意大小的 PDF 文件来为数据库播种(即调用具有所需文件大小的方法,以千字节或兆字节为单位,应该生成所需大小的文件)。

目前,我通过将其随机化并将其以 1KB 块(以段落形式)放入文件中来确保输入数据不可压缩。在将输出字节数绘制为所需字节数的函数后,我更改了算法以解释这种(令人愉快和预期的)线性关系。

但是,由于输入数据的随机性,这种方法存在一定的不确定性,其绝对值会随着所需大小而增加(因此,尽管它有百分之一的折扣,在 20 MB 的文件中,这百分之一的绝对值非常重要)。

理想情况下,我可以生成任意大小的文件,大小在千字节以内,但为了做到这一点,我需要知道任何给定操作后的文件大小,为了知道这一点,我需要知道 PDFWriter 何时写入其缓冲区。或者至少该缓冲区有多大(即,如果缓冲区小于一千字节,则写入时间无关紧要,因为我只关心准确到该边距内)。

问题:

有没有办法在不关闭文档的情况下使用文本检查实际要在 PDF 中写入磁盘的数据字节数?

或者“关闭文档”只是意味着它刷新缓冲区并关闭流(即它不需要在文件关闭时将任何额外的非用户输入数据量写入文件)?

【问题讨论】:

    标签: java pdf pdf-generation itext


    【解决方案1】:

    当您构建 PdfWriter 时,您必须指定一个 OutputStream,它不一定是 FileOutputStream。所以如果你以这种方式构建它

          ByteArrayOutputStream baos = new ByteArrayOutputStream();
          PdfWriter writer = PdfWriter.getInstance(document, baos);
           . . .          
    

    您可以随时检查缓冲区大小:

     System.out.println("Current size: " + baos.size());
    

    希望这会对你有所帮助。

    【讨论】:

    • 万一其他人有这个问题...
      事实证明,出于某种奇怪的原因,这个解决方案实际上并不起作用。理论上这是个好主意,但是……我猜 API 真的非常非常喜欢它的黑盒设置。无论如何,我实际使用的解决方案是忽略随机性,并利用大小基本上线性增加的事实来尝试获得最准确的结果。
    • 最后...以防万一以后有人...函数在 100 MB 左右发生变化,所以我最终编写了一个代码生成导数分析器来近似范围内的输出。可能不是最优雅的解决方案,但肯定是最准确、最简单的解决方案,无需过多学习 PDF 规范。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-23
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    相关资源
    最近更新 更多