Visual Paradigm

Откопал достаточно хороший пакет для моделирования ПО Visual Paradigm Suite for UML.

Данный пакет позволяет рисовать множество разных типов диаграмм почти на все случаи жизни. Но основной отличительной чертой является его "условная" бесплатность.

Триальная версия обладает двумя недостатками:
  1. Работает один месяц;
  2. Позволяет экспортировать диаграммы ввиде картинок, но с наложенными водяными знаками.

За пару дней был придуман способ устранения этих недостатков:
  1. Для сброса триала необходимо просто удалить несколько скрытых файликов, начинающихся с точки;
  2. Экспортировать диаграммы в формате SVG и просто удалять тэги с водяными знаками в текстовом редакторе.

Но возникла еще одна проблема с рендерингом SVG в PNG. Стандартная библиотека rsvg в Linux некачественно отрисовывает русские шрифты.
И было замечено, что Google Chrome SVG файлы отображает отлично. Было решено написать свою программу, которая:
  • Удаляет водные знаки;
  • Рендерит SVG в PNG при помощи WebKit.

На помощь пришел QWebKit и завертелось.
В результате получилась консольная утилита, принимающая параметром путь до SVG файла и создающая рядом красивый PNG файл.
И лицензию не нарушаю, и сэкономил кучу бабосов на покупке ненужной лицензии.

Найди два отличия:
 1. SVG -> PNG средствами Gnome 2. SVG -> PNG самодельной утилитой
SVG -> PNG средствами Gnome SVG -> PNG самопальной утилитой 

Утилита на Qt


Для сборки проекта в Qt Creator потребуется добавить такую строку в .pro файл:
QT       += core webkit gui

Исходный код main.cpp:

#include <QtCore/QCoreApplication>
#include <QApplication>
#include <QDebug>
#include <QWebPage>
#include <QWebFrame>
#include <QFile>
#include <QImage>
#include <QPainter>

void processFile(QString filename) {
    QRegExp exp(".*\\.svg$");
    if (!exp.exactMatch(filename)) {
        qDebug() << "Error: file is not SVG '" << filename << "'";
        return;
    }
    QRegExp rx("(.*)\\.svg$");
    if (rx.indexIn(filename) == -1) {
        qDebug() << "Can't create destination filename";
        return;
    }
    QString imageFilename = rx.cap(1) + ".png";
    QFile *f = new QFile(QString(filename));
    if (!f->exists()) {
        qDebug() << "File does not exist '" << filename << "'";
        return;
    }
    if (!f->open(QIODevice::ReadOnly)) {
        qDebug() << "Can't open file for reading.";
        return;
    }
    QWebPage page;
    QWebFrame *frame = page.mainFrame();
    QString data(f->read(1024 * 1024 * 32));
    QRegExp rxclean("Visual Paradigm for UML Enterprise Edition \\[evaluation copy\\] ");
    data.replace(rxclean, "");
    QByteArray qb;
    qb.append(data);
    frame->setContent(qb, "image/svg+xml");
    page.setViewportSize(frame->contentsSize());
    QImage image(page.viewportSize(), QImage::Format_ARGB32);
    QPainter painter(&image);
    frame->render(&painter);
    painter.end();
    image.save(imageFilename);
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    a.setApplicationName("Visual Paradigm SVG cleaner");
    if (argc <= 1) {
        qDebug() << "Error: No arguments";
        return 0;
    }
    qDebug() << "Files to be processed:" << argc-1;
    QStringList arguments = QCoreApplication::arguments();
    for (int i = 1; i < argc; i++) {
        qDebug() << "* Processing" << i << "of" << argc-1 << ":" << arguments.at(i);
        processFile(arguments.at(i));
    }
    return 0;
}

Bash скрипт

Если не охота заморачиваться с компилляцией в Qt Creator, то можно использовать простенький bash-скрипт, но вы не получите качественного рендеринга SVG под Gnome:

#!/bin/bash cat "$1" | sed 's/Visual Paradigm for UML Enterprise Edition \[evaluation copy\] //' > "$1.tmp" mv "$1.tmp" "$1"


ċ
vpclean.zip
(1k)
Viacheslav Dobromyslov,
12 мая 2012 г., 2:23
Comments