- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我几乎不了解在这个数字世界中生存的能力。
我有许多一页后记文件(图形/图像),我希望将其转换为pdf并自动裁剪到一个狭窄的盒子中。我现在在Windows上(我也使用linux,所以请不要犹豫为linux发布代码)
过去,通过将Ghostscript gswin32c.exe和Calibre pdfmanipulate.exe结合在一起,我已经取得了成功。对于许多人来说,这可能是一种熟悉的方法。
但是,由于多种原因,这种方法充满了问题。
我“升级”到64位gswin64c.exe后出现了一个问题。 32位版本gswin32c.exe仍然可以在我的系统上使用,因此我不能提示太多。
处理可能未正确编码的后记文件时,出现了另一个问题。似乎至少有两个问题,但是我不确定哪个(如果有)是负责任的还是两者都有。一个问题是边界框线,例如
%% BoundingBox:135179484587
并不总是放在顶部的第二行。我了解这可能是个问题。另一个问题是,上面的边框对应于Ghostscript中的“纵向”方向,但是裁剪遵循“横向”方向。我还没有发现的另一个问题是,对于某些文件,裁剪似乎是非常随机的。
因此,这是我的32位方法(适用于高质量文件),然后是64位的适应方法,该方法不起作用(也许是因为,如果我了解https://bugs.launchpad.net/ubuntu/+source/calibre/+bug/800551和http://www.mobileread.com/forums/archive/index.php/t-103097.html,但我只是在猜测,不知道任何解决方法):
@echo off echo batch processing with Latex ps2pdf followed by Ghostscript gswin64c.exe and Calibre2 pdfmanipulate.exe for %%I in (*.ps,*.eps) do ( "C:\Program Files\MiKTeX 2.9\miktex\bin\x64\ps2pdf" %%I ) for %%I in (*.pdf) do ( "C:\Program Files (x86)\Ghostscript\gs9.00\bin\gswin32c.exe" -dSAFER -dNOPAUSE -dBATCH
-sDEVICE#bbox "%%I" 2> bounding "C:\Program Files (x86)\Calibre2\pdfmanipulate.exe" crop -o "%%~nICropped32.pdf" -b bounding "%%I" pause "C:\Program Files\Ghostscript\gs9.04\bin\gswin64c.exe" -dSAFER -dNOPAUSE -dBATCH
-sDEVICE#bbox "%%I" 2> bounding "C:\Program Files (x86)\Calibre2\pdfmanipulate.exe" crop -o "%%~nICropped64.pdf" -b bounding "%%I" pause )
I'm unsure why you are using 2 applications, it should be possible to perform the entire transformation with just Ghostscript.
"One problem arose after I "upgraded" to the 64 bit gswin64c.exe" You haven't said what the problem was, have you reported it as a bug ? If people don't report bugs, they don't get fixed......
我在此处提供了描述问题和错误报告的链接: https://bugs.launchpad.net/ubuntu/+source/calibre/+bug/800551,
http://www.mobileread.com/forums/archive/index.php/t-103097.html,
我的问题是完全相同的。
You seem to have some confusion between PostScript programs and comments. Any line in a PostScript program beginning '%' is a comment, and has no effect on the operation of the program. So BoundingBox comments won't do anything at all.
如果可以的话,我希望有所不同。提取一个脚本文件,删除%% Bounding Box,保存并在Ghostview中打开它。 Ghostview会抛出错误消息,然后在不使用边界框信息的情况下显示错误消息,例如一个被很多空白包围的图形,而不是被边界框紧紧地包围着。因此,是的,至少在Ghostview中,此注释可以执行某些操作。删除了%% Bounding Box之后,如果您随后使用Calibre/pdfmanipulate裁剪pdf,则在具有%% Bounding Box可以正常工作的情况下,它将错误地裁剪它。因此,此“注释”在显示和裁剪的上下文中非常有用。
Note there is no requirement for it to be the second line of the file.....
这是Adobe推荐的。引用Adobe的话,
“第二个必需的DSC header 注释提供了有关
EPS文件的大小,并且必须存在,以便包含的应用程序可以
正确地转换和裁剪EPS文件。这是边界框注释。”
http://partners.adobe.com/public/developer/en/ps/5002.EPSF_Spec.pdf
Adobe说“必须”。就我个人而言,只要可以从适当范围内的eps生成pdf,我就不会在乎是否必须。
In general Ghostscript ignores DSC comments, however if you set ProcessDSC to true, then it will make very limited use of it (primarily the BoundingBox comment to set the page size).
使用pdfmanipulate可以使正确裁剪的pdf和裁剪不正确的pdf完全不同。
Moving on. You say you are using LaTeX ps2pdf, if you already have a PostScript file, you can send that to Ghostscript for conversion to PDF. Its not clear to me what exactly you are using Ghostscript for in this case, simply to find the real bounding box of the page ?
是的。
Its not clear to me what you mean by 'lossless' cropping, if you crop the content you must be losing something clearly, even if its just white space.....
我的意思是我不希望裁剪过程“光栅化”整个图像(或称其为“术语”)。裁剪掉的文件部分对我没有用,所以损失不大。裁剪中的文件部分应具有与原始文件相同的质量。那是一般的想法。
您可以在这里找到有关此内容的评论,这是我找到有用信息的地方,
http://www.charlietanksley.net/philtex/reading-pdfs-on-portables/
Its easy enough to do the conversion in one pass if you know the size you want to crop to,
不,我不知道大小,这就是为什么我要花这么长的时间来让软件为我计算,显然这不是一件简单的事情,因为Ghostscript和epstopdf并不总是就最佳裁剪达成共识,一个得到它适用于某些文件,但不适用于其他文件,另一种适用于其他文件,但不适用于某些文件...
if you don't know the size then you can do it in 2 passes using only Ghostscript by first extracting the BoundingBox as you have done. That will get you 4 numbers, the bottom left and top right of the bounding box (if I remember correctly). You then create a 'translate' PostScript operation to move the content of the page down and left (so that it starts at 0,0, the bottom left corner). You also create a page device request to set the page size, the size being given by width = right - left and height = top - bottom. Feed the original file, along with the PostScript operators, to Ghostscript and select the pdfwrite device and you will get a PDF file.
如果您有一个方便的话,批处理文件示例将是一个很好的选择。我已经看到了几个基于pdfwrite的示例,但我尝试过的都没有用。细节在于魔鬼。
As far as the bounding box goes, it may be a bug, or it may be that the file makes a mark, potentially using a white ink at the outside location. In this case the bounding box device will still regard it as part of the page content. You may be able to see that it isn't, but the device cannot. Consider if the page was first filled with a dark background, and the content outlined using white ink.
这些文件都是使用Matlab,Maple,PSTricks等软件创建的,在%% Bounding Box所指定的区域之外,不太可能(但显然并非不可能)出现看不见的白色标记。
在许多情况下,%% Bounding Box注释包含所有需要的信息,我希望使用Ghostscript或Calibre或pdfwrite或任何可以使用该信息的人。
I cannot offer a comprehensive solution without understanding more about what you want to do, and ideally seeing one or more of your problematic files.
那将是非常容易的,我如何发布一个postscript文件供您查看?这是420 KB。
感谢Ken,希望我们能找到一个可行的解决方案。
编辑3.我已经确定了问题的很大一部分。
我的postscript文件具有以下边界框,非常接近最佳裁剪:
%% BoundingBox:135179484587
当我运行Ghostscript gswin64c/gswin32c计算边界框时,即
for %%I in (*.ps,*.eps) do ("C:\Program Files\Ghostscript\gs9.04\bin\gswin64c.exe" -dSAFER -dNOPAUSE -dBATCH -dAutoRotatePages=/None -sDEVICE#bbox "%%I" 2> bounding)
我得到:
%%BoundingBox: 145 189 475 574 %%HiResBoundingBox: 145.331574 189.485994 474.155986 573.299983
当我运行ps2pdf后跟Ghostscript gswin64c时,即
for %%I in (*.ps,*.eps) do ("C:\Program Files\MiKTeX 2.9\miktex\bin\x64\ps2pdf" %%I)
for %%I in (*.pdf) do ("C:\Program Files\Ghostscript\gs9.04\bin\gswin64c.exe" -dSAFER -dNOPAUSE -dBATCH -dAutoRotatePages=/None -sDEVICE#bbox "%%I" 2> bounding)
我得到以下边界框:
%%BoundingBox: 189 137 574 467 %%HiResBoundingBox: 189.395994 137.843996 573.299983 466.668478
因此,问题在于,使用ps2pdf从ps转换为pdf会导致边界框信息发生变化,从而导致裁剪错误。因此,用诸如eps2pdf之类的其他东西替换ps2pdf可以解决这里的问题。当然,还有其他解决方案。正如Ken和luser droog所建议的那样,仅涉及Ghostcript的解决方案特别有值(value)。下面是他们非常有值(value)的建议(优于我的快速解决方案)。这样的事情已经奏效了:
for %%I in (*.eps,*.ps) do ("C:\Program Files\MiKTeX 2.9\miktex\bin\x64\epstopdf" %%I)
for %%I in (*.pdf) do (
"C:\Program Files\Ghostscript\gs9.04\bin\gswin64c.exe" -dSAFER -dNOPAUSE -dBATCH -dAutoRotatePages=/None -sDEVICE#bbox "%%I" 2> bounding
"C:\Program Files (x86)\Calibre2\pdfmanipulate.exe" crop -o "%%~nICropped.pdf" -b bounding "%%I"
)
最佳答案
评论中没有足够的空间来添加此内容,所以我恐怕还要发布另一个答案...。
BoundingBox对于PDF文件而言似乎是伪造的,原因是PDF转换过程的功能。默认情况下,它将旋转页面,直到文本的大部分变为水平为止(对于此文件(我认为其他文件也存在相同的问题)),这将导致顺时针旋转90度。
当然,这意味着边界框也会旋转,并且检查值表明这已经发生了。因此,BoundingBox对于旋转的PDF文件是正确的。
现在,我通过私有(private)电子邮件提供了几个PostScript程序,这是我的意思:
1pass.ps
这将从源PostScript文件中读取BoundingBox行,并使用它来设置页面大小和偏移量。您通过使用提供的文件设置'SourceFileName'例如,传递要使用的文件名:
gs -sDEVICE=pdfwrite -sSourceFileName=classic.ps -o out.pdf 1pass.ps
%!PS %% redefine setpagedevice to prevent changes by the PostScript program %% But keep a copy under a different name, so we cna use it. /Oldsetpagedevice /setpagedevice load def /setpagedevice {pop} bind def (File to process is ) print SourceFileName == /SourceFile SourceFileName (r) file def /BoxString 65535 string def /LLx 0 def /LLy 0 def /URx 0 def /URy 0 def /FoundBox false def /GetValues { token { % read a PostScript token /LLx exch def % Assume its a number for now token { /LLy exch def token { /URx exch def token { /URy exch def pop % Get rid of any remaining string data true % return success code }{ (Failed to read a number from the string) == false % return failure code } ifelse }{ (Failed to read a number from the string) == false % return failure code } ifelse }{ (Failed to read a number from the string) == false % return failure code } ifelse } { (Failed to read a number from the string) == false % return failure code } ifelse } bind def { SourceFile BoxString readline { (%%BoundingBox:) anchorsearch { pop %% discard matching string GetValues %% extract BBox /FoundBox exch def %% Note success/failure exit %% exit this loop } { pop %% discard string, no match } ifelse } { (Failed to find a %%BoundingBox comment) == exit %% No more data, exit loop } ifelse } loop SourceFile closefile %% close the file FoundBox { (LLx = ) print LLx == (LLy = ) print LLy == (URx = ) print URx == (URy = ) print URy == > Oldsetpagedevice LLx neg LLy neg translate SourceFileName run } if
This is intended to be used the way you are currently working, it has two advantages over 1pass.ps
:
%%BoundingBox
comment.It has the disadvantage that you have to process each file twice, once to get the bounding box and once to create the PDF file.
This takes two parameters, the name of the file containing the output of the bbox device, and the name of the file to be converted. Again, using the file you sent, you would use it like this:
gs \
-sDEVICE=bbox \
classic.ps 2> bounding.txt
gs \
-sDEVICE=pdfwrite \
-sBoxFileName=bounding.txt \
-sPostScriptFileName=classic.ps \
-o out.pdf \
2pass.ps
classic.ps
的PostScript代码:
关于pdf - 批量转换并将裁剪后记转换为pdf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8711969/
这是我在阅读了几个关于 jpa 批量插入的主题后创建的简单示例,我有 2 个持久对象用户和站点。一个用户可以有多个站点,所以我们在这里有一对多的关系。假设我想创建用户并将多个站点创建/链接到用户帐户。
我有文档列表(对象),该对象有多个文档,即存在 Json 记录,但是当我尝试上传文档束(记录)时,它没有上传到文档数据库,但当我上传单个文档记录时,它上传成功。 List listObj = ne
我希望进行批量域名查找,看看是否有一些域名可供购买。我找不到 perl 模块,但似乎应该有一种方法可以在 perl 中执行此操作。我正在寻找免费的东西。谢谢! 最佳答案 从这里:http://www.
我制作了一个批处理类来检查 FTP 上的文件、下载它们并在 FTP 上删除它们。 当我手动运行它(不是批量运行)时,它运行完美,下载 FTP 中的所有文件并在下载完成后删除它们。 当我尝试批量运行时,
我有一个 *+* 形式的字符串 base。我想得到+之前的所有内容。例如,如果 base=foo+bar,我想获取 foo。 我尝试过使用字符串替换来实现 set left=%base:+*=% 但这
我需要创建几十个表,并且我需要它们是innodb, 有没有办法做到这一点,而不是将 engine=innodb 附加到每个 create table 语句? 最佳答案 可以在服务器级别指定默认引擎,在
我正在尝试制作显示 unix/linux 提示符的 dos shell。代码是: @echo off :hi set tmpdrv=%cd:~0,2% if %homedrive% == %tmpdr
我有以下代码,基本上是在二维矩阵的每一行上进行一维卷积。卷积核是一样的。所以真的是 SIMD 案例。 a = [ 1,2,3,4,5; 6,7,8,9,7; 7,6
情况: 我尝试在 shell 中的循环内移动文件,但我的代码无法正常工作。 for /D %%F in (*) do ( if "%%F" NEQ "%directoryToPutFilesIn
目录包含 2 个(或更多)任意名称的视频文件。 video1.mkv video2.mkv 需要找出每个视频的持续时间。为此,我们使用 MediaInfo . setlocal EnableDelay
如何在 Windows 中批量删除数千个文件中的空格(而不是替换为下划线)?我可以从 DOS 命令执行此操作吗? 目前: file one.mp3 file two.mp3 所有文件需要变成: fil
我想创建一个批处理文件,它读取 2 个不同的值,并根据它们的比较方式进行相应处理。但是,比较永远不会起作用。代码是: REM string1 and string2 contain the follo
我正在尝试将一个文件夹的子文件夹复制到许多其他名称未知的文件夹中。目的是在所有使用它的员工文件夹中备份程序的源文件。如果在员工文件夹中找不到程序文件夹,则不应执行任何操作。这看起来如下: 来源: F:
我正在寻找一种简单的方法来检测一小段文本(几句话)是否为英语。在我看来,这个问题比尝试检测任意语言要容易得多。有没有可以做到这一点的软件?我正在用 python 编写,并且更喜欢 python 库,但
我们正在尝试向 8k 种不同的设备发送促销推送消息。我们正在成功响应推送通知 URL https://fcm.googleapis.com/fcm/send 但只有部分用户收到此通知,并非全部。那么
基本上我只是用这一段来替换我的 var 中的一个字符串,但我无法让嵌套延迟扩展正常工作。这甚至可能吗? set replace=!replace:!search!=!replaceVal!! 我知道执
如何使用 ffmpeg 对一批视频文件进行编码,使用相同的设置? 我找到了 one-line solution将当前文件夹中的 .avi 文件转换为 .mov。请注意,我要编码 .mov -> .mo
我正在尝试制作一个批处理文件,每次循环时都会将变量增加 1,然后检查变量是否等于 5,如果不是,则再次循环。我知道这可能有一个 while 循环,但我不知道如何做到这一点,我现在只是享受学习 Batc
我正在尝试创建一个循环,读取多个 CSV 文件,这些文件都具有相同类型的气温数据。但是,我想跳过数据上方的行。这些是数据集中的“警报”。每个文件可能有不同数量的警报,因此要跳过不同数量的行。见下文:
因此,我正在批量创建一个Mail程序,而消息传递部分出现了问题。 消息传递部分是无限循环。 当我输入多个单词时,它会崩溃。 这是代码。请帮忙! :rep set line= set /p line=
我是一名优秀的程序员,十分优秀!