2012-11-07 8 views
7

こんにちは私は、テンプレート文書の位置にユーザー入力を印刷するためにシャープなPDFを使用しています。C#PDF文書のシャープ位置

データ(フィールド)は、ユーザー(ウェブページ)から収集され、ドローストリング法を使用してドキュメントの適切な位置に書き込まれます。

現在、私は試行錯誤によって各ページの各テンプレートフィールドのピクセル位置を見つけています。pdfページの各フィールドのピクセル位置を決定する方法があれば、はるかに簡単です。

どのような提案が最も役立ちます。私はPDFシャープを使用する場合

おかげ

答えて

4

は、私のアプローチは、xUnitの構造体利用するようにし、X/Y位置のための私の出発点として、文書の左上の点を参照するようにしました。

明らかに、PdfPage上の各要素のドキュメント(0,0)の左上の点を参照するのは面倒です。これに対処するために、XRectクラスを使用して、要素が内部に座る矩形を作成しました。 XRectがページに描画されると、XRectのプロパティを使用して矩形のX/Y位置を参照することができます。次に、これらの座標とXRectの幅/高さを使用するいくつかの基本的な数学で、あなたはPdfPageに追加したい次の要素の位置の座標を計算できるはずです。

このコードサンプルに従うと、最終結果がどのようなものかを概略的に説明しました。コードはテストされていませんが、現在は生産現場のコードに非常に大きく依存しています。

// Create a new PDF document 
PdfDocument document = new PdfDocument(); 

// Create an empty page with the default size/orientation 
PdfPage page = document.AddPage(); 
page.Orientation = PageOrientation.Landscape; 
page.Width = XUnit.FromMillimeter(300); 
page.Height = XUnit.FromMillimeter(200); 

// Get an XGraphics object for drawing 
XGraphics gfx = XGraphics.FromPdfPage(page); 

// Add the first rectangle 
XUnit horizontalOffset = XUnit.FromMillimeter(5); 
XUnit verticalOffset = XUnit.FromMillimeter(5); 
XUnit columnWidth = XUnit.FromMillimeter(100); 
XUnit columnHeight = page.Height - (2 * verticalOffset); 
XRect columnRect = new XRect(horizontalOffset, verticalOffset, columnWidth, columnHeight); 
gfx.DrawRectangle(XBrushes.Teal, columnRect); 

// Insert an image inside the rectangle, referencing the Left and Top properties of the rectangle for image placement 
XImage topLogo = XImage.FromFile(GetFilePath(@"content\img\pdfs\standard\logo-no-strapline.jpg")); // GetFilePath is a private method, not shown for brevity 
gfx.DrawImage(topLogo, 
    columnRect.Left + XUnit.FromMillimeter(5), 
    columnRect.Top + XUnit.FromMillimeter(5), 
    columnRect.Width - XUnit.FromMillimeter(10), 
    XUnit.FromMillimeter(38)); 

そして出力: Mock up of the rendered output

最後に、私はあなたが認識していると確信しているが、PdfSharpサンプルhereの優れたリソースがあります。

0

PDFファイルにはピクセルがなく、ピクセル位置はありません。
PDFページを印刷することができます(「実際のサイズ」のサイズオプションを使用してください)、定規で位置を測定できます(これはプリンタでうまくいきます)。
または、Adobe Acrobatを使用して、PDFページ上のアイテムの位置を測定することができます。

半分のミリメートルを与えなければならないかもしれないので、試行錯誤のビットが残ります。
ルーラーに応じて、XUnit.FromMillimeterまたはXUnit.FromInchを使用して、PDFsharpのポイント位置を取得できます(ポイントはピクセルなし)。

現在PDFsharpサンプルはここにある:
http://www.pdfsharp.net/wiki/PDFsharpSamples.ashx

9

私は、あなたとjosephj1989を同じ問題を持っていた、と私は私が私達の答えであると信じるものを見つけました。

PDFSharpドキュメントのthis page

によればPDFsharpの現在の実装では、グラフィックスコンテキストの一つだけレイアウトを有しています。原点(0,0)は左上で、座標は右下がりになります。測定単位は常にポイント(1/72インチ)です。

したがって、左から3インチ、7インチの画像を描画したいとします。8.5×11ページの最上部から5インチは、その後、私はこのようなものだろう:私はバーコード画像と自分自身をこれをテストした

PdfDocument document = GetBlankPdfDocument(); 
PdfPage myPage = document.AddPage(); 
myPage.Orientation = PdfSharp.PageOrientation.Portrait; 
myPage.Width = XUnit.FromInch(8.5); 
myPage.Height = XUnit.FromInch(11); 
XImage myImage = GetSampleImage(); 

double myX = 3 * 72; 
double myY = 7.5 * 72; 
double someWidth = 126; 
double someHeight = 36; 

XGraphics gfx = XGraphics.FromPdfPage(myPage); 
gfx.DrawImage(myBarcode, myX, myY, someWidth, someHeight); 

を、そして私が見つけた、あなたが位置を測定するための彼らの公式を使用する場合、まあ、1/72インチの精度を得ることができます。悪くない。

この時点で、このような測定のためにある種のカプセル化を作成し、主に手近な作業に集中し、変換の詳細に焦点を合わせるのは良いことです。そのようなヘルパー・メソッドで

public static double GetCoordinateFromInch(double inches) 
{ 
    return inches * 72; 
} 

私たちは、このように他のヘルパーを作るために行くことができる...

public static double GetCoordinateFromCentimeter(double centimeters) 
{ 
    return centimeters * 0.39370 * 72; 
} 

、我々は前のサンプルコードでこれを行うことができます:

double myX = GetCoordinateFromInch(3); 
double myY = GetCoordinateFromInch(7.5); 
double someWidth = 126; 
double someHeight = 36; 

XGraphics gfx = XGraphics.FromPdfPage(myPage); 
gfx.DrawImage(myBarcode, myX, myY, someWidth, someHeight); 

これが参考になることを願っています。私はあなたが私の例にあるよりもきれいなコードを書くだろうと確信しています。さらに、このプロセスを合理化するためにもっとスマートな方法があるかもしれませんが、ここではドキュメントに書かれていることをすぐに利用できるようにしたいと考えています。

ハッピーPDFレンダリング!

関連する問題