2016-04-14 39 views
0

İçeriği kırpmadan mevcut PDF belgesine yeni bir sayfa boyutu ayarlamak istiyorum. Aşağıdaki kodu yazıyorum ama sadece PDF dosyamı alttan keserek içerik kaybına yol açıyor.Java IText kullanarak mevcut PDF belgesine yeni sayfa boyutu ayarlama

Geçerli boyut 8.26 "X 11.69" ve bunu 8.5 "X 11" yapmam gerekiyor.

Kodum yalnızca 11.59 - 11 dönüştürür. 8.26 değiştirmeye çalışıyorum ancak ıslanma.

Herhangi biri yardımcı olabilir mi? Java ile itextpdf-5.5.8 kullanıyorum.

import com.itextpdf.text.DocumentException; 
import com.itextpdf.text.pdf.GrayColor; 
import com.itextpdf.text.pdf.PdfArray; 
import com.itextpdf.text.pdf.PdfContentByte; 
import com.itextpdf.text.pdf.PdfDictionary; 
import com.itextpdf.text.pdf.PdfName; 
import com.itextpdf.text.pdf.PdfNumber; 
import com.itextpdf.text.pdf.PdfReader; 
import com.itextpdf.text.pdf.PdfRectangle; 
import com.itextpdf.text.pdf.PdfStamper; 

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 



public class PageSize { 

    public static final String SRC = "C:/Temp/BC.pdf"; 
    public static final String DEST = "C:/Temp/BC_New.pdf"; 

    public static void main(String[] args) throws IOException, DocumentException { 
     File file = new File(DEST); 
     file.getParentFile().mkdirs(); 
     new PageSize().manipulatePdf(SRC, DEST); 
    } 

    public void manipulatePdf(String src, String dest) throws IOException, DocumentException { 
     PdfReader reader = new PdfReader(src); 
     int n = reader.getNumberOfPages(); 
     PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest)); 
     // properties 
     PdfContentByte over; 
     PdfDictionary pageDict; 
     PdfRectangle rect = new PdfRectangle(55, 76, 560, 816); 
     PdfArray mediabox; 
     float llx, lly, ury,llz; 
     // loop over every page 
     for (int i = 1; i <= n; i++) { 
      pageDict = reader.getPageN(i); 
      mediabox = pageDict.getAsArray(PdfName.MEDIABOX); 
      llx = mediabox.getAsNumber(0).floatValue(); 
      lly = mediabox.getAsNumber(1).floatValue(); 
      llz = mediabox.getAsNumber(2).floatValue(); 
      ury = mediabox.getAsNumber(3).floatValue(); 
      mediabox.set(1, new PdfNumber((lly + 50))); 
      over = stamper.getOverContent(i); 
      over.saveState(); 
         over.restoreState(); 
     } 



     stamper.close(); 
     reader.close(); 
    } 
} 

İşte GÜNCELLEME Ben 11'e" 11,69" azaltmak için kullanılan koddur. İyi çalışıyor. Ama, bu genişlik 8,26 8.5"

import com.itextpdf.text.DocumentException; 
import com.itextpdf.text.pdf.GrayColor; 
import com.itextpdf.text.pdf.PdfArray; 
import com.itextpdf.text.pdf.PdfContentByte; 
import com.itextpdf.text.pdf.PdfDictionary; 
import com.itextpdf.text.pdf.PdfName; 
import com.itextpdf.text.pdf.PdfNumber; 
import com.itextpdf.text.pdf.PdfReader; 
import com.itextpdf.text.pdf.PdfRectangle; 
import com.itextpdf.text.pdf.PdfStamper; 

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 



public class PageSize { 

    public static final String SRC = "C:/Temp/Test.pdf"; 
    public static final String DEST = "C:/Temp/BC_New.pdf"; 

    public static void main(String[] args) throws IOException, DocumentException { 
     File file = new File(DEST); 
     file.getParentFile().mkdirs(); 
     new PageSize().manipulatePdf(SRC, DEST); 
    } 

    public void manipulatePdf(String src, String dest) throws IOException, DocumentException { 
     PdfReader reader = new PdfReader(src); 
     int n = reader.getNumberOfPages(); 
     PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest)); 
     // properties 
     PdfContentByte over; 
     PdfDictionary pageDict; 
     PdfArray mediabox; 
     float llx, lly, ury,llz; 
     // loop over every page 
     for (int i = 1; i <= n; i++) { 
      pageDict = reader.getPageN(i); 
      mediabox = pageDict.getAsArray(PdfName.MEDIABOX); 
      llx = mediabox.getAsNumber(0).floatValue(); 
      lly = mediabox.getAsNumber(1).floatValue(); 
      ury = mediabox.getAsNumber(3).floatValue(); 
      mediabox.set(0, new PdfNumber((llx - 17))); 
      mediabox.set(1, new PdfNumber((lly + 50))); 
      over = stamper.getOverContent(i); 
      over.saveState(); 
         over.restoreState(); 
     } 



     stamper.close(); 
     reader.close(); 
    } 
} 

ÇÖZÜLDÜ artmaz.

Ben değiştirmeye çalışıyordum kaynak dosyada bir sorun oldu orijinal kaynak dosyası bir 8.26 oldu "X 11.69". Bir hava programı, dosyaya bir logo ekler ve yeni bir dosyaya kaydeder.

Bir şekilde bu dönüştürme nedeniyle, yeni kaynak dosyanın X ekseni kilitlendi ve dolayısıyla programım değiştirilemedi. x ekseni:

Bu yüzden, programımı ilk adım olarak taşıyorum ve işe yaradı. Programım önce x ve y eksenini değiştirir ve daha sonra dosyayı logosunu ekleyen diğer programa geçirir.

Bunun için Bruno'ya teşekkürler. :)

+0

"Java ile iText-2.1.4 kullanıyorum" diyorsunuz. Kodunuz "import com.itextpdf.text" yazıyor. Bu bir çelişkidir. Kodunuz iText 5 kodudur. IText 2.1.4 ile kullanamazsınız. IText 2.1.4'ü kullanmamalısınız. Daha fazla bilgi için [Can iText 2.1.7 veya daha önce ticari olarak kullanılabilir mi?] Cevabını okuyun (http://developers.itextpdf.com/question/can-itext-217-orlier-be-used-commercially) –

+0

Oh. Benim Bad, her ikisini de kullandığım kütüphaneler yerleştirdim ve kafam karıştı. Sorumu güncellendi. Onun itextpdf-5.5.8. Cevap için teşekkürler. Kodumda herhangi bir öneri veya gelişme var mı? – Techidiot

cevap

1

İçeriği değiştirmeden sayfa boyutunu değiştiriyorsunuz.

İçeriği daraltmak istiyorsanız, daha karmaşık kodlara ihtiyacınız vardır. Örnek için Shrinking the contents of a pdf page'a bakın. bir örnek resmi belgelerinde de var: Eğer içeriği büyütmek istiyorsanız How to shrink pages in an existing PDF?

PdfReader reader = new PdfReader(src); 
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest)); 
int n = reader.getNumberOfPages(); 
PdfDictionary page; 
PdfArray crop; 
PdfArray media; 
for (int p = 1; p <= n; p++) { 
    page = reader.getPageN(p); 
    media = page.getAsArray(PdfName.CROPBOX); 
    if (media == null) { 
     media = page.getAsArray(PdfName.MEDIABOX); 
    } 
    crop = new PdfArray(); 
    crop.add(new PdfNumber(0)); 
    crop.add(new PdfNumber(0)); 
    crop.add(new PdfNumber(media.getAsNumber(2).floatValue()/2)); 
    crop.add(new PdfNumber(media.getAsNumber(3).floatValue()/2)); 
    page.put(PdfName.MEDIABOX, crop); 
    page.put(PdfName.CROPBOX, crop); 
    stamper.getUnderContent(p).setLiteral("\nq 0.5 0 0 0.5 0 0 cm\nq\n"); 
    stamper.getOverContent(p).setLiteral("\nQ\nQ\n"); 
} 
stamper.close(); 
reader.close(); 

, o zaman sadece UserUnit değiştirebilir. UserUnit değiştirilmesi, resmi belgelerinde açıklanmıştır: (biz factor olarak tanımlanan şey bu çünkü) bir faktör 2.5 ile sayfayı ve içeriğini büyütmek olacaktır How to rotate and scale pages in an existing PDF?

float factor = 2.5f; 
PdfReader reader = new PdfReader(src); 
int n = reader.getNumberOfPages(); 
PdfDictionary page; 
for (int p = 1; p <= n; p++) { 
    page = reader.getPageN(p); 
    if (page.getAsNumber(PdfName.USERUNIT) == null) 
     page.put(PdfName.USERUNIT, new PdfNumber(factor)); 
} 
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest)); 
stamper.close(); 
reader.close(); 

Bu kodu. senin güncellemede

GÜNCELLEME

, bu vardır: Böyle yaparak

mediabox = pageDict.getAsArray(PdfName.MEDIABOX); 
    llx = mediabox.getAsNumber(0).floatValue(); 
    lly = mediabox.getAsNumber(1).floatValue(); 
    ury = mediabox.getAsNumber(3).floatValue(); 
    mediabox.set(0, new PdfNumber((llx - 17))); 
    mediabox.set(1, new PdfNumber((lly + 50))); 

, sen x yönde (llx -17) içinde 0,236111 inç eklemek ve y yönde 0,69445 inç çıkarma. Bunun 11.69 ila 11 inç arasında değiştiğini söylerseniz, Y yönünden söz ettiğinizi varsayalım. X yönündeki orijinal genişlik orijinal olarak 8.26 ise, yaklaşık 8.50 olmalıdır.

Sorununuzu anlamıyorum.Tabii ki: hesaplamalarm, belgenizde hiçbir CropBox bulunmadığını varsayar. Bir CropBox mevcut mu?

+0

Kod için teşekkürler. Denedim, ancak sayfa boyutumu faktörü ile küçültüyor. Önce sayfa boyutunu Letter, yani "8.5" X 11 "e ayarlayıp doğrudan içeriğe eklemek için herhangi bir doğrudan yol var mı? Geçerli sayfa boyutum A4, yani 8.26 "X 11.69". – Techidiot

+0

Ya sorularınızı anlamıyorum ya da PDF'yi anlamıyorsunuz. Bir PDF sayfasındaki içerik düzeltildi. Her karakterin sayfada sabit bir konumu vardır. Sayfa boyutunu değiştiremez ve içeriğin yeniden akıtılmasını umut edemezsiniz. PDF bunun için yapılmadı. PDF'yi bir Word işlem formatı ile karıştırıyorsunuz. –

+0

Anlayışım, A4 boyutunda bir PDF alacağım, içeriğini okuyacağım, Letter boyutunda yeni bir PDF dosyası oluşturacağım, içeriğini ona ekleyeceğim ve içeriğe sığacak. Sanırım benim varsayımım yeterince yakın değildi. Elde etmeye çalıştığım şey, A4 boyutunda bir PDF dosyası alacağım ve aynı içerikte ve benzer düzende Letter boyutunda olmasını istedim. Orijinal yazıdan bahsettiğim yaklaşımla, 11.69'dan 11'e 11 'e değil, "8.26'yı" daraltabiliyorum. Bunu elle yapıp yapamayacağınızı (https://forums.adobe.com/thread/1269098?tstart=0) yapıp yapamayacağınızı, neden kodla yapılmadığını düşündüm. – Techidiot