5

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

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

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

在这里,给出了一张完整的 a4 纸-g2480x3508,我试图乘以 0.9 来缩放,但我没有看到任何效果。

4

4 回答 4

4

这是基于 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,它是一个添加了一些其他功能的分支。

于 2014-12-27T19:06:34.537 回答
2

不错的哈康海格兰!我做了一点改进,以便轻松选择输入。

所以如果你跑

$ 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}
于 2014-09-19T11:15:36.617 回答
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
于 2013-08-21T11:56:27.903 回答
1

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

于 2013-08-20T22:32:39.940 回答