2012-11-27 88 views
5

私は自分のグリッドを作成しようとしています(これは非常によく似ています:http://tinyurl.com/cdyre6k - ミリメートル)。ReportLabを使用したPython/PDFの作成 - パターン付きの自己作成のグリッドプリントが画面上でうまく表示されます

私はこれらのレポートを作成するためにReportLab/Python(opensource)を使用しています。以下は私のコードのスニペットです。画面で

、それはしかしGREAT!:

>What I see on the screen<

に見える、私は(はい、私はまた、プリンタの設定で手を加えました)プリンタにこれを送信する際には、いくつかの行を印刷し、他のものではありません(時には系統的で、パターンのような格子縞を印刷しますが、それ以外の場合は太い/細い線です;プリンタの出力は設定したストローク幅によって一貫します)。

>What I see at the printer!<

私はそれを正しく印刷するために得ることができない...私はstrokewidth組み合わせのすべての種類を試してみましたが、プリンタのすべての種類は、組み合わせを設定!私は代替プリンタを試して、より良い結果を得ましたが、プリンタ設定を1200 dpi(CADレベルの印刷)以上に設定する必要があります。他のプリンタは600dpiに設定されています。そのSAME PRINTER(600dpi)では、以前の同僚が作成した文書を印刷して印刷します(彼はReportLabを使用していなかったため、コード/ソリューションは使用できません)。

何が起こっていますか?これはプリンターのエイリアシングの問題ですか?グリッドをビットマップ(または他の形式)に変換すると、私の役に立ちますか?どうすればこの問題を解決できますか(私の唯一の選択肢はPythonとReportLabを使用することです)? ReportLabのマニュアルは役に立ちませんでした。「Google」は役に立ちませんでした。以前のStackExchangeの質問は、この特定のトピックをカバーしていないようです。私は "1"にstrokewidthを設定すると、すべての行を印刷するグリッドを得ることができますが、マイナーグリッド線が太すぎます。

最終結果は、私が取り組んでいる折れ線グラフのためであり、ReportLabにはグラフ関数があることは分かっていますが、私のプロジェクトに必要なものはreportlabsグラフ/グリッド関数では分かりませんメジャー/マイナーラインを使って私自身のグリッドを作ることを余儀なくされました(多分私は何かを見逃して別のテクニックを開いていましたが、現在はプリンタではなくPDF形式でうまく見えます)。

何かアドバイスをいただきありがとうございます。

TIA、

-J

for i in decimal_range(0, _time, 1): 
     if (i % 5.0 == 0): 
      if (i % 25.0 == 0): 
       grid_pattern.add(shapes.Line(_temp_x, 
              (_temp_y + _height_of_box), 
              _temp_x, 
              (_temp_y + _height_of_box+4), 
              strokeWidth=1, 
              strokeColor=colors.black)) 
      else: 
       pass 

      grid_pattern.add(shapes.Line(_temp_x, _temp_y, _temp_x, 
             (_temp_y + _height_of_box), 
             strokeWidth=.12, 
             strokeColor=colors.pink)) 
     else: 
      grid_pattern.add(shapes.Line(_temp_x, _temp_y, _temp_x, 
             (_temp_y + _height_of_box), 
             strokeWidth=.12, 
             strokeColor=colors.pink)) 
     _temp_x += 1 * mm 

    _temp_x = xorigin 

    for i in range(0, _mv, 1): 
     if (i % 5.0 == 0): 
      grid_pattern.add(shapes.Line(_temp_x, _temp_y, 
             _temp_x + _width_of_box, 
             _temp_y, strokeWidth=.12, 
             strokeColor=colors.pink)) 
     else: 
      grid_pattern.add(shapes.Line(_temp_x, _temp_y, 
             _temp_x + _width_of_box, 
             _temp_y, strokeWidth=.12, 
             strokeColor=colors.pink))  
     _temp_y += 1 * mm 

UPDATE1

私はいくつかのポスター(およびReportLabのコミュニティ/メーリングリストによって推奨されているように "0" にストローク幅を設定しようとしています)は、次のようになります。

grid_pattern.add(shapes.Line(_temp_x, _temp_y, _temp_x, 
          (_temp_y + _height_of_box), 
          strokeWidth=0, 
          strokeColor=colors.pink)) 

これは、1つのピクセル幅の行を作成します。これも、PC上ではすばらしいものの、PDFではファンキーなパターンで印刷されます。

アップデート2 + SOLUTION

ReportLabのと私のコンピュータとの癇癪と引数のLOTSした後、それは私のPCまたはReportLabのではなかったが判明しました。それはプリンター(私は2つの完全に異なるプリンターを使用していたCanonとHP - モデルにもかかわらず) - 私は、プリンタを排除するのに十分なカバレッジがあると感じましたが、この問題にはさらにあります!続きを読む...

ReportLabは実際に線を描くわけではなく、線を描くようにレンダリングに指示するポストスクリプト線を追加するだけです。

私の初期のデバッグには、それが問題であるかどうかを確認するために使用していた色の変更が含まれていました - よく - 色をピンクから赤に変更しました(それほど変化はありませんでしたが、やはり私はと仮定しています)。問題として色を除外するために十分に変更しました)。

私は最近、プリンタが色をグレースケールに変換して式を使用し、その式が(私が見ていたような)アンチエイリアスの副作用を生み出す傾向があることを痛感しました。

解決策:グリッドの色を変更することでした。特定の色は他の色よりも優れています。これをテストするために、私はdownload hereという簡単なスクリプトを書いて、reportlabsの色に格納されたすべての色を使用してPDF文書を生成します。辞書 - 問題の原因となったサンプルグリッドを印刷し、RGB値を提供します。それは明らかに、すべての種類の色がいくつかのプリンタ(すべて異なっています)でうまく印刷されません - それはレッド/ピンクだけではありません...赤のような色がうまく印刷されたり、 。

ここで私が作成したこのPDFドキュメントを使用して、印刷(カラーとグレースケールの両方)と画面上でうまく見える色を見つけます。

恐怖のためにスクリプトをダウンロードしたくない場合は、少なくともPDFをチェックして自分のサンプルを印刷して、問題を再現できるかどうかを確認してください(私は600dpiで印刷していました。私はDPI /品質設定を立てれば、それはうまく印刷されましたが、標準設定は私に悲しみを引き起こしていました!)。

Script

または

PDF

答えて

5

私はReportLabのが正しく行を処理する方法を理解している場合は、それぞれ1および0.12ユーザ空間単位でラインを作成することを求めています。 PDFでは、1つの「ユーザー空間単位」は事実上1/72インチです。

これは、描画する線がそれぞれ0.014インチと0.0017インチの幅になることを意味します。それほど大したことではありません。出力デバイスの解像度やページ上のどこに行があるのか​​によっては、画面やプリンタのピクセルグリッドに合わせるかどうかによって、結果が異なる場合があります。

あなたのプリンタはアンチエイリアスによって出力を最適化しようとしますが、最終結果はさらに不確実になります。

プリンタのピクセルグリッドとの調整効果は、おそらく線がいくつか見えて、他の部分が見えないのかもしれません。

試してみる/試してみることがいくつかあります。

1)0行の線で出力します。これはPDFの特殊なケースで、「1ピクセル幅の線を出力する」という意味です。このような行は、画面上に表示される必要があります(72または96 dpi)が、プリンターには表示されないようにする必要があります(1/1200インチのドットが印刷される)。しかし、プリンタがルールに従っている場合は、常にその1ドットを印刷する必要があります。

2)あなたの行をより広くする - おそらく一貫した結果を得るための唯一の方法。小さな線が太すぎる場合は、点線を実線の代わりに印刷することを検討してください(ダッシュパターンを設定してください)。

+0

提案していただきありがとうございます。私は今すぐ試しています。私は調査結果とともに報告します。 –

+0

ストロークの幅を0にしようとしましたが、パターンが悪くなりました。/。私は複数のプリンタで印刷を試みました - 同じ正確なパターン(私はそれが問題+私のコードを引き起こしているAdobe Readerであると仮定しているので)。それでも、印刷設定を行うと、グリッドを印刷することができます(前と同じ)。 ラインを太くすることはできません。ラインの中には、他のラインより少し暗く/濃く印刷されているものもあります。 他の提案はありますか? –

+0

作成したサンプルPDFを共有する方法はありますか?また、「太い」と印刷したとすると、線幅をどれだけ増やしたと言えますか? –

1

ストロークの幅を0に設定することが望ましいと思います。これは、しばしばヘアラインと呼ばれる特別なタイプの線を生成する。基本的には、可能な限り細い線(インクジェットプリンタからの液滴の幅またはレーザプリンタ内のレーザの幅)を印刷するようにプリンタに指示します。あなたが期待どおりにすべてのPDFビューアに表示されるかどうかはわかりませんが、とにかく印刷してみてください。

+0

Damianさんに感謝します。線幅が0の場合、私の助けにはならないようです。 AM例として、私は、具体的にこれを使用しています: grid_pattern.add(shapes.Line(_temp_x、_temp_y、_temp_x、 (_temp_y + _height_of_box)、 strokeWidth = 0、 strokeColor = colors.pink)) –

+0

MEHそれは非常にうまく貼り付けられませんでした。元の投稿を編集します。 –

2

これをあなたのやり方にどのように適用するかは正確にはわかりませんが、伝統的なポストスクリプトの方法では、デバイスの座標を整数に丸めることです。

/roundpoint { % x y -> x' y' 
    transform %convert user-space coords to device-space coords 
    round 
    itransform %convert device-space back to user-space 
} def 

... 
x y roundpoint moveto 
x y roundpoint lineto 
... 

すべての行がデバイスピクセルに対して一貫して配置されている場合は、一貫して描画する必要があります。

関連する問題