1

我有一个旧的 Kindle Dx。由于残疾,我不能使用平板电脑或其他触摸设备,我将 pdf 文件传输到 Kindle 阅读。它需要预处理。

在不光栅化 PDF 的情况下预处理 pdf 有什么好的选择?

[当光栅化是可以接受的:

  • k2pdfopt - 用于地图或小文本的模式复制。这会光栅化,增强对比度,并使所有内容都与 1.4 兼容。

  • k2pdfopt -mode copy -dev dx 用于其他作品。这将光栅化为 800x1080,根据需要进行下采样,增强对比度,同时使所有内容变为灰度,并使所有内容与 1.4 兼容。

当光栅化文本不可接受时:

  • gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -sstdout=%sstderr -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf 如果要保留图形。这使所有的更改都与 1.4 兼容。

  • gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 \ -g800x1080 -r150 -dPDFFitPage \ -dFastWebView -sColorConversionStrategy=RGB \ -dDownsampleColorImages=true -dDownsampleGrayImages=true -dDownsampleMonoImages=true -dColorImageResolution=150 -dGrayImageResolution=150 -dMonoImageResolution=300 -dColorDownsampleThreshold=300 =1.0 -dGrayImageDownsampleThreshold=1.0 -dMonoImageDownsampleThreshold=1.0 \ -sstdout=%sstderr -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf 如果你想要适度的下采样。这会重新光栅化现有的光栅图像以适应 800x1080 并使所有内容与 1.4 兼容。

  • gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 \ -g800x1080 -r150 -dPDFFitPage \ -dFastWebView -sColorConversionStrategy=Gray \ -dDownsampleColorImages=true -dDownsampleGrayImages=true -dDownsampleMonoImages=true -dColorImageResolution=75 -dGrayImageResolution=75 -dMonoImageResolutionHoldImages=150 -dColor =1.0 -dGrayImageDownsampleThreshold=1.0 -dMonoImageDownsampleThreshold=1.0 \ -sstdout=%sstderr -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf 如果您想要更积极的下采样。这将重新光栅化光栅图像以适应 400x540,使它们成为灰度,并使所有内容与 1.4 兼容。图像质量低,但通常仍可识别。

  • gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dFILTERIMAGE -dFILTERVECTOR -sstdout=%sstderr -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf 如果要剪切所有图形。

如果使用这些选项中的任何一个对另一个设备进行预处理,请检查其屏幕大小(以像素为单位)。不要太担心每英寸的像素数。]

[是我的目标是修复 pdf,因此它们 1. 不要让我的 Kindle 崩溃,2. 不要冻结我的 Kindle 或加载每个页面的时间过长,以及 3. 不要占用太多有限的磁盘我的 Kindle 上的空间。最好还 4. 不光栅化文本, 5. 不剪切所有图像,有时会丢失表格等。 6. 不重排文本,这通常会丢失表格。但我很乐意对大多数图像进行下采样。]

[请注意,我保留了原件的副本。这不是节省磁盘空间的方法!]

对于扫描的 pdf,Willus 的 k2pdfopt 是一个不错的选择。我已经为 Mac Automator 设置了

k2opt -mode 复制 -dev dx

或者偶尔只是 -mode 复制。

对于 pdf-born-pdfs,我宁愿不栅格化所有内容。

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -sstdout=%stderr -dNOPAUSE -dQUIET -dBATCH

通常可以转换文件,因此 Kindle Dx 可以打开它们,但 Kindle 仍然会变慢、卡住或出现某些页面崩溃。

一种选择是将 Ghostscript 和 Mutool 组合如下:

  1. gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -sstdout=%stderr -dNOPAUSE -dQUIET -dBATCH 预处理 pdf 以删除密码,
  2. mutool clean -g -g -d -s -l 清理垃圾,然后
  3. gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -sstdout=%stderr -dNOPAUSE -dQUIET -dBATCH 再次获得更小更快的pdf。

注意:我认为 Mutool 的第 3 个 -g 相当于 Ghostscript 的 -dDetectDuplicateImages。由于它会减慢渲染速度,因此相反可能会更好。我不确定如何将其设置为 false。-dDetectDuplicateImages 假?-uDetectDuplicateImages?

注意:我使用 gtime 来计时 pdf 渲染。

单个应用程序中的单步工具会有所帮助。减少图像也会有所帮助。Ghostscript 的文档很难理解。

  1. 对于清理,作为运行 mutool 的替代方法:

-dFastWebView 可能会有所帮助。

-dNOGC 表示 Ghostscript 默认进行垃圾收集。

  1. 对于图像缩小:

-dPDFSETTINGS=/screen 在 9.50 中似乎比 9.23 更好。/ebook 可能会更好,因为它嵌入了所有字体。

-dFILTERIMAGE -dFILTERVECTOR 在 9.50 中也比 9.23 工作得更好,但比我想要的更激烈。

许多设置似乎依赖于输入分辨率和/或输入页面大小。

-r 似乎依赖于输入页面大小,而不是输出页面大小。Kindle Dx 的尺寸为 800 x 1180 像素。

-dDownScaleFactor 相对于输入分辨率减小。

-g800x1080 似乎是裁剪页面,而不是缩小它们。

我认为 -sDEVICE=pdfimage8 会栅格化所有内容,例如 k2pdfopt。

在某些情况下

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dFastWebView -uDetectDuplicateImages -dPDFSETTINGS=/ebook -sstdout=%sstderr -dNOPAUSE -dQUIET -dBATCH 生成的文件比 -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -sstdout=%sstderr 更大更慢- dNOPAUSE -dQUIET -dBATCH

......我不确定如何处理这些结果。

4

1 回答 1

2

你在这里问了很多,这使得阅读和中肯的回答变得相当困难。你还没有真正明确你想要实现什么(你也没有说你使用的是什么版本的 GS 和 MuPDF)。

这里有几点;

您不需要从 Ghostscript 生成的 PDF 文件中“清除垃圾”,这些文件很少有可以删除的内容,这就是人们通过 GS+pdfwrite 运行 PDF 文件的原因之一(尽管我一直说这是一个坏主意)。

将 -g 开关与 Mutool 一起使用两次不会(AFAIK)做任何额外的事情,但添加 -d 会解压缩文件。您也可以让 Ghostscript 生成未压缩的 PDF 文件,使用 -dCompressPages=false -dCompressFonts=false -dCompressStreams=false。

当您通过 pdfwrite、MuPDF 和 pdfwrite 传递您的 PDF 时,您在每一步都冒着质量下降的风险,而中间的 MUPDF 步骤不太可能实现任何目标。您所做的很可能是降低任何 JPEG 压缩图像的压缩(和质量),我怀疑还有很多其他用途正在发生。

我想不出你为什么不想检测重复的图像,它实际上只是让文件变大,但如果你想用与所有其他 GS 开关相同的方式使用开关;-dDetectDuplicateImages=false。请注意,这不会改变处理速度(通常 pdfwrite 不进行渲染,但也许您的意思是在目标设备上......),通过在读取每个图像时对每个图像应用 MD5 过滤器来完成检测,然后比较 MD5 哈希值。关闭它并不会停止 MD5,它只会停止比较。

如果您发现 Ghostscript 的文档难以理解,请使用用于 distillerparams 的 Adob​​e 文档,这就是大多数 pdfwrite 设置的来源(即责怪 Adob​​e ;-)

-dFastWebView (IMO)完全没有意义,它纯粹是为了与 Adob​​e 兼容,并且因为很多人不会接受它的无用并坚持使用它。它所做的只是加速加载 PDF 文件的第一页,由支持它的 PDF 消费者(实际上没有)。为了做到这一点,它会使文件稍微更大更复杂。

不要使用-dNOGC,我一直告诉人们不要这样做,它是一个调试工具,除了可能使 Ghostscript 使用更多内存之外,它在生产中没有实际价值。你听到的其他一切都是货物崇拜。

-r 与媒体 szie 完全无关,并且(或多或少)与 pdfwrite 无关。它在渲染时设置页面的分辨率。由于您不想渲染到图像,因此设置分辨率并不是一件有用的事情。

没有 pdfwrite 设置依赖于“输入分辨率”,因为 PDF(和 PostScript)文件没有分辨率,它们是矢量页面描述。

-dDownscaleFactor 是一个仅适用于缩小设备的开关;tiffscaled 和朋友,它们是渲染设备,它对 pdfwrite 完全没有影响。

设置固定的媒体大小(使用-g)确实依赖于分辨率(因为它在设备像素中指定)并且确实只改变了媒体大小,而不是内容。如果要重新调整内容以适应新媒体,则需要使用 -dFitPage。我真的不明白你为什么要那样做。请注意,它不会影响 PDF 文件的内容(除非它是渲染图像),它只会使所有数字值变小。

pdfimage 设备确实会生成一个 PDF 文件,其中整个内容都是图像。由此得名....

现在,如果你能定义你真正想要实现的目标,我可以提出一些建议......

[编辑]图像下采样

首先,有三个控件可以完全打开/关闭此功能;

-dDownsampleMonoImages、-dDownsampleGrayImages 和 -dDownsampleColorImages。假设您没有选择 PDFSETTINGS(我建议您不要),这些最初都是错误的。如果要对任何图像进行下采样,则需要将相关的单色/灰色/彩色开关设置为 true。

启用下采样后,您需要设置相关的 ImageResolution 和 DownsamplingThreshold,每个颜色深度都有开关。

现在虽然PDF文件没有分辨率,但图像有一个有效的分辨率,但它不容易计算(实际上不费力气是不可能的)。它是位图中每个方向上的图像样本数,除以图像覆盖的媒体区域。

例如,如果我有一个 100x100 样本的图像,并将其放置在 1 平方英寸的页面上,则图像的分辨率为 100 dpi。如果我然后将图像放大,使其覆盖 2 英寸正方形(但不要更改图像数据),那么它的 50 dpi。

因此,您需要确定在您的设备上看起来合适的分辨率。然后设置 -dColorImageResolution=、-dMonoImageResolution、-dGrayImageResolution。

这就是“目标”分辨率。但是,如果图像已经接近该图像,则处理它可能会造成浪费,因此请参考下采样阈值。输入中图像的实际分辨率必须是目标分辨率乘以阈值,或者更多,才能降低输出。

例如,如果我们考虑 300 的目标分辨率和 1.5 的阈值,那么输入文件中图像的实际分辨率必须超过 450 dpi 才能考虑进行下采样。

显然你可以将阈值设置为 1.0 例如 -dColorImageDownsampleThreshold=1.0

最后是下采样类型,这是用于从较高分辨率图像创建较低分辨率图像的过滤器。最简单的是/Subsample;基本上扔掉足够多的行和列,直到我们达到所需的分辨率(这适用于单色图像的过滤器,因为所有其他过滤器都会改变颜色深度)。然后是 /Average ,它平均每个方向的值,实际上是一个双线性滤波器。最后是 /Bicubic,它可能做得“最好”,但处理速度最慢。

最重要的是,您可以选择用于写入图像数据的图像过滤器(压缩过滤器)。我们不支持 AGPL 版本的 Ghostscript 和 pdfwrite 中的 JPXEncode。剩下的就是 /CCITTFaxEncode(单色)DCTEncode (JPEG) 和 FlateEncode(基本上是 Zip 压缩)。即 MonImageFilter、GrayImageFilter 和 ColorImageFilter。

如果您想使用这些,您必须首先将 AutoFilterGrayImages 设置为 false 和/或 AutoFilterColorImages 设置为 false,因为如果这些为 true,pdfwrite 设备将通过查看哪个压缩最多来选择一种压缩方法。对于灰色和彩色图像,这几乎肯定是 JPEG。

最后一点是无法选择性地渲染线条(矢量数据);要么一切都被渲染,要么一切都保持“原样”。pdfwrite 呈现内容的唯一时间(通常)是存在 transaprecny 并且输出 CompatibilityLevel 不支持透明度(1.3 或更低)时。有例外,但它们非常罕见。

您可能需要考虑将 ColorConversionStrategy 设置为 /DeviceRGB 或 /DeviceGray。我不知道您使用的是彩色设备还是灰度设备,但如果它们是灰度设备,则创建灰色 PDF 文件会显着减小大小和处理。如果输入是 CMYK,为彩色设备创建 RGB 文件可能也很有意义。

于 2019-10-29T08:48:12.127 回答