java - Shrink PDF pages with rotation using Rectangle in existing PDF -


i using following code shrink every pages (top , bottom) of existing pdf using itext library.

code working fine. if process result pdf, 0 value rotation of every page, while old pdf has other rotation too(i.e. 90deg).

i want keep rotation is unable it.

code using below shrink pages

public void shrinkpdfpages() throws exception {         pdfreader reader = new pdfreader("d:/testpdfs/test.pdf");          document doc = new document();         pdfwriter writer = pdfwriter.getinstance(doc, new fileoutputstream(                 "d://testpdfs/result.pdf"));         doc.open();         pdfcontentbyte cb = writer.getdirectcontent();         (int = 1; <= reader.getnumberofpages(); i++) {              pdfimportedpage page = writer.getimportedpage(reader, i);             float pageheight = reader.getpagesizewithrotation(i).getheight();             float pagewidth = reader.getpagesizewithrotation(i).getwidth();             int rotation = reader.getpagerotation(i);              rectangle pagerectangle = reader.getpagesizewithrotation(i);             rectangle pagerect = null;              system.out.println(rotation);              switch (rotation) {             case 0:                 pagerect = new rectangle(pagerectangle.getwidth(), pagerectangle                         .getheight());                 doc.setpagesize(pagerect);                 doc.newpage();                 affinetransform af = new affinetransform();                 af.scale(1, 0.84f);                 af.translate(1, 50);                  cb.addtemplate(page, af);                 break;             case 90:                 pagerect = new rectangle(pagerectangle.getwidth(), pagerectangle                         .getheight());                 doc.setpagesize(pagerect);                 doc.newpage();                  cb.addtemplate(page, 0, -1f, 0.84f, 0, 50, pageheight);                 break;             case 270:                 pagerect = new rectangle(pagerectangle.getwidth(), pagerectangle                         .getheight());                 doc.setpagesize(pagerect);                 doc.newpage();                 cb.addtemplate(page, 0, 1f, -0.84f, 0, pagewidth - 50, 0);                 break;              case 180:                 pagerect = new rectangle(pagerectangle.getwidth(), pagerectangle                         .getheight());                 doc.setpagesize(pagerect);                 doc.newpage();                 cb.addtemplate(page, -1f, 0, 0, -0.84f, pagewidth,                         pageheight - 50);                 break;             default:                 break;              }         }         doc.close();     } 

what should do? rotation remains is.

one more problem fetching is, unable preserve internal hyper links.

actual pdf page:

enter image description here

after shrink(scale down content):

enter image description here

scaling pdf make pages larger easy. shown in scalerotate example. it's matter of changing default version of user unit. default, unit 1, meaning 1 user unit equals 1 point. can increase value 75,000. larger values of user unit, result in larger pages.

unfortunately, user unit can never smaller 1, can't use technique shrink page. if want shrink page, need introduce transformation (resulting in new ctm).

this shown in shrinkpdf example. in example, take pdf named hero.pdf measures 8.26 11.69 inch, , shrink 50%, resulting in pdf named hero_shrink.pdf measures 4.13 5.85 inch.

to achieve this, need dirty hack:

public void manipulatepdf(string src, string dest) throws ioexception, documentexception {     pdfreader reader = new pdfreader(src);     pdfstamper stamper = new pdfstamper(reader, new fileoutputstream(dest));     int n = reader.getnumberofpages();     pdfdictionary page;     pdfarray crop;     pdfarray media;     (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(); } 

we loop on every page , take crop box of each page. if there no crop box, take media box. these boxes stored arrays of 4 numbers. in example, assume first 2 numbers 0 , divide next 2 values 2 shrink page 50% (if first 2 values not zero, you'll need more elaborate formula).

once have new array, change media box , crop box array, , introduce ctm scales content down 50%. need use setliteral() method fool itext.

based on feedback in comments section, appears not understand mechanics explained in example. hence have made second example, named shrinkpdf2:

public void manipulatepdf(string src, string dest) throws ioexception, documentexception {     pdfreader reader = new pdfreader(src);     pdfstamper stamper = new pdfstamper(reader, new fileoutputstream(dest));     int n = reader.getnumberofpages();     float percentage = 0.8f;     (int p = 1; p <= n; p++) {         float offsetx = (reader.getpagesize(p).getwidth() * (1 - percentage)) / 2;         float offsety = (reader.getpagesize(p).getheight() * (1 - percentage)) / 2;         stamper.getundercontent(p).setliteral(                 string.format("\nq %s 0 0 %s %s %s cm\nq\n", percentage, percentage, offsetx, offsety));         stamper.getovercontent(p).setliteral("\nq\nq\n");     }     stamper.close();     reader.close(); } 

in example, don't change page size (no changes media or crop box), shrink content (in case 80%) , center shrunken content on page, leaving bigger margins top, bottom, left , right.

as can see, matter of applying correct math. second example more simple first, introduced complexity: can change percentage (in first example hardcoded 50%. in case introduced percentage variable , defined 80%).

note apply scaling in x direction in y direction preserve aspect ratio. looking @ screen shots, looks want shrink content in y direction. instance this:

string.format("\nq 1 0 0 %s 0 %s cm\nq\n", percentage, offsety) 

feel free adapt code meet need, but... result ugly: text funny , if apply photos of people standing vertically, you'll make them fat.


Comments

Popular posts from this blog

javascript - Jquery show_hide, what to add in order to make the page scroll to the bottom of the hidden field once button is clicked -

javascript - Highcharts multi-color line -

javascript - Enter key does not work in search box -