2

我必须将 PDF 渲染成非常高分辨率的图像(比如说高达甚至超过 100,000 * 80,000 像素)。

我设法做到这一点,通过将渲染分成几个切片然后使用 NSOperationQueue 渲染每个切片,基本上使用 drawInRect:fromRect:operation:fraction: 将 NSImage pdf 表示绘制到一个新的 NSImage 中,然后将 TIFFRepresentation 保存到文件。

一切都很好,多核而且速度很快,我几乎很高兴。无论如何,我需要在渲染它们之后再次加入这些切片,以获得单个 TIFF 文件。

我会尝试使用 NSInputStream 和 NSOutputStream 合并文件,但由于每个文件都是完整的 tiff 表示,将原始字节合并在一起会导致无法读取的图片文件。有没有办法将图像文件合并在一起而不将它们完全加载到内存中,即不使用 NSImage 方法?

否则我可以保存原始像素字节而不是 tiff 表示,然后将它们与 NSInputStream/NSOutputStream 连接,但是我如何将整个字节文件转换为可识别的 TIFF,而无需再次将巨大的东西加载到 ram 中?

4

1 回答 1

-1

这种技术可能无法满足您的极端需求(有关更多信息,请参阅消息末尾),但它有望帮助其他人从 PDF 中获得比使用屏幕截图或快照 acrobat 工具获得的分辨率更高的图像。它不是特别优雅,但它完成了工作。

在 Windows XP 上基于 Acrobat 9 Reader 的说明(只要具有快照/“选取框”工具,早期和更高版本也应该可以使用)。我想它适用于大多数其他运行 Adob​​e Reader 的平台。(现在我想起来,很可能有替代的 PDF 显示软件实际上可以做到这一点而无需任何技巧。也许是基于 ghostscript 的东西?)无论如何,我知道这是可行的:

  1. 放大 pdf,直到显示器上的图像具有您正在寻找的像素分辨率。如果您尝试捕获的图像像素比显示器上的像素多(这是使用此技术的唯一原因),您将只能在屏幕上看到图像的一部分。
  2. 根据需要滚动以找到要捕获的 PDF 的一角。
  3. 选择快照/“选框选择”工具。
  4. 单击角落,按住鼠标按钮(拖动选择)并将鼠标移动到窗口的对角。
  5. 屏幕将开始自动滚动到图像的对角。这可能需要一段时间,但它会到达那里。
  6. 当您到达另一边时,将手指从鼠标上移开,您的剪贴板中应该会出现高分辨率图像。

现在,根据初始图像的“大小”(根据 PDF 中的 DPI 信息,Acrobat 最多只能放大原始大小的 6400%),这种技术理论上可以让您达到 100k x 80k 像素。对于当今大多数 PC 而言,它崩溃的地方在于,您需要足够的 RAM 才能在复制缓冲区中保存 22GB 的图像数据……

于 2010-11-24T02:22:49.137 回答