2013-07-08 51 views
7

Tôi đang sử dụng C# và iTextSharp để thêm một watermark để tập tin PDF của tôi:Làm cách nào để thêm hình mờ vào một tệp PDF?

Document document = new Document(); 
PdfReader pdfReader = new PdfReader(strFileLocation); 
PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(strFileLocationOut, FileMode.Create, FileAccess.Write, FileShare.None)); 
iTextSharp.text.Image img = iTextSharp.text.Image.GetInstance(WatermarkLocation); 
img.SetAbsolutePosition(100, 300); 
PdfContentByte waterMark; 
//  
for (int pageIndex = 1; pageIndex <= pdfReader.NumberOfPages; pageIndex++) 
{ 
    waterMark = pdfStamper.GetOverContent(pageIndex); 
    waterMark.AddImage(img); 
} 
// 
pdfStamper.FormFlattening = true; 
pdfStamper.Close(); 

Nó hoạt động tốt, nhưng vấn đề của tôi là trong một số tập tin PDF không có watermark được thêm mặc dù kích thước tập tin tăng lên, bất kỳ ý tưởng ?

+0

Tất cả các tệp PDF của bạn có cùng hộp phương tiện và hộp cắt không? Có thể là vị trí '(100, 300) 'nằm ngoài các hộp này không? –

+0

vị trí là chính xác, tôi kiểm tra nó. – Abady

+0

Và tọa độ của hộp phương tiện/cắt khi không nhìn thấy hình mờ là gì? –

Trả lời

7

Thực tế là kích thước tệp tăng là dấu hiệu tốt cho biết hình mờ được thêm vào. Vấn đề chính là bạn đang thêm hình mờ bên ngoài vùng hiển thị của trang. Xem How to position text relative to page using iText?

Bạn cần một cái gì đó như thế này:

Rectangle pagesize = reader.GetCropBox(pageIndex); 
if (pagesize == null) 
    pagesize = reader.GetMediaBox(pageIndex); 
img.SetAbsolutePosition(
    pagesize.GetLeft(), 
    pagesize.GetBottom()); 

Đó là: nếu bạn muốn thêm hình ảnh ở góc dưới bên trái của trang. Bạn có thể thêm một bù đắp, nhưng chắc chắn rằng bù đắp theo hướng x không vượt quá chiều rộng của trang, và bù đắp theo hướng y không vượt quá chiều cao của trang.

+1

Trong iText LGPL ver 4.1.6 trong Nuget, không có 'pdfReader.GetMediaBox (pageNumber)', thay vào đó là 'pdfReader.GetPageSize (pageNumber)'. Ngoài ra 'pageIndex' cho hiển thị nó bắt đầu bằng' 0'. Vì nó bắt đầu bằng '1',' pageNumber' sẽ tốt hơn. –

+0

@RosdiKasim trong khi tôi không đồng ý rằng pageIndex ngụ ý đánh chỉ mục dựa trên 0, bạn đã chính xác rằng GetMediaBox() là phương pháp sai .... bạn nên thêm chỉnh sửa này vào câu trả lời để nó sẽ chính xác hơn. GetCropBox cũng là vỏ chính xác của getCropBox – Arkaine55

0

Mặc dù tôi không biết các chi tiết cụ thể của iTextSharp, có khả năng trên các trang mà hình ảnh của bạn không hiển thị, nội dung PDF trước đó đã sửa đổi ma trận chuyển đổi hiện tại sao cho bất cứ điều gì bạn đặt trên trang được di chuyển ra khỏi trang.

Điều này có thể được khắc phục bằng cách phát hành toán tử gsave trước nội dung trang gốc và phát hành toán tử grestore sau nội dung trang gốc (nhưng trước nội dung trang của bạn). Điều này, tuy nhiên có thể không sửa chữa tất cả các trường hợp với một tài liệu PDF mà sửa đổi CTM không một gsave và không có grestore. Điều này không được cho là xảy ra theo lý thuyết, theo đặc điểm kỹ thuật PDF:

Sự xuất hiện của các toán tử Q và Q phải được cân bằng trong luồng nội dung nhất định (hoặc trong chuỗi các luồng được chỉ định trong mảng Nội dung của từ điển của trang).

nhưng tôi có thể cho bạn biết từ kinh nghiệm rằng đây không phải là trường hợp trong thực tế.

+0

OP sử dụng 'pdfStamper.GetOverContent' có nghĩa là iText bao trùm luồng nội dung hiện tại trong ** q ** và ** Q ** và thêm các bổ sung của OP sau đó, bên ngoài ** q ... Q ** và, do đó, không bị ảnh hưởng bởi bất kỳ thay đổi CTM nào như vậy. Tôi giả định @ Alexis là đúng trong giả định của mình. – mkl