2012-06-20 19 views
15

Mam znak wodny, który chciałbym umieścić w moim pdf. Znak wodny jest obrazem .bmp i ma rozmiar 2290 x 3026. Mam problem z próbą zmiany rozmiaru tego obrazu, aby pasował do strony, czy ktoś ma jakieś sugestie?iText Image Resize

Document document = new Document(); 
PdfWriter.getInstance(document, new FileOutputStream("result.pdf")); 
document.open(); 
document.add(new Paragraph("hello")); 
document.close(); 
PdfReader reader = new PdfReader("result.pdf"); 
int number_of_pages = reader.getNumberOfPages(); 
PdfStamper pdfStamper = new PdfStamper(reader, new FileOutputStream("result_watermark.pdf")); 
// Get the PdfContentByte type by pdfStamper. 
Image watermark_image = Image.getInstance("abstract(0307).bmp"); 
int i = 0; 
watermark_image.setAbsolutePosition(0, 0); 
watermark_image.scaleToFit(826, 1100); 
System.out.println(watermark_image.getScaledWidth()); 
System.out.println(watermark_image.getScaledHeight()); 
PdfContentByte add_watermark; 
while (i < number_of_pages) { 
    i++; 
    add_watermark = pdfStamper.getUnderContent(i); 
    add_watermark.addImage(watermark_image); 
} 
pdfStamper.close(); 

Oto wyjście dla metod getScaled().

826.0 - Width 
1091.4742 - Height 

Chciałbym podzielić się z Wami obrazem pdf, ale niestety nie mogę.

Czy powinienem spróbować użyć pliku .jpg? Naprawdę nie wiem, jak dobrze iText obsługuje różne rozszerzenia obrazu.

+0

można dodać zrzut ekranu PDF. Zobacz http://meta.stackexchange.com/questions/75491/how-to-upload-an-image-to-a-post lub http://meta.stackexchange.com/questions/57125/inserting-an-image -w-a-pre-tag – Ritesh

+0

To nie problem. Znak wodny, który dodaję, jest znakiem wodnym firmy, i nie mogę go po prostu przekazać. Dobrze mi powiedziano, że nie. – Failsafe

+1

Czy próbowałeś skalować obraz ręcznie, zamiast programowo, i użyć ręcznie skalowanego obrazu w kodzie? ponieważ wydaje się, że kodowanie na twardą skalę skalowanego wymiaru pozwoli zaoszczędzić trochę przetwarzania za każdym razem, gdy znak wodny zostanie przesłany do znaku wodnego. –

Odpowiedz

7

Można użyć innego podejścia: zmiana rozmiaru obrazu „ręcznie” (to znaczy poprzez przetwarzanie obrazu oprogramowanie) zamiast programowo przez iText.

Ponieważ ostateczny wymiar wydaje się być zakodowany na stałe, można użyć już skalowanego obrazu i zaoszczędzić sobie trochę czasu przetwarzania za każdym razem, gdy znak wodny zostanie oznaczony znakiem wodnym.

40

robię to tak:

//if you would have a chapter indentation 
int indentation = 0; 
//whatever 
Image image = coolPic; 

float scaler = ((document.getPageSize().getWidth() - document.leftMargin() 
       - document.rightMargin() - indentation)/image.getWidth()) * 100; 

image.scalePercent(scaler); 

Maybe starym stylu, ale to działa na mnie;)

+0

Niestety to nie działa dla mnie. Najbliższe, jakie kiedykolwiek miałem, to: watermark_image.scalePercent (110 * 72/300); – Failsafe

+0

Czy możesz opisać dokładnie, jaki masz problem? skalowanie nie działa - ok, ale jakie jest twoje wyjście z skalerem, którego używasz w tym czasie !? –

+1

To podejście sprawdziło się lepiej niż pomysł zaproponowany przez Alexis, ponieważ domyślne skalowanie ma dość niską rozdzielczość, więc jeśli zmienisz rozmiar oryginalnego obrazu tak, aby pasował do dokumentu PDF, otrzymasz pikselowany obraz o niskiej rozdzielczości z odpowiednikiem 72 dpi. Ale dzięki skalowaniu możesz użyć znacznie większego rozmiaru obrazu dopasowanego do rozmiaru, ale zachowując wysoką rozdzielczość. – Ted

17

użycie

watermark_image.scaleAbsolute(826, 1100); 

zamiast

watermark_image.scaleToFit(826, 1100); 
10

można użyć

imageInstance.scaleAbsolute(requiredWidth, requiredHeight); 
+0

Dzięki @ Coach005, proste, ale wspaniałe !!!, głosowałem w górę. Pozdrawiam –

8

Tylko w przypadku, gdy wysokość obrazu przekracza wysokość dokumentu:

float documentWidth = document.getPageSize().width() - document.leftMargin() - document.rightMargin(); 
float documentHeight = document.getPageSize().height() - document.topMargin() - document.bottomMargin(); 
image.scaleToFit(documentWidth, documentHeight); 
+0

To dobrze. Po prostu pisanie 'image.scaleToFit (PageSize.A4.getWidth(), PageSize.A4.getHeight());' może prowadzić większe obrazy, aby wyjść poza granicę strony –

0
Document document = new Document(); 
    PdfWriter.getInstance(document, new FileOutputStream("F:\\Directory1\\sample1.pdf")); 
    document.open(); 

    Image img = Image.getInstance("F:\\Server\\Xyz\\WebContent\\ImageRestoring\\Rohit.jpg"); 
    img.scaleToFit(200, 200); 
    document.add(new Paragraph("Sample 1: This is simple image demo.")); 
    document.add(img); 
    document.close(); 
    System.out.println("Done"); 

// Powyższy program działa perfekcyjnie, skalując obraz, mam nadzieję, że będzie on również idealny, a my możemy przeskalować dowolny format obrazu.

+0

Czy możesz skomentować, dlaczego rozwiązuje pięcioletni problem z zaakceptowanym odpowiedzieć lepiej niż inne podane odpowiedzi? –

+0

Stary to za pracę, którą rzuciłem 5 lat temu ... Dlaczego nawet zadałeś sobie trud, by odpowiedzieć na to pytanie? – Failsafe

+0

Przepraszam za odpowiedź późno, ale zacząłem profesjonalnie pracować w ciągu tych 5 miesięcy i miałem dużo pomocy z tej strony, więc nauczyłem, powinienem spłacić coś na tej stronie, aż do mojej zdolności. –