如何使用Ghostscript预处理旧版Kindle的pdf?

时间:2019-10-29 06:33:25

标签: pdf ghostscript kindle

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

在不光栅化的情况下预处理pdf的好方法是什么?

[当可接受栅格化时:

  • k2pdfopt-用于地图或小文本的模式副本。这样可以栅格化,增强对比度,并使所有图像都兼容1.4。

  • k2pdfopt -mode复制-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如果要剪切所有图形。

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

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

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

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

设置了Mac Automator
  

k2opt -mode复制-dev dx

或偶尔只是-mode复制。

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

  

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.   
  3. 用mutool clean -g -g -d -s -l清除垃圾,然后
  4.   
  5. gs   -sDEVICE = pdfwrite -dCompatibilityLevel = 1.4 -sstdout =%stderr -dNOPAUSE -dQUIET -dBATCH再次获得更小的更快的pdf。
  6.   

注意:我认为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

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

1 个答案:

答案 0 :(得分:0)

您在这里问了很多问题,这使阅读和回答变得相当困难。您尚未真正明确说明要实现的目标(也没有说出正在使用的GS和MuPDF版本)。

这里有几点;

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

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

当您先通过pdfwrite传递PDF,然后再传递MuPDF,然后再次传递pdfwrite时,您将冒着每一步质量下降的风险,而MUPDF的中间步骤则不可能实现任何目标。您很可能正在做的事情是减少任何JPEG压缩图像的压缩(和质量),我怀疑还有很多其他用途。

我不知道为什么您不希望检测到重复的图像,它实际上只是使文件变大了,但是如果您要使用该开关,则与其他所有GS开关一样; -dDetectDuplicateImages = false。请注意,这不会改变处理速度(通常pdfwrite不会渲染,但也许您的意思是在目标设备上...),通过对读取的每个图像应用MD5过滤器来完成检测,然后比较MD5哈希值。关闭该功能不会停止MD5,只会停止比较。

如果您发现很难遵循Ghostscript的文档,请使用distillerparams的Adobe文档,这是大多数pdfwrite设置的来源(例如,应归咎于Adobe;-)

-dFastWebView(IMO)完全没有意义,它纯粹是为了与Adobe兼容,并且因为很多人不会接受它的无用并坚持使用。它所做的只是加快支持它的PDF使用者(几乎没有)加载PDF文件首页的速度。为此,它会使文件稍大且更复杂。

不要不要使用-dNOGC,我一直告诉人们不要这样做,它是一个 debugging 工具,除了潜在地制作Ghostscript之外,它在生产中没有任何实际价值。使用更多的内存。您听到的所有其他消息都是对货物的崇拜。

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

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

-dDownscaleFactor是仅适用于缩小设备的开关;作为渲染设备的tiffscaled和friends,它对pdfwrite完全没有影响。

设置固定的介质大小(使用-g)确实取决于分辨率(因为在设备pixesl中指定了分辨率),并且确实仅改变了介质大小,而不是内容。如果要缩放内容以适合新媒体,则需要使用-dFitPage。我真不明白你为什么要这么做。请注意,它不会影响PDF文件的内容(除非呈现的是图像),只会使所有数字值变小。

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

现在,如果您可以定义自己真正想要实现的目标,那么我可以提出一些建议.....

[ EDIT ] 图像降采样

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

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

一旦启用了降采样功能,则需要设置相关的ImageResolution和DownsamplingThreshold,每种颜色深度都有一个开关。

现在,尽管PDF文件没有分辨率,但是图像具有有效的分辨率,但是它不容易计算(实际上,无需付出很多努力,这是不可能的)。它是位图中每个方向上图像样本的数量除以图像所覆盖媒体的面积。

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

因此,您需要确定设备上哪种分辨率看起来可以。然后,您设置-dColorImageResolution =,-dMonoImageResolution,-dGrayImageResolution。

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

例如,如果我们考虑目标分辨率为300且阈值为1.5,则输入文件中图像的实际分辨率必须超过450 dpi才能进行下采样。<​​/ p>

很明显,您可以将阈值设置为1.0,例如-dColorImageDownsampleThreshold = 1.0

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

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

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

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

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