【问题标题】:How can I use Ghostscript to pre-process pdfs for older Kindles?如何使用 Ghostscript 为旧版 Kindle 预处理 pdf?
【发布时间】:2019-10-29 06:33:25
【问题描述】:

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

在不光栅化的情况下预处理 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 -dColorImageDownsampleThreshold=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=灰色\ -dDownsampleColorImages=true -dDownsampleGrayImages=true -dDownsampleMonoImages=true -dColorImageResolution=75 -dGrayImageResolution=75 -dMonoImageResolution=150 -dColorImageDownsampleThreshold=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 如果您想剪切所有图形。

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

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

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

对于扫描的 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 -分贝

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

【问题讨论】:

    标签: pdf ghostscript kindle


    【解决方案1】:

    您在这里问了很多问题,这使得阅读和中肯地回答变得相当困难。您还没有真正明确说明您想要实现什么(您也没有说明您使用的是什么版本的 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 的文档难以理解,那么请使用 Adob​​e 的 distillerparams 文档,这就是大多数 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 平方英寸(但不要更改图像数据),那么它的 dpi 为 50。

    因此,您需要确定在您的设备上看起来合适的分辨率。然后设置 -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 文件可能也很有意义。

    【讨论】:

    • 我想修复 pdf 文件,使它们不会减慢、冻结或使我的 Kindle 崩溃,以便我可以阅读它们。 Willus 的 k2pdfopt(带有 -mode copy -dev dx)可以做到这一点,但它会光栅化所有内容。所以它适用于扫描的 pdf,但可能不是 pdf-born-pdf 的最佳选择。 Ghostscript 有时可以做到这一点,但并非总是如此。有时生成的文件太大,或者太慢,或者让我的 Kindle 崩溃。
    • “当您通过 pdfwrite、MuPDF 和 pdfwrite 传递您的 PDF 时,您每一步都有质量下降的风险,”所以?我通常保留原件,我只是想为我的 Kindle 创建 Kindle 可读的副本。 “而中间的 MUPDF 步骤不太可能取得任何成果。”它减少了文件大小和加载时间。我不太清楚为什么。除其他外,我正在尝试减少文件大小和加载时间。尤其是加载时间。
    • 我怀疑是通过 MuPDF 的步骤(尤其是在加载时间方面)。它最有可能是别的东西,可能将图像双重转换为 JPEG,从而减少图像数据。当然,没有例子是不可能的。我认为告诉其他潜在读者一个 PDF 文件的多次转换会降低质量很重要,人们经常带着其他目的阅读这些线程并且不了解细节,所以我想说明后果。
    • 恐怕“修复 pdf 文件,以免它们变慢....”对您的目标的描述不够技术性。我不知道为什么您的 Kindle 对特定的 PDF 文件有问题,因为我没有 Kindle 并且对它的软件一无所知。如果您可以在 PDF 文件中描述您想要的内容,我可以告诉您如何实现,但我无法告诉您 Kindle 崩溃的原因。
    • 哇,我见过的 GS 图像压缩的最佳写法。干杯!
    猜你喜欢
    • 1970-01-01
    • 2023-04-08
    • 2010-12-12
    • 2015-04-13
    • 2019-07-10
    • 1970-01-01
    • 2011-09-08
    • 2014-05-07
    • 1970-01-01
    相关资源
    最近更新 更多