cocoa - 将 PDF 渲染为高分辨率 NSImage 位图文件的方法

标签 cocoa rendering nsimage nsinputstream

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

我设法在不消耗内存的情况下做到这一点,方法是将渲染分成几个切片,然后使用 NSOperationQueue 渲染每个切片,基本上使用 drawInRect:fromRect:operation:fraction: 将 NSImage pdf 表示形式绘制到新的 NSImage 中,然后保存将 TIFF 表示形式写入文件中。

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

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

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

最佳答案

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

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

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

现在,根据初始图像的“大小”(Acrobat 只会根据 PDF 中的 DPI 信息缩放至原始大小的 6400%),此技术理论上可以允许达到 100k x 80k 像素。对于当今大多数 PC 来说,它的缺点是您需要足够的 RAM 来在复制缓冲区中保存 22GB 的图像数据...

关于cocoa - 将 PDF 渲染为高分辨率 NSImage 位图文件的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3769486/

相关文章:

Cocoa 垃圾收集和保留周期

javascript - 使用 React 从 wordpress api 渲染预转义的 html

cocoa - 使用模板图像的 HUD 按钮

objective-c - 绘制透明图像

cocoa - 从不同分辨率的 PDFPage 中提取 NSImage

swift - 使窗口的标题栏完全透明

swift - 如何使用 subview 在 Mac OSX 中保存 NSI​​mage?

objective-c - 如何在 cocoa 中获得所有可能的屏幕分辨率?

performance - 图像渲染测试

java - 在 Java 中呈现 Android XML 布局