2016-04-14 60 views
0

我想在不裁剪内容的情况下将新页面大小设置为现有PDF文档。我正在编写下面的代码,但它只是从底部裁剪我的PDF文件,导致内容丢失。使用Java IText将新页面大小设置为现有PDF文档

当前尺寸为8.26“X 11.69”,我需要将其设置为8.5“X 11”。

我的代码只将11.59转换为11。试图改变8.26,但它不是woking。

任何人都可以帮忙吗?我正在使用itextpdf-5.5.8和Java。

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(); 
    } 
} 

修订 这里是我用来减少11.69" 到11" 的代码。它工作正常。但是,它不会增加宽度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(); 
    } 
} 

解决:

这是与源文件有问题,我试图修改原始的源文件是8.26 “X 11.69”。hava程序为文件添加一个徽标并将其保存到一个新文件中。

不知何故,由于这种转换,新源文件的X轴被锁定,因此我的程序无法修改x轴

因此,我将我的程序作为第一步移动并运行。我的程序首先修改x和y轴,然后将文件传递给其他程序,该程序会添加标志。

感谢布鲁诺对此。 :)

+0

你说“我正在使用iText-2.1.4和Java”。你的代码说“import com.itextpdf.text。”这是一个矛盾。您的代码是iText 5代码。你不能在iText 2.1.4中使用它。你甚至不应该使用iText 2.1.4。有关更多信息,请阅读[iText 2.1.7或更早版本可否在商业上使用?]的答案(http://developers.itextpdf.com/question/can-itext-217-or-earlier-be-used-commercially) –

+0

哦。我的坏,我有两个图书馆放置和混淆我正在使用哪一个。更新我的问题。它的itextpdf-5.5.8。感谢您的回应。任何建议或改进我的代码? – Techidiot

回答

1

您正在更改页面大小而不更改内容。

如果你想收缩内容,那么你需要更复杂的代码。例如,请参阅Shrinking the contents of a pdf page。还有一个例子的官方文档中: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(); 

如果您想要放大的内容,那么你可以简单地改变UserUnit。更改UserUnit也被官方文档中解释: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(); 

此代码将扩展页面,其内容与2.5倍(因为这是我们定义为factor)。

UPDATE

在你的更新,你有这样的:

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))); 

通过这样做,你x方向(llx -17)添加0.236111英寸和你y方向减去0.69445英寸。如果你说这个变化为11.69到11英寸,那么我认为你在谈论Y方向。如果X方向的原始宽度原来是8.26,则应该是8.50。

我不明白你的问题。当然:我的计算假定文档中没有CropBox。是否有CropBox存在?

+0

感谢您的代码。我试过了,但它只是缩小了我的页面大小。是否有任何直接的方法来首先将页面大小设置为Letter(即8.5“X 11”),然后继续添加内容?我目前的页面尺寸是A4,即8.26“×11.69”。 – Techidiot

+0

要么我不明白你的问题,要么你不懂PDF。 PDF页面中的内容是固定的。每个角色在页面上都有固定的位置。您无法更改页面大小,并希望内容会重新排版。 PDF不是为此而制作的。您将PDF与Word处理格式混淆。 –

+0

我的理解是,我会用A4尺寸的PDF文件,阅读它的内容,创建一个带有Letter尺寸的新PDF文件,将内容添加到它并且内容应该适合。我想我的假设不够接近。我想要实现的是,我将得到一个A4尺寸的PDF文件,并且我想用相同的内容和类似的布局制作Letter尺寸的文件。采用我在原文中提到的方法,我能够将11.69缩小到11“,而不是8.26”。我想如果通过手动执行(https://forums.adobe.com/thread/1269098?tstart=0)它可行,为什么不通过代码。 – Techidiot

相关问题