【问题标题】:Rotating PDF's less than 90 degrees旋转 PDF 小于 90 度
【发布时间】:2015-04-11 01:58:09
【问题描述】:

我正在处理一堆 PDF 文件,其中一些文件以某种角度进行了扫描。 Adobe Acrobat 允许我将 PDF 文件旋转 90 或 180 度。但是有没有办法将 PDF 旋转几度 - 刚好足以使它更直?

我或许可以截取一张屏幕截图,在 Photoshop 中打开并旋转它,然后以某种方式将 Photoshop 文件转换为 PDF。但是,这似乎是一个非常笨拙的过程。

【问题讨论】:

    标签: pdf


    【解决方案1】:

    PDF 仅支持完整的 页面 /Rotate 90 度值,因为(当然)很简单。您需要做的是旋转内容,而不是页面。因此,您需要使用可以为您重新制作 PDF 文件的东西。

    您可以使用 Ghostscript 或 MuPDF 来执行此操作。两者都需要一些编码:

    • MuPDF 需要使用 C 编码,
    • Ghostscript 将要求您进行一些 PostScript 编程。

    使用 Ghostscript,您需要定义一个 BeginPage 过程,该过程将内容旋转少量并稍微移动内容的原点(因为旋转围绕原点旋转,原点位于左下角,而不是中心)。

    【讨论】:

      【解决方案2】:

      这是一个用于旋转页面的简短实用脚本(用 Perl 编写)。它将输入 PDF 的每一页转换为 PDF XObject 表单,旋转表单,然后输出旋转后的页面。

      #! /usr/bin/perl                                                                                                                      
      use warnings; use strict;
      use PDF::API2;
      use Getopt::Long;
      
      my $degrees = 3;
      my $scale = 1.0;
      my $x = 0;
      my $y = 0;
      GetOptions ("rotate=i" => \$degrees, "scale=f" => \$scale, "x=f" => \$x, "y=f" => \$y)
          or die "usage: $0 IN_PDF OUT_PDF --rotate=DEG --scale=ALPHA --x=POINTS --y=POINTS";
      
      my $infile = shift (@ARGV);
      my $outfile = shift (@ARGV);
      
      my $pdf_in = PDF::API2->open($infile);
      my $pdf_out = PDF::API2->new;
      
      foreach my $pagenum (1 .. $pdf_in->pages) {
      
          my $page_in = $pdf_in->openpage($pagenum);
          #                                                                                                                                 
          # create a new page                                                                                                               
          #                                                                                                                                 
          my $page_out = $pdf_out->page(0);
      
          my @mbox = $page_in->get_mediabox;
          $page_out->mediabox(@mbox);
      
          my $xo = $pdf_out->importPageIntoForm($pdf_in, $pagenum);
          #                                                                                                                                 
          # lay up the input page in the output page                                                                                        
          # note that you can adjust the position and scale, if required                                                                    
          #                                                                                                                                 
          my $gfx = $page_out->gfx;
          $gfx->rotate($degrees);                                                                                                               
          $gfx->formimage($xo,  $x, $y, $scale);
      }
      
      $pdf_out->saveas($outfile);
      

      您需要确保从 CPAN 安装 PDF::API2Geopt::Long 模块。

      脚本默认逆时针旋转 3 度,可通过 --rotate 选项进行配置。

      还有-x-y--scale选项允许微调输出页面的位置和比例。

      【讨论】:

        【解决方案3】:

        unix.stackexchange.com 上也有人问过这个问题。

        另一种选择是使用 LaTeX:

        \documentclass{standalone}
        \usepackage{graphicx}
        
        \begin{document}
        \includegraphics[angle=-1.5]{odd-scan}
        \end{document}
        

        在这种情况下,我将文件 odd-scan.pdf(稍微旋转一页扫描)与 LaTeX 文件 rotated.tex 与上面的内容放在同一文件夹中,然后运行 ​​pdflatex rotated.tex。输出是一个文件rotated.pdf,PDF 顺时针旋转了 1.5 度。

        【讨论】:

          【解决方案4】:

          (我假设是 *nix 风格的环境。在 Windows 上,您可以按照 Cygwin 中的这些说明进行操作,尽管我认为您可能必须在那里构建 MuPDF from source,因为它似乎不在 Cygwin 中存储库。如果您不想这样做,并且可以对 PDF 进行光栅化,ImageMagick 位于 Cygwin 存储库中,如果需要,可以完成整个工作 - 见下文。)

          MuPDF 的mutool 实用程序可以做到这一点。假设您有一个 PDF 文件 rotate_me.pdf,并且您想要将其顺时针旋转 20° 的版本写入文件 rotated.pdf

          #!/bin/bash
          
          mutool draw -R 20 -o rotated.pdf rotate_me.pdf
          

          (mutool draw docs)

          您还可以使用mutool convert 对 PDF 进行光栅化,处理图像文件,然后从它们创建一个新的 PDF(假设 rotate_me.pdf 有一百到一千页 - 将%3d 编辑到您的喜欢):

          #!/bin/bash
          
          # - for whatever reason convert's `rotate` is counter-clockwise
          # - %nd is replaced with the page number
          mutool convert -O rotate=-20 -o 'rotated_%3d.png' rotate_me.pdf
          

          (mutool convert docs)

          完成图像文件所需的任何其他操作并准备好将它们转换回 PDF 后,您可以使用 ImageMagick

          #!/bin/bash
          
          magick convert $(ls | grep -P 'rotated_[0-9]{3}\.png') rotated_finished.pdf
          

          (如果您收到错误消息说 PDF 的安全策略不允许这样做,您可能需要编辑 /etc/ImageMagick-7/policy.xml 并注释掉或删除 <policy domain="coder" rights="none" pattern="PDF" /> 行。请注意 this Ghostscript pre-v9.24 vulnerability 哪个安全策略可能旨在缓解。如果您正在使用自己制作的文件,您应该在这里是安全的,但您可能希望之后根据您的需要和环境重新启用此策略。如果您不使用您的文件让自己,尤其是 PDF,要小心,无论你是否安装了 v9.24 之前的 Ghostscript。PDF 作为一种格式非常复杂,并提供了许多不同的地方来消除恶意,实际上你永远不可能 100% 有信心你用来处理它的软件已经完全强化了。)

          ImageMagick 也可以自己光栅化 PDF,尽管它有点复杂。例如:

          #!/bin/bash
          
          magick convert -density 150 -rotate 20 rotate_me.pdf rotated.pdf
          

          这可能看起来类似于mutool draw 命令,但不同之处在于 ImageMagick 将光栅化输入 PDF,然后使用生成的图像制作输出 PDF,因此您可以使用此命令使用所有常规 ImageMagick 转换。

          无论如何,-density 用于 DPI。如果您不传递该参数,它将默认为 72 DPI,这可能看起来不太好。此外,就 PDF 而言,ImageMagick 在边距和类似的事情上似乎不如 MuPDF 聪明,因此您可能需要做更多的工作才能为您的用例获得合理的输出。如果您确实可以访问 MuPDF 和 ImageMagick,我认为使用 MuPDF 进行光栅化,然后使用 ImageMagick 对生成的图像进行进一步的处理,往往会以最少的工作获得最好的结果,但当然这可能实用也可能不实用给你。

          (magick convert docs)

          如果您的 PDF 是基于矢量的,则光栅化具有明显的缺点——文件大小增加、分辨率固定、失去灵活性等。此外,即使您的 PDF 已经存储了光栅图形,您也可能会丢失其中的文本数据等在转换中。但是,如果 PDF 真的很糟糕,有时这是最不痛苦的方法。如果需要,您可以在使用 Tesseract 对其进行清理后对其进行 OCR,这通常比您到达之前所做的任何事情都具有更好的效果。

          【讨论】:

            【解决方案5】:

            我曾经有过这个。我不知道你有多少页。 我所做的是打印磨损的页面,使用切纸机将它们对齐并重新扫描。希望这可以帮助。 是的,我试图找到某种程序来解决这个问题,但我仍然没有找到。

            【讨论】:

            • 是的,如果我能找到原件,我可以重新扫描它们。但是,我实际上有数千个 PDF 文件要处理,所以我希望找到一个更快的过程。令人惊奇的是没有软件程序可以做到这一点(据我所知)。
            猜你喜欢
            • 1970-01-01
            • 2018-03-21
            • 1970-01-01
            • 1970-01-01
            • 2021-05-24
            • 2011-03-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多