명함을 한 페이지로 내보내는 방법은 무엇입니까?

명함을 한 페이지로 내보내는 방법은 무엇입니까?

SVG 템플릿에서 전체 팀의 명함을 생성하는 스크립트가 있습니다. 다음과 같은 명함 크기의 PDF가 생성됩니다.

+-----------------+
|      o  o       |
|      \__/       |
|                 |
+-----------------+

이제 인쇄를 위해 A4 용지에 12개를 인쇄할 수 있다는 것을 알았습니다. 다음과 같이 정리하면:

+---+---+---+---+
|   |   |   |   |
|:) |:) |:) |:) |
|   |   |   |   |
+---+---+---+---+
|   |   |   |   |
|:) |:) |:) |:) |
|   |   |   |   |
+---+---+---+---+
|   |   |   |   |
|:) |:) |:) |:) |
|   |   |   |   |
+---+---+---+---+

따라서 PDF 수준에서 이 작업을 수행하려면 스크립트가 필요합니다. 이 문제를 해결하는 방법에 대한 단서가 있습니까?

답변1

권장 사항을 고려하여안톤, 이 스크립트를 사용했습니다. 주요 아이디어는 먼저 pdf를 일반 svg로 다시 내보내고 svg를 합성한 다음 다시 pdf로 내보내는 것입니다. A4 크기는 하드코드되어 있지만 스크립트에서 변경할 수 있습니다.

#!/bin/bash

# If you modify/extend this script, it'd be cool if you post your improvements on
#      https://unix.stackexchange.com/q/177263/9495

# This is A4 size
TARGET_WIDTH=744.09003
TARGET_HEIGHT=1052.3622
ext=".a4_4x3.pdf"
draw_border="1" # set to 0 to deactivate borders

TEMP_DIR="$(mktemp -d)"

pdftk A="$1" cat Aeast output "$TEMP_DIR/rot.pdf"

inkscape --export-plain-svg="$TEMP_DIR/rot.plain.svg" "$TEMP_DIR/rot.pdf"

psvg="$(cat "$TEMP_DIR/rot.plain.svg" | tr '\t' ' ' | tr -d '\n' | sed 's/</\n</g; s/>/>\n/g' | grep '.')"

W="$(echo "$psvg" | sed -n 's/^.*width="\([0-9.]\+\)".*$/\1/p' | head -n 1)"
H="$(echo "$psvg" | sed -n 's/^.*height="\([0-9.]\+\)".*$/\1/p' | head -n 1)"

orig_g="$(echo "$psvg" | sed -n '/^<g/,$p' | sed '$,$d')"
if [ "$draw_border" = "1" ]; then
  main_g="$(echo '<rect style="stroke-width:1px; stroke:#000000; fill:#ffffff" width="'"$W"'" height="'"$H"'" />'; echo "$orig_g")"
else
  main_g="$orig_g"
fi
husk_open="$(echo "$psvg" | sed '/^<g/,$d' \
 | sed "s/width=\"$W\"/width=\"$TARGET_WIDTH\"/"\
 | sed "s/height=\"$H\"/height=\"$TARGET_HEIGHT\"/")"
husk_close="</svg>"

move_right () {
  echo "<g transform=\"translate($W,0)\">"
  cat
  echo "</g>"
}
move_down () {
  echo "<g transform=\"translate(0,$H)\">"
  cat
  echo "</g>"
}
mk_row () {
  echo "$1"
  echo "$1" | move_right
  echo "$1" | move_right | move_right
  echo "$1" | move_right | move_right | move_right
}
mk_all () {
  mk_row "$1"
  mk_row "$1" | move_down
  mk_row "$1" | move_down | move_down
}

margin_L="$(python -c "print ($TARGET_WIDTH - 4*$W)/2.")"
margin_H="$(python -c "print ($TARGET_HEIGHT - 3*$H)/2.")"

(
  echo "$husk_open"

  echo "<g transform=\"translate($margin_L,$margin_H)\">"
  mk_all "$main_g"
  echo "</g>"

  echo "$husk_close"
) | tr -d '\n' > "$TEMP_DIR/out.svg"

inkscape --export-pdf="$1$ext" "$TEMP_DIR/out.svg"

rm -r "$TEMP_DIR"

답변2

나는 이미 만들어진 12대1 포스트스크립트/PDF 애플리케이션을 알지 못하며, 보다 표준적인 2대1 또는 4대1과 결합하여 이를 달성할 수 없습니다.

당신이 할 수 있는 일은 pdftkPDF 파일과 해당 옵션을 한 페이지에 병합하는 것 입니다 background. 단, 개별 카드를 배치하는 것은 허용되지 않습니다. 가장 쉬운 방법은 A4 크기의 명함 12장을 생성하고 각 명함을 올바른 위치에 렌더링하고 배경을 투명하게 한 다음 결합하는 것입니다. 이를 수행할 수 없는 경우 을 사용하여 ghostscript회전 및 변형을 수행하고 출력을 결합하는 것을 고려해야 합니다 .

이는 이미지에서 PDF를 생성하지 않는다고 가정합니다(이렇게 하면 일반적으로 품질이 떨어지지만 이미지 수준에서 개별 파일을 결합하는 것이 더 쉬워집니다).

관련 정보