Печать графики на Python - PullRequest
5 голосов
/ 14 января 2011

Мне нужно напечатать "Метки колеса" из python. Теги колеса будут содержать изображения, строки и текст.

В руководстве по Python есть два параграфа о создании файлов postscript с изображением lib. Прочитав его, я до сих пор не знаю, как выложить данные. Я надеялся, что у кого-то могут быть образцы того, как расположить изображения, текст и линии?

Спасибо за любую помощь.

Ответы [ 2 ]

3 голосов
/ 15 января 2011

См. http://effbot.org/imagingbook/psdraw.htm

Обратите внимание, что:

  1. модуль PSDraw, по-видимому, активно не поддерживается с 2005 года;Я предполагаю, что большая часть усилий была перенаправлена ​​на поддержку формата PDF.Вы могли бы быть счастливее, используя вместо этого pypdf;

  2. у него есть комментарии типа '# FIXME: не завершено' и 'NOT YET IMPLEMENTED' в источнике

  3. Похоже, что у него нет какого-либо метода установки размера страницы - что, как я помню, означает, что по умолчанию используется формат A4 (8,26 x 11,69 дюймов)

  4. все измерения в точках, при 72точек на дюйм.

Вам нужно будет сделать что-то вроде:

import Image
import PSDraw

# fns for measurement conversion    
PTS = lambda x:  1.00 * x    # points
INS = lambda x: 72.00 * x    # inches-to-points
CMS = lambda x: 28.35 * x    # centimeters-to-points

outputFile = 'myfilename.ps'
outputFileTitle = 'Wheel Tag 36147'

myf = open(outputFile,'w')
ps = PSDraw.PSDraw(myf)
ps.begin_document(outputFileTitle)

ps теперь объект PSDraw, который будет записывать PostScript в указанный файл, иЗаголовок документа был написан - вы готовы начать рисовать материал.

Чтобы добавить изображение:

im = Image.open("myimage.jpg")
box = (        # bounding-box for positioning on page
    INS(1),    # left
    INS(1),    # top
    INS(3),    # right
    INS(3)     # bottom
)
dpi = 300      # desired on-page resolution
ps.image(box, im, dpi)

Чтобы добавить текст:

ps.setfont("Helvetica", PTS(12))  # PostScript fonts only -
                                  # must be one which your printer has available
loc = (        # where to put the text?
    INS(1),    # horizontal value - I do not know whether it is left- or middle-aligned
    INS(3.25)  # vertical value   - I do not know whether it is top- or bottom-aligned
)
ps.text(loc, "Here is some text")

Чтобы добавитьстрока:

lineFrom = ( INS(4), INS(1) )
lineTo   = ( INS(4), INS(9) )
ps.line( lineFrom, lineTo )

... и я не вижу никаких вариантов изменения веса удара.

Когда вы закончите, вы должны закрыть файл как:

ps.end_document()
myf.close()

Редактировать: Я немного читал о настройке веса удара и наткнулся на другой модуль, psfile: http://seehuhn.de/pages/psfile#sec:2.0.0 Сам модуль выглядит довольно минимально - он пишет много сырых постскриптов - но он должен дать вам лучшее представление о том, что происходит за кулисами.

1 голос
/ 15 января 2011

Я бы порекомендовал библиотеку с открытым исходным кодом Reportlab для такого рода задач.

Он очень прост в использовании и выводит напрямую в формат PDF.

Очень простой пример из официальной документации:

from reportlab.pdfgen import canvas
def hello(c):
    c.drawString(100,100,"Hello World")
c = canvas.Canvas("hello.pdf")
hello(c)
c.showPage()
c.save()

Пока PIL установлен, также очень легко добавлять изображения на вашу страницу:

canvas.drawImage(self, image, x,y, width=None,height=None,mask=None)

где «изображение» - это либо объект изображения PIL, либо имя файла изображения, которое вы хотите использовать.

Множество примеров в документации .

...