Linux 缩放pdf以添加用于打印全尺寸页面的边框

Linux 缩放pdf以添加用于打印全尺寸页面的边框,linux,pdf,ghostscript,Linux,Pdf,Ghostscript,当打印没有边框(或边距)的pdf时,打印机会在纸张边缘截取大约1毫米的图像数据。因此,我正在寻找解决问题的办法 在页面上稍微缩放/调整pdf页面的大小,以便在边缘添加白色边框,与打印机生成的边缘空白相对应 到目前为止,我已经尝试使用了gs。。例如,假设我有一个A4大小的pdf1.pdf,那么我使用: gs -sDEVICE=pdfwrite \ -q -dBATCH -dNOPAUSE \ -dPDFFitPage \ -r300x300 \ -g2232x

当打印没有边框(或边距)的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,但我看不到任何效果。

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

这似乎是 在这里很管用

基于该解决方案,我编写了以下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
#/bin/bash
如果[$#-ne 1];然后
回应“糟糕的论点!”
出口
fi
#假设0nicehåkonhægland!
我做了一些改进,以便于选择输入

所以如果你跑

$scaleA4PDF 10yourfile.pdf

您将收到一个您的文件\u 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}
#/bin/bash
输入=$2
输出=$(echo$2 | sed s/.pdf/_scaled.pdf/)
如果[$#-ne 2];然后
回应“糟糕的论点!”
出口
fi

#假设0以下是构建在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"
#/bin/bash
#pdfScale.sh
#
#将PDF缩放到原始大小的指定百分比。
#参考:http://ma.juii.net/blog/scale-page-content-of-pdf-files.
echo“此脚本不处理包含空格的文件。”
标度=0.95#标度系数(例如,0.95=95%)
#验证参数。
[$#-eq 1]|{echo“***错误:Usage pdfScale.sh.pdf”;退出99;}
INFILEPDF=“$1”
[[“$INFILEPDF”=~^..*\.pdf$]|{echo”***错误:Usage pdfScale.sh.pdf;退出99;}
OUTFILEPDF=$(echo“$INFILEPDF”| sed-es/\.pdf$/-).SCALED.pdf
#依赖关系
命令-v identify>/dev/null 2>&1 |{echo>&2“请安装'imagemagick'(sudo-apt-get-install-imagemagick)。中止。“退出1;”
命令-v gs>/dev/null 2>&1 |{echo>&2“请安装'ghostscript'(sudo-apt-get-install-ghostscript?)。正在中止。“退出1;”
命令-v bc>/dev/null 2>&1 |{echo>&2“请安装'bc'任意精度计算器语言。正在中止。”退出1;}
#通过ImageMagick标识命令获取postscript点的宽度/高度(1/72英寸)。
#(或者,可以使用Poppler-pdfinfo命令;或者手动grep/sed PDF。)
标识=($(标识$INFILEPDF 2>/dev/null))#bash数组
[$?-ne 0]&GEOMETRY=($(echo${IDENTIFY[2]}| tr“x”“”)#bash数组-$IDENTIFY[2]的形式为PGWIDTHxPGHEIGHT
PGWIDTH=${GEOMETRY[0]};PGHEIGHT=${GEOMETRY[1]}
#计算翻译系数(到中间页)。
XTRANS=$(回声“刻度=6;0.5*(1.0-$scale)/$scale*$PGWIDTH”| bc)
YTRANS=$(回声“刻度=6;0.5*(1.0-$scale)/$scale*$PGHEIGHT”| bc)
echo$PGWIDTH、$PGHEIGHT、$OUTFILEPDF、$SCALE、$XTRANS、$YTRANS、$INFILEPDF、$OUTFILEPDF
#去做吧。
gs\
-q-dNOPAUSE-dBATCH-sDEVICE=pdfwrite-dSAFER\
-dCompatibilityLevel=“1.5”-dPDFSETTINGS=“/printer”\
-dColorConversionStrategy=/LeveColorUnchanged\
-dSubsetFonts=true-dEmbedAllFonts=true\
-dDEVICEWIDTH=$PGWIDTH-dDEVICEHEIGHT=$PGHEIGHT\
-sOutputFile=“$OUTFILEPDF”\
-c“设置页面设备”\
-f“$INFILEPDF”

有关此方法的更多信息以及对该要点的讨论,请参阅以下博客:

  • (2008年8月;作者:马特)

请看,这是一个添加了一些其他功能的fork。

我在运行GPL Ghostscript 9.10时遇到了以下错误:
GPL Ghostscript 9.10:将UseDeviceIndependentColor设置为UseDeviceIndependentColor以正常工作。不可恢复的错误:stackunderflow in.SetDifferParams
。我通过将
-dPDFSETTINGS=“/printer”
替换为
-dPDFSETTINGS来修复它=“/屏幕"
。我还使其适用于更奇怪的文件名,其中包含空格。请参阅我的。虽然此链接可能会回答问题,但最好包含答案的基本部分并提供链接供参考。如果链接页面发生更改,则仅链接的答案可能无效。如果您说出要点,请重新发布到此处。@MichaelCole的公司de最近在Github repo中被分叉和扩展。嗨,伙计们!我再次重构并添加了很多额外的东西。不过,GS对扩展的要求基本上还是一样的(这就是为什么我可能永远不会在这里给出答案的原因).V2现在具有调整纸张大小、pdf信息打印、纸张表格打印以及一系列与页面大小调整相关的其他选项(翻转、自动旋转等)。