用光栅图像替换 PDF 中的矢量图像

Posted

技术标签:

【中文标题】用光栅图像替换 PDF 中的矢量图像【英文标题】:Replacing vector images in a PDF with raster images 【发布时间】:2012-03-25 08:20:12 【问题描述】:

是否有任何简单(可编写脚本)的方法将带有矢量图像的 PDF 转换为带有光栅图像的 PDF?换句话说,我想生成一个 PDF,其文本完全相同(未光栅化),但每个矢量图像都替换为光栅化版本。

我偶尔会在 Kindle 上阅读技术文章的 PDF,并发现直接阅读 PDF 令人沮丧。值得庆幸的是,亚马逊的automatic conversion 将 PDF 转换为 Kindle 格式在重排我尝试过的大多数 PDF 的文本部分方面做得很好。然而,虽然光栅图像似乎可以很好地完成转换过程,但矢量图像却被严重破坏。如果我可以轻松地转换 PDF 以便其所有矢量图像都被光栅化,那就太好了。

我对任何可能的解决方案都感兴趣,但最好是基于 Linux 或 Windows 的解决方案。

【问题讨论】:

注意:这个问题最初是postedTeX site,但是那里的模组建议我在这里问。 您可以将所有页面导出为图像,然后使用这些图像创建 PDF。有很多应用程序可以做到这一点。我认为 imagemagick 和/或 ghostscript 的组合会做。对于程序员,我写了一篇题为“gnostice.com/… To Rasterize A PDF Document In .NET”的文章,它展示了如何使用我们的 PDFOne .NET 产品来做到这一点。 但我只想光栅化 PDF 中的图像/图形,而不是文本。我没有看到任何使用 ImageMagick 的方法。我来看看 Ghostscript。 @MichaelBoyer 除非您要求为给定框架(例如 .NET、JAVA、Windows、Linux)提供解决方案,否则这个问题似乎更适合 SuperUser 站点而不是 ***。 【参考方案1】:

我遇到了类似的问题,并使用 ImageMagics 转换工具 (http://www.imagemagick.org/script/index.php) 解决了它。它带有 linux 并且在 Windows/Cygwin 或 OS X 上运行良好

convert -density 300 largeVectorFileFromR.pdf out.pdf

使用 -density 300 您可以控制分辨率(作为 DPI)。

缺点:文本也被光栅化,我知道迈克尔不想要这个。

【讨论】:

遇到no images defined 错误的用户需要安装所需的ghostscript gs 依赖项。对于使用 Homebrew 的 MacOS 用户:brew install ghostscript【参考方案2】:

在寻找解决方案几天后,基于“Remove all text from PDF file”和“How to add a picture onto an existing pdf file?”,我找到了一个(丑陋的)可编写脚本的解决方案:

gs -o /tmp/onlytxt.pdf -sDEVICE=pdfwrite -dFILTERVECTOR -dFILTERIMAGE $INPUT_FILE && \
gs -o /tmp/graphics.pdf -sDEVICE=pdfwrite -dFILTERTEXT $INPUT_FILE && \
convert -density $DPI -quality 100 /tmp/graphics.pdf /tmp/graphics.png && \
convert -density $DPI -quality 100 /tmp/graphics.png /tmp/graphics.pdf && \
pdftk /tmp/graphics.pdf stamp /tmp/onlytxt.pdf output $OUTPUT_FILE && \
rm /tmp/onlytxt.pdf /tmp/graphics.pdf /tmp/graphics.png

我们是否有三个变量 INPUT_FILE、OUTPUT_FILE 和 DPI。我们通过 Ghostscript 拆分文本和图形内容,将图形图像转换为光栅图像 (PNG),并使用 pdftk 将两者连接起来。

我已经成功地使用它来转换巨大的矢量图像以用于科学论文。

【讨论】:

对于较新版本的 ImageMagick,默认情况下禁止对 PDF 进行此类操作,因此必须编辑 /etc/ImageMagick-7/policy.xml(参见 here) 也适用于可能想要为多页 pdf 执行此操作的人,pdftk 提供等效的 multistamp 选项【参考方案3】:

这有点复杂,但您要求任何可能的解决方案。此外,这个解决方案是不可自动化的。

1) 打开带有Inkscape 中矢量图像的pdf。然后用select工具(F1)选中整张图片

2) 如果矢量图像包含多个 svg 图形,请按 Ctrl + G(对象 --> 组)

3) 剪切分组的svg图片Ctrl + x

4) 打开一个新的 InkScape 窗口Ctrl + n 并粘贴图像Ctrl + v

5) 选择File --> export Bitmap (Shift + Ctrl + e),也许你想增加dpi

6) 回到第一个 InkScape 窗口,文件 --> 导入 (Ctrl + i) 并选择之前导出的位图

7) 将位图放置到 svg 图片所在的位置

保存pdf,矢量图像被位图图像替换。

【讨论】:

非常复杂且工作量很大。我正在寻找一个更自动化的版本,并认为这样的脚本应该存在于某个地方。 是的,我认为您需要一种可编写脚本的方式。但我想,在没有一个答案的 11 个月之后,我至少分享了一个可能的方法。【参考方案4】:

这是解决问题的一种方法:

第 1 步:使用在线 PDF 到 html 转换器,如下所示:

http://www.idrsolutions.com/online-pdf-to-html5-converter/

此工具将 PDF 转换为一组图像和文本叠加。此时应将矢量图像转换为光栅图像。

第 2 步:将 HTML+图像转换回 PDF:

http://pdfcrowd.com/#convert_by_upload+with_options

生成的 PDF 将对所有矢量图像进行光栅化,所有文本将保持为文本,因此您可以选择、复制等。

【讨论】:

对我来说的问题是,对于许多 pdf,pdf2html 无法正确解析 pdf,因此效率低下。 另一个问题是文本 within 图形应该与其余图形一起光栅化;例如,想想图表轴上的标签。此解决方案 (pdf2html) 将该文本保留为文本,因此生成的栅格化图形不完整。 另外,目前还不清楚如何将它用于多页的 PDF。 pdf2html 是基于 xpdf 的,因此它的功能不如一些较新的 PDF 库。我鼓励您下载(或尝试在线版本)链接到答案的 JPedal PDF-to-HTML 转换器。它允许为多个页面生成单个 HTML 文件。另外,您能否将示例 PDF 附加到问题中?我经常使用 PDF,也许能想出一些东西。 (与上述链接的网站没有关联。)【参考方案5】:

Enfocus 的 Pitstop Pro v2 更新 3 可以做到这一点。它有一个名为“光栅化页面内容,保留文本”的操作,效果很好。它是 Adob​​e Acrobat 的插件,因此需要更多功能,但也可用作服务器解决方案。

【讨论】:

欢迎来到***。上面的帖子可能会回答这个问题。但是更多的解释可能会帮助其他程序员了解它是如何工作的。【参考方案6】:

使用https://jwilk.net/software/pdf2djvu转换器将pdf转换为djvu。取消选中“antialias fonts,vectors..”。它将显着减小文件大小并缩短文档加载时间。

【讨论】:

【参考方案7】:

我使用了以下内容:

gswin32c -o "%2" -dFirstPage=1 -dLastPage=1 -sDEVICE=pngalpha -r72x72 -dUseCropBox -dFitPage "%1" -dBATCH -dNOPAUSE

其中%1 是输入文件,%2 是输出。这可以与 LaTeX 一起使用,生成的 PNG 与原始 PDF 具有相同的比例和页面大小,因此图像的相对位置不会改变。

请注意,在 Linux 中,您可能需要使用 gs 而不是 gswin32c

您还可以设置页面范围,然后将页面打印回 PDF。缺点是文本也会被光栅化。

【讨论】:

【参考方案8】:

inkscape 是最好的解决方案,我很快制作了这个未经优化的批处理文件,它完全可以做到这一点,您可以使用它并更改选项。 ImageMacick convert、gs 或 pdftoimages 效果不如inkscape 他们要么不导出图层,要么导出但质量很差:

#!/bin/bash
#set -xev
ORIGINAL_FOLDER=`pwd` 
JPEGS=`mktemp -d`
unzip "$1" -d "$JPEGS"
cd "$JPEGS"
# expang the pdf in pdf pages
pdftk combined_to_do.pdf burst output pg_%04d.pdf
#1) print the pdf's to pngs as they are seen with alpha, layers, transparency etc, this cannot be done by ImageMacick convert or pdftoimages
ls ./pg*.pdf | xargs -L1 -I   inkscape  -z --export-dpi=300 --export-area-drawing --export-png=.png
#2) Second change to jpgs
rm *.pdf
ls ./p*.png | xargs -L1 -I  convert   -quality 100 -density 300  .jpg
#3) This to make a pdf file out of every jpg image without loss of either resolution or quality:
ls -1 ./*jpg | xargs -L1 -I  img2pdf  -o .pdf
#4) This to concatenate the pdfpages into one:
pdftk *.jpg.pdf cat output combined.pdf
#5) And last I add an OCRed text layer that doesn't change the quality of the scan in the pdfs so they can be searchable:
pypdfocr combined.pdf
cp "$JPEGS/combined_ocr.pdf" "$ORIGINAL_FOLDER/$1_ocr.pdf"
cp "$JPEGS/combined.pdf" "$ORIGINAL_FOLDER/$1.pdf"

【讨论】:

以上是关于用光栅图像替换 PDF 中的矢量图像的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 11 PDF 图像资产“保留矢量数据”在 SwiftUI 中不起作用?

如何将 PSD 文件中的所有图层导出为 PDF 矢量以在 Xcode 6 中使用资产目录

使用 PDF 或矢量文件在 Android Studio 中添加所有尺寸的图像资源

UIImageView 中的矢量图像在 iOS 12 和 13 中呈现不同

以编程方式 Xcode 9 矢量图像

如何以编程方式将矢量图像放入 iOS 资产目录