【问题标题】:Methods to render a PDF into a very high resolution NSImage bitmap file将 PDF 渲染成非常高分辨率的 NSImage 位图文件的方法
【发布时间】:2010-09-22 13:05:26
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 我很好奇您为什么需要这么大的图像 - 什么样的 PDF 可以包含这么多信息?另一种选择是使用我在下面概述的技术提取低于所需分辨率(100MB - 1GB 未压缩)的图像,然后使用一些照片编辑应用程序将其缩放到更大的尺寸。这可能会给您几乎相同的图像。我很想听听您的应用程序是什么!
  • 该应用程序是关于将矢量图形光栅化为非常大的位图以创建高分辨率壁纸大小的打印件。印刷厂需要 tiff 图像,无法直接处理矢量图形。不过,它必须在编码中完成,使用 Cocoa API,而不是手动完成。

标签: cocoa rendering nsimage nsinputstream


【解决方案1】:

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

在 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 的图像数据...

【讨论】:

  • 咳咳,很抱歉,但如果您仔细阅读该问题,您会发现它是关于使用 Cocoa API 以编程方式执行此操作的方法,而不是手动使用 Acrobat 或其他...
  • 没错,但如果您仔细阅读我的回复,我确实认识到它可能无法满足您的需求。我希望我的回答/方法可能对一些基于更一般的主题偶然发现这个问题(就像我一样)的人有用,并且不介意一点体力劳动。
猜你喜欢
  • 1970-01-01
  • 2016-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-08
  • 2020-12-21
  • 2014-05-26
相关资源
最近更新 更多