2012-11-07 52 views
7

Xin chào Tôi đang sử dụng PDF sắc nét để in đầu vào của người dùng vào các vị trí trong tài liệu mẫu.C# PDF Vị trí sắc nét trong tài liệu

Dữ liệu (trường) được thu thập từ người dùng (trang web) và được viết ở vị trí thích hợp trên tài liệu bằng cách sử dụng phương thức rút gọn.

Hiện tại, tôi đang tìm vị trí Pixel của từng trường mẫu trong mỗi trang bằng thử và sai. Sẽ dễ dàng hơn nhiều nếu có cách xác định vị trí pixel của từng trường trong trang pdf.

Mọi đề xuất sẽ hữu ích nhất.

nhờ

Trả lời

4

Khi tôi sử dụng PDF Sharp, cách tiếp cận của tôi là làm cho việc sử dụng struct XUnit và để tham khảo các điểm trên bên trái của tài liệu như điểm khởi đầu của tôi cho X/Y vị trí.

Rõ ràng tham chiếu điểm trên cùng bên trái của tài liệu (0,0) cho mọi phần tử trên PdfPage sẽ bị lộn xộn. Để chống lại điều này, tôi đã sử dụng lớp XRect để tạo các hình chữ nhật cho các phần tử nằm bên trong. Khi XRect được vẽ lên trang, bạn có thể tham khảo vị trí X/Y của rectange thông qua các thuộc tính của XRect. Sau đó, với một số toán học cơ bản bằng cách sử dụng các tọa độ và chiều rộng/chiều cao của XRect, bạn sẽ có thể tính toán tọa độ cho vị trí của phần tử tiếp theo bạn muốn thêm vào PdfPage.

Làm theo mẫu mã này, tôi đã cung cấp bản phác thảo sơ lược về kết quả cuối cùng. Mã chưa được kiểm tra nhưng rất dựa trên mã sản xuất ngay bây giờ.

// 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)); 

Và kết quả: Mock up of the rendered output

Cuối cùng, tôi chắc chắn rằng bạn đang nhận thức, nhưng có một nguồn lực tốt của PDFSharp mẫu here.

0

Tệp PDF không có pixel và không có vị trí pixel.
Bạn có thể in các trang PDF (sử dụng tùy chọn kích thước "Kích thước thực") và đo vị trí bằng thước kẻ (điều này hoạt động khá tốt với các máy in của chúng tôi).
Hoặc bạn có thể sử dụng Adobe Acrobat để đo vị trí của các mục trên trang PDF.

Một chút thử và lỗi vẫn còn như bạn có thể phải đưa ra hoặc mất nửa milimet.
Tùy thuộc vào người cai trị của bạn, bạn có thể sử dụng XUnit.FromMillimeter hoặc XUnit.FromInch để nhận vị trí điểm cho PDFsharp (nhưng điểm không có pixel).

Các mẫu PDFSharp hiện tại đang ở đây:
http://www.pdfsharp.net/wiki/PDFsharpSamples.ashx

9

tôi đã có vấn đề tương tự như bạn, josephj1989, và tôi thấy những gì tôi tin là câu trả lời của chúng tôi.

Theo this page trong tài liệu PDFSharp,

Việc thực hiện hiện tại của PDFSharp chỉ có một bố cục của bối cảnh đồ họa. Nguồn gốc (0, 0) ở trên cùng bên trái và các tọa độ phát triển từ phải sang trái. Đơn vị đo luôn là điểm (1/72 inch).

Vì vậy, giả sử tôi muốn vẽ một hình ảnh cách 3 inch từ bên trái và 7.5 inch từ phía trên cùng của một trang 8,5 x 11, sau đó tôi sẽ làm một cái gì đó như thế này:

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); 

Tôi đã thử nghiệm này ra bản thân mình với một hình ảnh mã vạch, và tôi phát hiện ra rằng khi bạn sử dụng công thức của họ để đo vị trí, bạn có thể nhận được một mức độ chính xác tại, tốt, 1/72 inch. Không tệ. Vì vậy, tại thời điểm này, nó sẽ là tốt để tạo ra một số loại đóng gói cho các phép đo như vậy để chúng tôi tập trung chủ yếu vào nhiệm vụ trong tầm tay và không phải là chi tiết của chuyển đổi.

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

Chúng ta có thể tiếp tục làm giúp việc khác theo cách này ...

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

Với phương pháp helper như vậy, chúng ta có thể làm điều này với các mẫu mã theo thời gian:

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); 

Tôi hy vọng điều này là hữu ích. Tôi chắc chắn bạn sẽ viết mã sạch hơn so với những gì có trong ví dụ của tôi. Ngoài ra, có lẽ có nhiều cách thông minh hơn để đơn giản hóa quy trình này, nhưng tôi chỉ muốn đặt một thứ gì đó ở đây sẽ sử dụng ngay lập tức những gì chúng ta đã thấy trong tài liệu.

Tạo PDF vui vẻ!

Các vấn đề liên quan