純ruby解決方案並不存在,但我一直在用Python腳本使用pyPdf和pycairo進行相同類型的操作(在現有PDF中添加打印標記)。
您可以find it on Github,大部分代碼在draw-outline.py和outline.py。
如果您對此解決方案感興趣,我可以提取一個快速教程並在此處發佈。
我已經提取的快速腳本將文本添加到任意PDF的每個頁面更新,它的快速和骯髒,但它應該做的工作。
用法:
Usage: name-generator.py [options] filename
Options:
-h, --help show this help message and exit
-o OUTPUT_FILENAME, --output=OUTPUT_FILENAME
output filename, defaults to output.pdf
-t TEXT, --text=TEXT text to add
-s SIZE, --size=SIZE size of the text, in millimeters
-x X horizontal position of the text in millimeters, the
origin is the left side
-y Y vertical position of the text in millimeters, the
origin is the top side
代碼:
#!/usr/bin/env python
from optparse import OptionParser
import os.path
# Constants
MM_TO_PT = 2.834645669
DEFAULT_OUTPUT = "output.pdf"
# Option parsing
parser = OptionParser("Usage: %prog [options] filename")
parser.add_option("-o", "--output", type="string", dest="output_filename", default=DEFAULT_OUTPUT, help="output filename, defaults to %s" % DEFAULT_OUTPUT)
parser.add_option("-t", "--text", type="string", dest="text", help="text to add")
parser.add_option("-s", "--size", type="float", dest="size", default=10, help="size of the text, in millimeters")
parser.add_option("-x", type="int", dest="x", default=100, help="horizontal position of the text in millimeters, the origin is the left side")
parser.add_option("-y", type="int", dest="y", default=100, help="vertical position of the text in millimeters, the origin is the top side")
(options, args) = parser.parse_args()
if len(args) != 1 or not os.path.isfile(args[0]):
parser.print_help()
exit()
# Pdf manipulation class
import cairo
import StringIO
class TextCreator:
def __init__(self, width, height):
self.width, self.height = width, height
self.output = StringIO.StringIO()
self.surface = cairo.PDFSurface(
self.output,
self.width * MM_TO_PT,
self.height * MM_TO_PT
)
def print_text(self, text, size, x, y):
context = self.create_context()
context.move_to(x, y)
context.set_font_size(size)
context.show_text(text)
self.surface.flush()
self.surface.finish()
return self.output
def create_context(self):
context = cairo.Context(self.surface)
context.set_source_rgb(0, 0, 0)
context.set_line_width(0.2)
# Allow drawing on the context using human-friendly units (millimeters)
context.scale(MM_TO_PT, MM_TO_PT)
return context
# Let's get to work
from pyPdf import PdfFileWriter, PdfFileReader
# Read the input and prepare the output document
filename = args[0]
document = PdfFileReader(file(filename, "rb"))
output = PdfFileWriter()
for page_num in range(document.getNumPages()):
# Get the page dimensions
page = document.getPage(page_num)
box = page.mediaBox
# PDF dimensions are in points, convert them to millimeters
width = round(float(box[2])/MM_TO_PT)
height = round(float(box[3])/MM_TO_PT)
# Create a PDF page containing the text
text_creator = TextCreator(
width,
height
)
text = text_creator.print_text(options.text, options.size, options.x, options.y)
# Merge the text with the current page and add it to the output
page.mergePage(PdfFileReader(text).getPage(0))
output.addPage(page)
outputStream = file(options.output_filename, "wb")
output.write(outputStream)
outputStream.close()
我從來沒有碰到Python的 - 我絕對沒有和紅寶石結合吧!是複雜的嗎? – dannymcc
如果您沒有使用高級Python特性,並且您已經在Ruby中掌握了面向對象的編程,那麼您將會相當快地完成它。痛苦點將是pycairo,因爲有幾個概念可以理解,但我會一起幫助你,你的功能看起來並不複雜。 –