2013-07-08 16 views
7

Sto usando C# e iTextSharp per aggiungere una filigrana ai miei file PDF:Come aggiungere una filigrana a un file 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(); 

Funziona bene, ma il mio problema è che in alcuni file PDF non viene aggiunto alcun filigrana, anche se la dimensione del file è aumentato, qualche idea ?

+0

Tutti i file PDF hanno lo stesso mediabox e cropbox? Potrebbe essere che la posizione '(100, 300)' è al di fuori di queste caselle? –

+0

la posizione è corretta, la provo. – Abady

+0

E quali sono le coordinate dei contenitori multimediali/ritaglio quando non è visibile la filigrana? –

risposta

7

Il fatto che la dimensione del file aumenti è una buona indicazione dell'aggiunta della filigrana. Il problema principale è che stai aggiungendo la filigrana all'esterno dell'area visibile della pagina. Vedere How to position text relative to page using iText?

Hai bisogno di qualcosa di simile:

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

Cioè: se si desidera aggiungere l'immagine nell'angolo in basso a sinistra della pagina. È possibile aggiungere un offset, ma assicurarsi che l'offset nella direzione x non superi la larghezza della pagina e che l'offset nella direzione y non superi l'altezza della pagina.

+1

In iText LGPL ver 4.1.6 in Nuget, non c'è 'pdfReader.GetMediaBox (pageNumber)', invece c'è 'pdfReader.GetPageSize (pageNumber)'. Anche 'pageIndex' dà l'impressione che inizia con' 0'. Dal momento che inizia con '1',' pageNumber' sarebbe meglio. –

+0

@RosdiKasim mentre non sono d'accordo sul fatto che pageIndex implichi l'indicizzazione basata su 0, sei corretto che GetMediaBox() sia il metodo sbagliato .... dovresti aggiungere questa modifica alla risposta in modo che sia più corretta. GetCropBox è anche l'involucro corretto di getCropBox – Arkaine55

0

Sebbene non conosca le specifiche di iTextSharp, probabilmente nelle pagine in cui l'immagine non viene visualizzata, il contenuto PDF precedente ha modificato la matrice di trasformazione corrente in modo tale che qualsiasi cosa venga inserita nella pagina venga spostata fuori dalla pagina.

Questo problema può essere risolto emettendo un operatore gsave prima del contenuto della pagina originale ed emettendo un operatore di grestore dopo il contenuto della pagina originale (ma prima del vostro). Questo, tuttavia, potrebbe non risolvere tutti i casi con un documento PDF che modifica il CTM con un salvataggio e senza grestore. Questo non dovrebbe accadere in teoria, in base alle specifiche PDF:

occorrenze del q e degli operatori Q devono essere equilibrati all'interno di un determinato flusso di contenuti (o all'interno della sequenza di flussi specificati nel Sommario matrice di un dizionario pagina).

ma posso dirvi per esperienza che questo non è il caso nella pratica.

+0

L'OP utilizza 'pdfStamper.GetOverContent', il che significa che iText avvolge il flusso di contenuti esistente in ** q ** e ** Q ** e aggiunge le aggiunte dell'OP in seguito, al di fuori del ** q ... Q ** e, quindi, non influenzato da tali modifiche al marchio comunitario. Presumo che @Alexis abbia ragione nella sua ipotesi. – mkl

Problemi correlati