2016-03-24 20 views
0

Pdf formatlama ile ilgili bir sorunum var. Zaten pdf dosyasına metin ekliyorum ama sorun var - pdf nasıl görüneceğini bilmiyorum. Demek istediğim, bir şablondan çok fazla ve bir pdf üzerinde iyi bir yer ekliyorum, ancak başka bir metin üzerinde bazı önemli bilgileri kapsıyorum.Pdf'de pdf biçimlendirme

/** 
* metoda dodaje podpis do pdf 
* @param fileDokument 
* @throws DocumentException 
* @throws IOException 
* @throws SQLException 
*/ 
private void addSignatureToPdf(FileDokument fileDokument) throws DocumentException, IOException, SQLException { 
    java.util.Date dateToFind = Calendar.getInstance().getTime(); 
    DecimalFormat df = new DecimalFormat("00"); 
    DateTime dt = new DateTime(); 
    int year = dt.getYear(); 
    int month = dt.getMonthOfYear(); 
    int day = dt.getDayOfMonth(); 

    File f = new File(fileDokument.getFileNazwa()); 

    String operator = produkt.getOperatorProwadzacyForRolaAndDate(dateToFind, 5).toString(); 
    operator = operator.replaceAll("\\(.*\\)", "").trim(); 

    PdfReader reader = new PdfReader(""+fileDokument.getFileNazwaFile()); 
    int height = (int) reader.getPageSize(1).getHeight(); 
    int width = (int) reader.getPageSize(1).getWidth(); 
    int fontSize = getFontSizeAdjustingToScreenSize(height); 
    int marginCompatibility = getMarginCompatibilityAdjustingToScreenSize(width); 
    int heightBelow = getHeightBelowAdjustingToScreenSize(width); 

    File outFile = File.createTempFile("pismo_", ".pdf", MainApp.tmpDir); 

    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(outFile)); 
    BaseFont bf = BaseFont.createFont(BaseFont.TIMES_ITALIC, codingType, false); 
    PdfContentByte over; 

    int total = reader.getNumberOfPages() + 1; 
    for (int a = 1; a < total; a++) { 
     stamper.setRotateContents(false); 
     over = stamper.getOverContent(a); 
     over.beginText(); 
     over.setFontAndSize(bf,fontSize); 
     over.setTextMatrix(marginCompatibility, heightBelow); 
     over.showText("Za zgodność z oryginałem Radca Prawny " + operator + ", Wrocław, dnia " + df.format(day) + "-" + df.format(month) + "-" + year + "r. .................. (podpis)"); 
     over.endText(); 
    } 
    stamper.close(); 
    MainApp.openFile(outFile); 

} 

Benim fikrim biraz daha küçük yapmak ve her zaman boş olacak ve herhangi bir metin kapsamaz TextField eklemek için pdf ölçek etmektir. Başka fikirlere yardımcı olabilir misiniz, lütfen?

+1

bir sayfada boş alan bulmak için ölçeklendirilmeden denemek isterseniz, [Bu cevap] (http onu aramak nasıl: // stackoverflow.com/a/26503289/1729265) ilginizi çekebilir. – mkl

+0

Sadece sayfanın altına metin eklemek istiyorum. Bu kodu, yalnızca metnin altındaki boş alanları bulmaya çalışacak şekilde değiştirebilirdim ancak ilk fikrimce daha karmaşık görünüyor. Yine de teşekkürler! – Michu93

+1

Bu durumda lütfen [bu yanıt] 'a bakın (http://stackoverflow.com/a/34419296/1729265). ITextSharp ve C# içindir, ancak tercüme edilmesi kolay olmalıdır. Çeviri konusunda yardıma ihtiyacınız varsa, lütfen söyleyin. – mkl

cevap

2

Gerçekten teşekkürler mkl ve @Bruno Lowagie!

Final cevap:

/** 
* method to shrink pdf file 
* @param writer 
* @param stamper 
* @param reader 
* @param page 
* @param factor 
* @throws IOException 
*/ 
private void shrink(com.itextpdf.text.pdf.PdfStamper stamper, int page, float factor) throws IOException 
{ 
    com.itextpdf.text.Rectangle crop = stamper.getReader().getCropBox(page); 
    float diffX = crop.getRight() * (1 - factor); 
    float diffY = crop.getTop() * (1 - factor); 
    com.itextpdf.text.pdf.PdfDictionary pageN = stamper.getReader().getPageN(page); 
    stamper.markUsed(pageN); 
    com.itextpdf.text.pdf.PdfArray ar = null; 
    com.itextpdf.text.pdf.PdfObject content = com.itextpdf.text.pdf.PdfReader.getPdfObject(pageN.get(com.itextpdf.text.pdf.PdfName.CONTENTS), pageN); 
    if(content == null) 
     return; 
    if(content.isArray()) 
    { 
     ar = new com.itextpdf.text.pdf.PdfArray((com.itextpdf.text.pdf.PdfArray)content); 
     pageN.put(com.itextpdf.text.pdf.PdfName.CONTENTS, ar); 
    } 
    else if(content.isStream()) 
    { 
     ar = new com.itextpdf.text.pdf.PdfArray(); 
     ar.add(pageN.get(com.itextpdf.text.pdf.PdfName.CONTENTS)); 
     pageN.put(com.itextpdf.text.pdf.PdfName.CONTENTS, ar); 
    } 
    else 
     return; 
    com.itextpdf.text.pdf.ByteBuffer out_p = new com.itextpdf.text.pdf.ByteBuffer(); 
    out_p.append(factor).append(" 0 0 ").append(factor).append(' ').append(diffX).append(" ").append(diffY).append(" cm "); 
    com.itextpdf.text.pdf.PdfStream stream = new com.itextpdf.text.pdf.PdfStream(out_p.toByteArray()); 
    ar.addFirst(stamper.getWriter().addToBody(stream).getIndirectReference()); 
    out_p.reset(); 
} 

/* 
* method adding box with "Za zgodnosc..." on the bottom of the page 
*/ 
private void addBoxToPage(com.itextpdf.text.pdf.PdfReader reader, int page, float factor, com.itextpdf.text.pdf.PdfStamper stamper, String operator) throws com.itextpdf.text.DocumentException { 
    DecimalFormat df = new DecimalFormat("00"); 
    DateTime dt = new DateTime(); 
    int year = dt.getYear(); 
    int month = dt.getMonthOfYear(); 
    int day = dt.getDayOfMonth(); 
    com.itextpdf.text.Rectangle box = reader.getCropBox(page); 
    box.setTop(box.getTop() - factor * box.getHeight()); 
    com.itextpdf.text.pdf.PdfContentByte cb = stamper.getOverContent(page); 
    cb.setColorFill(BaseColor.YELLOW); 
    cb.setColorStroke(BaseColor.RED); 
    cb.rectangle(box.getLeft(), box.getBottom(), box.getWidth(), box.getHeight()); 
    cb.fillStroke(); 
    cb.setColorFill(BaseColor.BLACK); 
    ColumnText ct = new ColumnText(cb); 
    ct.addElement(new Paragraph("Za zgodność z oryginałem Radca Prawny " + operator + ", Wrocław, dnia " + df.format(day) + "-" + df.format(month) + "-" + year + "r. .................. (podpis)")); 
    ct.setSimpleColumn(box); 
    ct.go(); 
} 

ve ben

int total = reader.getNumberOfPages() + 1; 
    for (int a = 1; a < total; a++) { 
     shrink(stamper, a, factor); 
     addBoxToPage(reader, a, factor, stamper, operator); 
    } 
+1

Aslında, "PdfWriter yazıcısı" için ek bir parametre sağlamanız gerekmez, aynen C#/iTextSharp yönteminde olduğu gibi [kaynak yanıtı] 'da (http://stackoverflow.com/a/34419296/1729265) "stamper.getWriter()" kullanarak "stamper" dan yazar. – mkl

+0

Okuyucu için aynı mı? Ben ek parametre okuyucusu yerine stamper.getReader() kullanabilirim? – Michu93

+1

Düzeltdiğim en az 2 hata yaptınız: "CONTENTS" yerine "CONTENT" ifadesini kullandınız ve "diffX" ile "diffY" arasında bir boşluk karakteri eklemeyi unuttunuz. Cm operatörü, 6 işleneni gerektirir ve "diffX" ile "diffY" arasındaki bir alanı unuttuğunuzda, yalnızca 5 işleneniniz vardır. Bu geçersiz PDF sözdizimi. Ayrıca: 'kırpma' sıfır ise ne yapacaksınız? Sayfa ek açıklamaları içeriyorsa ne yapacaksınız? Bunu düşündünüz mü? –