2016-12-26 8 views
0

Код, который я использовал для водяного знака, показан ниже. Для первых двух страниц водяной знак отображается правильно, но для третьей страницы водяной знак отображается в верхнем левом углу. Когда я отлаживался, он показывал размер страницы как 692 * 712 приблизительно.Водяной знак на pdf устанавливается в верхнем левом углу вместо центра страницы

class Program 
{ 
    static string absoluteFile1Path = "filename1.pdf"; 
    static string absoluteFile2Path = "filename2.pdf"; 
    static string destination = "destinationfilename.pdf"; 

    static void Main(string[] args) 
    { 
     string[] filesPath = new string[] { absoluteFile1Path, absoluteFile2Path }; 

     PdfDocument pdfDoc = new PdfDocument(new PdfWriter(destination));    

     PdfMerger merger = new PdfMerger(pdfDoc); 

     PdfDocument srcDoc1 = new PdfDocument(new PdfReader(absoluteFile1Path)); 
     merger.Merge(srcDoc1, 1, srcDoc1.GetNumberOfPages()); 

     PdfDocument srcDoc2 = new PdfDocument(new PdfReader(absoluteFile2Path)); 
     merger.Merge(srcDoc2, 1, srcDoc2.GetNumberOfPages()); 

     pdfDoc.AddEventHandler(PdfDocumentEvent.END_PAGE, new WatermarkHandler());    

     srcDoc1.Close(); 
     srcDoc2.Close(); 

     pdfDoc.Close(); 

    } 
} 

public class WatermarkHandler : IEventHandler 
{ 
    Color lime, blue; 
    PdfFont helvetica; 
    PdfFont font; 

    public WatermarkHandler() 
    { 
     //helvetica = PdfFontFactory.CreateFont(FontConstants.HELVETICA); 
     //lime = new DeviceCmyk(0.208f, 0, 0.584f, 0); 
     //blue = new DeviceCmyk(0.445f, 0.0546f, 0, 0.0667f); 
     font = PdfFontFactory.CreateFont(FontConstants.HELVETICA); 
    } 

    public void HandleEvent(Event @event) 
    { 
     PdfDocumentEvent docEvent = (PdfDocumentEvent)@event; 

     PdfDocument pdf = docEvent.GetDocument(); 
     PdfPage page = docEvent.GetPage(); 
     int pageNumber = pdf.GetPageNumber(page); 
     Rectangle pageSize = page.GetPageSize(); 

     PdfCanvas canvas = new PdfCanvas(page.NewContentStreamAfter(), page.GetResources(), pdf); 
     PdfExtGState gs1 = new PdfExtGState().SetFillOpacity(0.9f).SetStrokeOpacity(0.3f); 
     canvas.SetExtGState(gs1); 
     new Canvas(canvas, pdf, new iText.Kernel.Geom.Rectangle(page.GetPageSize().GetWidth()/2, page.GetPageSize().GetHeight()/2)) 
       .SetFontColor(iText.Kernel.Colors.DeviceGray.LIGHT_GRAY) 
       .SetFontSize(26) 
       .SetFont(font) 
       .ShowTextAligned(new Paragraph("FOR YOUR RECORDS ONLY: DO NOT SUBMIT"), 298, 375, pdf.GetPageNumber(page), 
         TextAlignment.CENTER, VerticalAlignment.MIDDLE, 45); 

     canvas.Release(); 
    } 
} 
} 
+2

Показать нам PDF-файлы. Возможно, нижний левый угол страницы имеет координату, отличную от 'x = 0; y = 0'. Вы не учитываете это смещение. –

+0

Высота страницы или ширина страницы не могут делиться на 2 равномерно (т. Е. Нечетное число) и вызывают проблему? – mike510a

ответ

0

Без видевшего PDF я не могу быть уверен, но это скорее всего из-за одной из страниц поворота (90 или 270 градусов, если ваша третья страница имеет свою ширину и высоту перевернутая) и, таким образом, абсолютные координаты для отображения водяного знака немного на повернутых страницах.

Вы можете получить поворот страницы с помощью PdfPage#getRotation() и написать дополнительную логику для вычисления повернутых x и y на основе полученного значения. There's some info on the coordinate system used in pdfs in chapter 2 of the iText7 jumpstart tutorial.