2012-01-13 56 views
9

私はいくつかのSVGをバッチで作成しており、印刷のためにそれらをPDFドキュメントに変換する必要があります。私はsvglibとそのsvg2rlgメソッドを使用しようとしていましたが、ドキュメントのベクトルグラフィックスを保存することは絶対に驚きです。それはテキストを正しく配置することはほとんどできません。SVGをPDFに変換する(svglib + reportlabが不十分です)

ダイナミックに生成されたSVGがうまく作成されているため、生の入力にsvglibをテストしました。これは私が導入している問題ではないことを確認しています。

したがって、svglibとReportLabより前のオプションは何ですか?これは、これが一部であるプロジェクトの予算からすでに外れているので、無料または非常に安いものでなければなりません。 ReportLab Plusの1k /年の手数料はありません。

私はPythonを使用していますが、この段階で私たちのUbuntuサーバー上で動作する限り、私は満足しています。

編集:テスト済みのプリンス。より良いが、それでも文書の半分は無視している。

+0

次のアプローチのコンボを使用できますか?http://stackoverflow.com/a/6599172/1104941とhttp://www.blog.pythonlibrary.org/2012/01/07/reportlab-converting-hundreds-後者はreportlabを使用していますが、私はあなたがpdfsを生成しているだけのPlus版なしで逃げることができないのだろうかと思います。あなたはカイロと一緒にpdfに直接行くことができるかもしれませんが、私は答えの代わりにコメントを確実に言うことができません。 – sgallen

答えて

1

CairoSVGは、私が使用していますいずれかになります。

import cairosvg 
cairosvg.svg2pdf(url='image.svg', write_to='image.pdf') 
+0

これをテストしましたが、残念なことに私のSVGをレンダリングするのと同じくらい弱いです。 – Oli

+0

あなたのSVGが実際に正しくフォーマットされていますか?カイロのレンダリングは非常に固いです。また、私はWeissPrintをPDFに使用していますが、それでも未完成ですが、限界にもかかわらずうまくいきます... – plaes

+2

2016年の誰にとって、これはもう動作しません。 – Lucas

6

私はこのためにinkscapeを使用しています。あなたのDjangoのビューでのように実行します。

from subprocess import Popen 

x = Popen(['/usr/bin/inkscape', your_svg_input, \ 
    '--export-pdf=%s' % your_pdf_output]) 
try: 
    waitForResponse(x) 
except OSError, e: 
    return False 

def waitForResponse(x): 
    out, err = x.communicate() 
    if x.returncode < 0: 
     r = "Popen returncode: " + str(x.returncode) 
     raise OSError(r) 

あなたは、あなたの.svg中を参照するすべてのフォントファイルをInkscapeのためのパラメータとして渡す必要があるかもしれないので、あなたのテキストがで正しく表示されない場合は念頭に置いてそれを維持します。 pdf出力。

1

rst2pdfはPDFを生成するためにreportlabを使用します。 PDFを読むためにinkscapeとpdfrwを使うことができます。

pdfrw自体には、PDFを読み込み、reportlabを使用して出力する例があります。以下マーティン(私はこの回答を編集することができますが、それにコメントにコメントするの評判を持っていない...)によるコメントをアドレッシング

ReportLabのは、SVGファイルについて何も知りません。 svg2rlgのようなツールの中には、SVGイメージをreportlabキャンバスに描画してPDFに再作成しようとするものがあります。しかし、これをpdfrwとは別の方法で行うことができます - 別のツールを使ってSVGファイルをPDFイメージに変換することができれば、pdfrwはその変換されたPDFを取り込み、生成しているPDFにフォームXObjectとして追加できますreportlabで限り、reportlabについては、それは本当に違いはありませんJPEG画像を配置します。

いくつかのツールは、SVGファイルにひどいことを行います(たとえば、それらをラスタライズする)。私の経験では、通常、inkscapeはかなり良い仕事をし、それらをベクトル形式にしています。あなたはこのヘッドレスを行うことさえできます。 "inkscape my.svg -A my.pdf"

私がpdfrwを最初に書いた理由は、この正確なユースケースのためでした。つまり、reportlabで作成された新しいPDFファイルでベクターイメージを再利用することができました。

+0

これはOPの問題にどのように対処していますか?私は彼が* SVGの処理品質が不足しているので、* reportlabを使用したくないと信じています。 –

0

ちょうどあなたが知っているし、将来の問題のために、私はこの問題の解決策を見つけるようにする:

# I only install svg2rlg, not svglib (svg2rlg is inside svglib as well) 
import svg2rlg 

# Import of the canvas 
from reportlab.pdfgen import canvas 

# Import of the renderer (image part) 
from reportlab.graphics import renderPDF 

rlg = svg2rlg.svg2rlg("your_img.svg") 
c = canvas.Canvas("example.pdf") 
c.setTitle("my_title_we_dont_care") 

# Generation of the first page 
# You have a last option on this function, 
# about the boundary but you can leave it as default. 
renderPDF.draw(rlg, c, 80, 740 - rlg.height) 
renderPDF.draw(rlg, c, 60, 540 - rlg.height) 
c.showPage() 

# Generation of the second page 
renderPDF.draw(rlg, c, 50, 740 - rlg.height) 
c.showPage() 

# Save 
c.save() 

は、位置(80、740 - H)とのビットをお楽しみください、それが唯一の位置です。

コードが機能しない場合は、レンダリングのreportlabライブラリを参照できます。 あなたのイメージから直接PDFを作成するためのReportLabの中に機能を持っている:

renderPDF.drawToFile(rlg, "example.pdf", "title") 

あなたはそれを開いて、それを読むことができます。それほど複雑ではありません。このコードはこの関数から来ています。

+0

svg2rlgはpython3で動作しないようです – IARI

関連する問題