Merhabalar,

İleride bir yazılım firmasına iş görüşmesine giderseniz ve size Java'da pdf ile ilgili bir sıkıntımız var, pdf'in gösterilmesini istiyoruz ancak indirilmesini istemiyoruz derlerse...

Aşşağıdaki kodumdan ve vereceğim tavsiyelerden yararlanabilirsiniz.

Öncelikle kullanacak olduğumuz kütüphaneden bahsetmek isterim. Kullanacak olduğumuz kütüphane iText kütüphanesidir. iText kütüphanesine http://itextpdf.com adresinden ulaşabilir, api hakkında detaylı bilgi edinebilirsiniz.


Ben Java'da Netbeans kullanmayı tercih ediyorum. Üniversiteden gelen bir alışkanlık...


File > New Project > Java Web > Web Application ile yeni bir proje yaratıyoruz. Name and location kısmında vereceğimiz ismi giriyoruz. Server and Settings kısmında "Enable Contexts and Dependency Injection"'ı tiklemenizde fayda var.


Kodumuzdan bahsetmeden önce, benim izlediğim yoldan bahsetmek isterim. Ben genellikle kütüphaneleri ilk başta import etmeyi tercih etmiyorum. Netbeans, beni hangi kütüphaneleri eklemem gerektiğini uyardığında eklemeleri gerçekleştiriyorum. Bunun artıları ve eksileri tartışılır...



Document document = new Document(PageSize.A4);
ile yeni bir döküman oluşturuyoruz, bu dökümanın PageSize'ını A4 olarak seçtik. Daha sonra;


PdfReader pdfReader = new PdfReader("C:\\emin.pdf");
ile, okunmasını istediğimiz pdf dosyasını ekliyoruz.


PdfWriter.getInstance(document,
          new FileOutputStream("C:\\output.pdf"));

ile, düzenlenen pdf dosyamızın çıktı adını oluşturuyoruz. Bunu neden yaptığımızı anlatmakta fayda var, pdf'e özellik kazandırmak, pdf'i oluştururken mevcuttur. Bu yüzden mevcut pdflerde düzenleme yapmak için, mevcut pdf'i yeniden düzenlemek gerekmektedir.


ByteArrayOutputStream baos = new ByteArrayOutputStream();
            PdfWriter writer1 = PdfWriter.getInstance(document, baos);
ile stream oluşturup, bunu dokuman ile bağlıyoruz ve pdf yazma işlemimizin classını oluşturuyoruz.


writer1.setViewerPreferences(PdfWriter.PageModeFullScreen | PdfWriter.NonFullScreenPageModeUseThumbs| PdfWriter.AllowCopy | PdfWriter.AllowPrinting);
ile gösterilecek pdf'imizin özelliklerini tayin ediyoruz. Kopyala yapıştır ile çıkmadığı için görünmüyor ancak AllowCopy ve AllowPrinting'in üzerinde çizgiler var..


AllowCopy ve Allow Printing özelliğini "şifrelenmiş" pdflerde kullanabiliyoruz. Bu yüzden şu aşamada hazırladığımız pdf doyası işaretleri görünmese de klavyeden CTRL + S, CTRL + P işlemlerine açık durumdadır.

Klavyede belli tuşları pasifize etmemiz ise mümkün. KeyEvent ile oldukça basit bir şekilde halledebiliriz.



document.open();
PdfContentByte cb = writer1.getDirectContent();


PdfReader reader = new PdfReader(pdfReader);

for(int i=1; i<=pdfReader.getNumberOfPages(); i++)
{
PdfImportedPage page = writer1.getImportedPage(reader, i); 


document.newPage();
cb.addTemplate(page, 0, 1);
}
ile dökümanımızdaki sayfa sayısı kadar yeni sayfa oluşturduk.
PdfImportedPage page = writer1.getImportedPage(reader, i);
i yerine 1 kullanırsanız, sadece 1 sayfayı oluşturacaktır.


document.add(new Paragraph("my timestamp")); 

document.close();
Eğer dökümana yazı eklemek istersek, yeni bir Pragraf oluşturup ekleme işlemimizi yapyoruz.



Kodun tamamı :


package servletpack;

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfImportedPage;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class Read extends HttpServlet 
{

    
    
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
       try {
            
           
            Document document = new Document(PageSize.A4);
            
            
            PdfReader pdfReader = new PdfReader("C:\\Users\\SERVER\\Documents\\NetBeansProjects\\SecurePdf\\src\\java\\servletpack\\emin.pdf");
            
            PdfWriter.getInstance(document,
          new FileOutputStream("C:\\Users\\SERVER\\Documents\\NetBeansProjects\\SecurePdf\\src\\java\\servletpack\\output7.pdf"));
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            PdfWriter writer1 = PdfWriter.getInstance(document, baos);
            
            writer1.setViewerPreferences(PdfWriter.PageModeFullScreen | PdfWriter.NonFullScreenPageModeUseThumbs| PdfWriter.AllowCopy | PdfWriter.AllowPrinting);
            
            

document.open();
PdfContentByte cb = writer1.getDirectContent();


PdfReader reader = new PdfReader(pdfReader);

for(int i=1; i<=pdfReader.getNumberOfPages(); i++)
{
PdfImportedPage page = writer1.getImportedPage(reader, i); 


document.newPage();
cb.addTemplate(page, 0, 1);
}

document.add(new Paragraph("my timestamp")); 

document.close();
           
 
            
            response.setHeader("Expires", "0");
            response.setHeader("Cache-Control",
                "must-revalidate, post-check=0, pre-check=0");
            response.setHeader("Pragma", "public");
            
            response.setContentType("application/pdf");
            
            response.setContentLength(baos.size());
           
            OutputStream os = response.getOutputStream();
            baos.writeTo(os);
            os.flush();
            os.close();
            
            
        }
        catch(DocumentException e) {
            throw new IOException(e.getMessage());
        }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    
    @Override
    public String getServletInfo() {
        return "Short description";
    }
}


Nasıl çalıştıracaksınız ?


Projeyi Netbeans üzerinden çalıştıracaksanız, JSP sayfanızı run etmeniz ve JSP Sayfanız/Servlet Uygulama adınızı yazmanız yeterli.

Eğer, sunucunuzda çalıştıracaksanız, dosyanızı oluşturup, dist klasörünüzdeki .war dosyanızı, java applicationlara yüklemeniz gerekmektedir.




İyi çalışmalar.