【问题标题】:Scale pdf to add border for printing full size pages缩放 pdf 以添加边框以打印全尺寸页面
【发布时间】:2013-08-23 00:30:54
【问题描述】:

打印没有边框(或边距)的 pdf 时,打印机会在纸张边缘切掉大约 1 毫米的图像数据。因此,我正在寻找解决方案 在页面上稍微缩放/调整 pdf 页面的大小,以在边缘添加一个白色边框,该边框将与打印机产生的边缘处的空白相对应。

到目前为止,我已经尝试过使用gs。例如,假设我有一个 A4 大小的 pdf 1.pdf,那么我使用了:

gs -sDEVICE=pdfwrite \
    -q -dBATCH -dNOPAUSE \
     -dPDFFitPage \
     -r300x300 \
     -g2232x3157 \
    -sOutputFile=1A.pdf \
     1.pdf 

这里,-g2480x3508 给出了一张完整的 a4 纸,我试图乘以 0.9 来缩放,但我看不出这有什么影响..

【问题讨论】:

    标签: linux pdf ghostscript


    【解决方案1】:

    这是一个基于 prev 的 bash 脚本的要点。修复了颜色兼容性问题(可能特定于我的 pdf),并进行了一些依赖性检查:

    #!/bin/bash
    
    # pdfScale.sh
    #
    # Scale PDF to specified percentage of original size.
    # Ref: http://ma.juii.net/blog/scale-page-content-of-pdf-files.
    
    echo "This script doesn't handle files with spaces in them."
    
    SCALE=0.95 # scaling factor (0.95 = 95%, e.g.)
    
    # Validate args.
    [ $# -eq 1 ] || { echo "***ERROR: Usage pdfScale.sh <inFile>.pdf"; exit 99; }
    INFILEPDF="$1"
    [[ "$INFILEPDF" =~ ^..*\.pdf$ ]] || { echo "***ERROR: Usage pdfScale.sh <inFile>.pdf"; exit 99; }
    OUTFILEPDF=$(echo "$INFILEPDF" | sed -e s/\.pdf$// -).SCALED.pdf
    
    # Dependencies
    command -v identify >/dev/null 2>&1 || { echo >&2 "Please install 'imagemagick' (sudo apt-get install imagemagick).  Aborting."; exit 1; }
    command -v gs >/dev/null 2>&1 || { echo >&2 "Please install 'ghostscript' (sudo apt-get install ghostscript ?).  Aborting."; exit 1; }
    command -v bc >/dev/null 2>&1 || { echo >&2 "Please install 'bc' arbitrary precision calculator language.  Aborting."; exit 1; }
    
    # Get width/height in postscript points (1/72-inch), via ImageMagick identify command.
    # (Alternatively, could use Poppler pdfinfo command; or grep/sed the PDF by hand.)
    IDENTIFY=($(identify $INFILEPDF 2>/dev/null)) # bash array
    [ $? -ne 0 ] &GEOMETRY=($(echo ${IDENTIFY[2]} | tr "x" " ")) # bash array — $IDENTIFY[2] is of the form PGWIDTHxPGHEIGHT
    PGWIDTH=${GEOMETRY[0]}; PGHEIGHT=${GEOMETRY[1]}
    
    # Compute translation factors (to center page.
    XTRANS=$(echo "scale=6; 0.5*(1.0-$SCALE)/$SCALE*$PGWIDTH" | bc)
    YTRANS=$(echo "scale=6; 0.5*(1.0-$SCALE)/$SCALE*$PGHEIGHT" | bc)
    
    echo $PGWIDTH , $PGHEIGHT , $OUTFILEPDF , $SCALE , $XTRANS , $YTRANS , $INFILEPDF , $OUTFILEPDF
    
    # Do it.
    gs \
    -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dSAFER \
    -dCompatibilityLevel="1.5" -dPDFSETTINGS="/printer" \
    -dColorConversionStrategy=/LeaveColorUnchanged \
    -dSubsetFonts=true -dEmbedAllFonts=true \
    -dDEVICEWIDTH=$PGWIDTH -dDEVICEHEIGHT=$PGHEIGHT \
    -sOutputFile="$OUTFILEPDF" \
    -c "<</BeginPage{$SCALE $SCALE scale $XTRANS $YTRANS translate}>> setpagedevice" \
    -f "$INFILEPDF"
    

    https://gist.github.com/MichaelJCole/86e4968dbfc13256228a

    有关此方法的更多信息和有关此要点的讨论可在此博客文章中找到:

    请参阅tavinus/pdfScale,这是一个添加了一些其他功能的分支。

    【讨论】:

    • 虽然此链接可能会回答问题,但最好包含答案here 的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
    • 如果您分叉了要点,请在此处重新发布。
    • @MichaelCole 的代码最近在tavinus/pdfScale Github 存储库中被分叉和扩展。
    • 大家好!我再次重构了pdfScale 并添加了很多额外的东西。不过,GS 对扩展的要求基本上还是一样的(这就是为什么我可能永远不会在这里真正发布答案的原因)。 V2 现在具有调整纸张大小、打印 pdf 信息、打印纸张表格和许多其他与页面大小调整相关的选项(翻转、自动旋转等)。 tavinus/pdfScale
    【解决方案2】:

    似乎提供的解决方案是 http://ma.juii.net/blog/scale-page-content-of-pdf-files 在这里工作得很好..

    基于该解决方案,我编写了以下 bash 脚本 (scaleA4Pdf) 用于缩放 A4 pdf 文件的页面内容。您现在可以写scaleA4Pdf 10 将页面缩放10%..

    #! /bin/bash
    
    if [ $# -ne 1 ] ; then
        echo "Bad arguments!"
        exit
    fi
    
    # assume 0<=$1<=100 (no error checks!)
    xx="595" #width of A4 in post script points 
    yy="842" #height of A4 in pps
    
    ss=$(echo "scale=4; $1 / 2" | bc)
    sx=$(echo "scale=4; ${xx}"'*'"( ${ss}/ 100 )" | bc)
    sy=$(echo "scale=4; ${yy}"'*'"( ${ss}/ 100 )" | bc)
    s=$(echo "scale=4; 1 - $1 / 100" | bc)
    gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dSAFER \
      -dCompatibilityLevel="1.3" -dPDFSETTINGS="/printer" \
      -dSubsetFonts=true -dEmbedAllFonts=true \
      -sPAPERSIZE=a4 -sOutputFile="1A.pdf" \
      -c "<</BeginPage{${s} ${s} scale ${sx} ${sy} translate}>> setpagedevice" \
      -f 1.pdf
    

    【讨论】:

      【解决方案3】:

      Håkon Hægland 不错! 我做了一点改进,以便轻松选择输入。

      所以如果你运行

      $ scaleA4PDF 10 yourfile.pdf

      您将收到一个 yourfile_scaled.pdf 文件。

       #! /bin/bash
       input=$2
       output=$(echo $2 | sed s/.pdf/_scaled.pdf/)
       if [ $# -ne 2 ] ; then
       echo "Bad arguments!"
       exit
       fi
      
       # assume 0<=$1<=100 (no error checks!)
       xx="595" #width of A4 in post script points
       yy="842" #height of A4 in pps
      
       ss=$(echo "scale=4; $1 / 2" | bc)
       sx=$(echo "scale=4; ${xx}"'*'"( ${ss}/ 100 )" | bc)
       sy=$(echo "scale=4; ${yy}"'*'"( ${ss}/ 100 )" | bc)
       s=$(echo "scale=4; 1 - $1 / 100" | bc)
       gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dSAFER \
       -dCompatibilityLevel="1.3" -dPDFSETTINGS="/printer" \
       -dSubsetFonts=true -dEmbedAllFonts=true \
       -sPAPERSIZE=a4 -sOutputFile="${output}" \
       -c "<</BeginPage{${s} ${s} scale ${sx} ${sy} translate}>> setpagedevice" \
       -f ${input}
      

      【讨论】:

      • 运行时出现以下错误:GPL Ghostscript 9.10: Set UseCIEColor for UseDeviceIndependentColor to work properly. Unrecoverable error: stackunderflow in .setdistillerparams。我通过用-dPDFSETTINGS="/screen" 替换-dPDFSETTINGS="/printer" 来修复它。我还让它与更奇怪的文件名一起工作,其中包含空格。见我的gist
      【解决方案4】:

      由于您没有指定您感兴趣的特定工具,我会使用 iText 来完成这样的任务。您可以使用 Java 或 .NET (iTextSharp) 编写简单的代码来轻松完成此任务。以此为灵感 (n-up tool)。虽然它实际上是将文档的多个页面放入单个页面中,但您可以采用此代码以相同的方式稍微缩放单个页面。

      【讨论】:

        猜你喜欢
        • 2015-12-27
        • 1970-01-01
        • 2010-10-29
        • 2018-08-23
        • 2011-01-15
        • 2020-04-01
        • 2013-11-17
        • 2013-02-08
        • 1970-01-01
        相关资源
        最近更新 更多