问题的最大部分在标题中......
我有由串联扫描文档制成的大型 pdf 文件,这些文件类似于新闻文章:文本+图像。重要的是文字,不是图片……
这就是为什么我想(根据这篇文章)将pdf中的所有图像压缩为png或gif......
感谢您的所有建议,我已经花了太多时间来尝试优化我的 Ghostscript 命令行选项 :-p
仅供参考,我当前的 Ghostscript 9.14 命令行在生产中:
gs -q -sDEVICE=pdfwrite \
-dSAFER -dNOPAUSE -dBATCH -dQUIET -dPDFSETTINGS=/ebook \
-dColorImageResolution=150 -dGrayImageResolution=150 -dMonoImageResolution=800 \
-dPreserveOPIComments=false -dPreserveOverprintSettings=false \
-dUCRandBGInfo=/Remove -dProcessColorModel=/DeviceRGB -dMaxInlineImageSize=0 \
-dDetectDuplicateImages=true -dFastWebView=false -dUseFlateCompression=true \
-dAutoFilterGrayImages=false -dAutoFilterColorImages=false \
-dColorImageDownsampleThreshold=1.2 \
-sOUTPUTFILE=/tmp/screen_20140602103745.pdf \
-c "512000000 setvmthreshold /QFactor 0.80 /Blend 1 /ColorTransform 1 /HSamples [2 1 1 2] /VSamples [2 1 1 2]" \
-f /usr/bases/dicodrp/pdf/pdf_concatenes/20140602103745.pdf
Run Code Online (Sandbox Code Playgroud)
我得到了大约 40% 的压缩率和一些可读性,但我认为我可以通过更改图像压缩类型来提高可读性(我得到了嘈杂的 jpg 伪像......)
不,我无法增加 dpi,因为这会增加文件大小...:-)
我正在使用 Tess4J(Tesseract 的 JNA 包装器),并尝试tess.doOCR(myFile)从单页 PDF 调用 OCR 文本。
我安装了 GhostScript(通过使用yum install ghostscript),gs -h工作正常。
我的应用程序服务器正在使用64-bit JVM,并且我有gsdll64.dll,以及 64 位 tesseract dll 的liblept168.dll和libtesseract302.dll在类路径中。
tess.doOCR(myFile)调用时,会记录以下内容:
GPL Ghostscript 8.70 (2014-09-22)
Copyright (C) 2014 Artifex Software, Inc. All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Processing pages 1 through 1.
Page 1
Run Code Online (Sandbox Code Playgroud)
但随后就到此为止了。该计划不再继续。
更新 -
看起来真正的问题来自这个错误:
java.lang.UnsatisfiedLinkError: Unable to load library 'tesseract': Native …
正如标题所说。
严格来说,我为灰度图像定义的“文本”边界框是一组 4 个坐标(x、y、x+宽度、y+高度),它们必须在该图像中定义一个矩形区域,该区域具有最大数量的矩形区域。非白色像素,同时尽可能少的白色像素(不改变非白色像素的最大数量)。我将文本放在引号中,因为图像实际上并不包含文本,因为图像只包含带有颜色的像素。
在我的 Ubuntu 中安装 ImageMagick 并在终端中输入命令:$convert input.png -trim ouput.png,我得到:
在网络浏览器的新选项卡中打开这两个图像,您将了解它们的区别,并且您还将了解我定义的“文本”边界框。output.png 实际上具有我正在寻找的宽度和高度。我不知道如何获取 x 和 y 坐标。
这里提供的 pdf 页面的答案 (1)不符合我的标准,因为 gs 给我的“文本”边界框有很大的白边距(实际上据我所知,gs 定义为“文本”边界框的内容) pdf 与我对图片的“文本”边界框的定义不同)。
我在将多页 pdf 转换为 tiff 时遇到以下问题:
gswin64c.exe -dNumRenderingThreads=8 -dQUIET -dNOPAUSE -dBATCH -sDEVICE=tiffscaled -sCompression=g4 -r300 -o out.tiff in.pdf
Run Code Online (Sandbox Code Playgroud)
in.pdf是带有嵌入图像(即扫描页)的多页 pdf。
从命令行运行时(“gswin64c.exe 停止工作”),在我的 Windows 64 位环境中,命令崩溃(但并不总是在同一页面上),没有 STDERR 写入控制台。我使用最新的 Ghostscript 版本(9.18)。
仅当我使用-dNumRenderingThreads=1.
这可能是什么原因?
编辑:在版本 9.15 中,转换运行良好,从 9.16 开始,它不再工作。
系统日志错误条目显示:
Faulting application name: gswin64c.exe, version: 0.0.0.0, time stamp: 0x56123d41
Faulting module name: gsdll64.dll, version: 0.0.0.0, time stamp: 0x56123d3d
Exception code: 0xc0000005
Fault offset: 0x000000000007b930
Faulting process id: 0x197c
Faulting application start time: 0x01d16325677e4e24
Faulting application path: C:\Program Files\gs\gs9.18\bin\gswin64c.exe
Faulting module path: C:\Program …Run Code Online (Sandbox Code Playgroud) Ghostscript 有描述如何创建 PDF/A 的文档。我知道该怎么做。
我不明白的是为什么这个过程是必要的。尤其:
-sOutputICCProfile)?不能从颜色转换策略或印刷色模型的选择中推断出默认值吗?PDFA_def.ps文件路径?如果没有指定路径,为什么 Ghostscript 不能假设我指的是它自己的 ICC 配置文件之一?pdfa_def.ps看起来像 Ghostscript 在大多数情况下可以生成的样板文件并具有合理的默认值?(/DOCINFO 块可以通过命令行传递;ICC 配置文件块似乎是根据命令行参数自行生成的;输出意图字典只需要 Ghostscript 已经知道的颜色配置文件名称。)就此而言,颜色转换适用于文档中的图像还是仅适用于 Postscript 绘图?
我的目录中有很多pdf文件,我需要将其从pdf转换为png。目前,我正在使用 ImageMagick 命令: magick mogrify -format png *.pdf
因为文件太多,我想直接使用 Ghostscript,因为有多个来源表明这样做可以减少 75% 的处理时间。
但是,我很难找到一个干净的 dos 命令示例来完成与上面的 ImageMagick 命令相同的事情。我相信我需要执行 gswin64c.exe 模块,但我不确定如何执行此操作来完成我需要完成的任务。有人能给我提供一个干净的 Ghostscript 示例来完成我在 ImageMagick 中所做的事情吗?
我有一个 shell 脚本,我一直用它来合并 PDF,在今天之前,它似乎工作得很好。
现在,当我运行时,我收到消息:GPL Ghostscript 9.06:不可恢复的错误,退出代码 1
它会生成一个空白 PDF,而不是合并的 PDF。这是我的代码:
<?php
$pdf1 = "file_1.pdf";
$pdf2 = "file_2.pdf";
$fileArray= array($pdf1,$pdf2);
$datadir = "/usr/pdf_merge/merged";
$outputName = $datadir."merged_new.pdf";
$cmd = "gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=$outputName ";
//Add each pdf file to the end of the command
foreach($fileArray as $file) {
$cmd .= $file." ";
}
$result = shell_exec($cmd);
Run Code Online (Sandbox Code Playgroud)
有什么想法可能是错的吗?
我在 Debian 上运行 Apache。
谢谢
我正在尝试将ghostscript用于其预期目的,以解释postscript文件和输出png.我想要一个命令,将单个特定页面从多页ps文件转换为单个png.我已经在infile是pdf文件的情况下完成了这个,但是当infile是ps时却没有.
此行将ps转换为由连接的png文件组成的文件.
gs -dSAFER -dBATCH -sDEVICE=png256 -r96x96 -sOutputFile=out.png in.ps
这将从pdf中获取单个特定页面并将其转换为png.
gs -q -dSAFER -dBATCH -dFirstPage=2 -dLastPage=2 -sDEVICE=png256 -SOut=fileout.png in.pdf
简单地将dFirstPage=标志放在后脚本输入案例中什么都不做.输出与标志不存在的输出相同.
PDF格式的Ghostscript合并导致方向翻转
我正在使用与此问题类似的方法: 如何将两个postscript文件合并在一起?
在合并的PDF上,每对页面都颠倒翻转.我还没有看到它在其他任何地方提到过这种症状.合并一个麻烦的pdf仍然有颠倒的方向.
@echo off
REM FILE: merge.bat
call :merge 1 155 out.pdf
pause
goto :eof
REM MERGE PDFs
REM @param # of first file in sequence
REM @param # of last file in sequence
REM @param new file of merged pdf
goto :eof
:merge
SET START=%1
SET END=%2
SET OUT=%3
echo START=%START%
echo END=%END%
echo OUT=%OUT%
echo.
SET CMD="c:\Program Files\gs\gs9.01\bin\gswin32c.exe"
SET INPUT_DIR=c:\input
SET CMD_ARGS=args.bat
echo Generating args file...
(echo.|set /p="-dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=%OUT% ") > %CMD_ARGS%
for …Run Code Online (Sandbox Code Playgroud) 如果它包含颜色,我需要转换灰度的pdf.为此,我找到了一个脚本,可以确定pdf是否已经是灰度级.
convert "source.pdf" -colorspace RGB -unique-colors txt:- 2> /dev/null \
| egrep -m 2 -v "#([0-9|A-F][0-9|A-F])\1{3}" \
| wc -l
Run Code Online (Sandbox Code Playgroud)
这会计算文档中存在多少种具有不同RGB值的颜色(因此它们不是灰色的).
如果pdf不是灰度文档,我继续使用ghostscript进行转换
gs \
-sOutputFile=temp.pdf \
-sDEVICE=pdfwrite \
-sColorConversionStrategy=Gray \
-dProcessColorModel=/DeviceGray \
-dCompatibilityLevel=1.4 \
-dNOPAUSE \
-dBATCH \
source.pdf < /dev/null
Run Code Online (Sandbox Code Playgroud)
如果我用PDF查看器打开输出文档,它会正确显示没有颜色.但是如果我在新生成的文档上尝试第一个脚本,结果证明它仍然包含一些颜色.如何将文档转换为精确灰度?我需要这个,因为如果我用彩色打印机打印这个文件,打印机将使用颜色而不是黑色打印灰色.
ghostscript ×10
pdf ×6
imagemagick ×3
linux ×2
apache ×1
bash ×1
compression ×1
debian ×1
file ×1
grayscale ×1
jpeg ×1
php ×1
png ×1
postscript ×1
superuser ×1
tess4j ×1
tesseract ×1
tiff ×1