2013-08-28 100 views
1

我目前正在编写一个应用程序,它使用iText 2.1.7将PDF格式“转换为”我们的需求。PDF缩放/导入已修剪/裁剪的页面

我们基本上采用肖像PDF,并缩小页面大小,因此我们可以在新PDF的一个横向页面上放置原始PDF的2页。我们还在页面底部留出一些空间用于后期处理。

这个过程的工作时间应该是90%。

但是,我们收到了由内容部门裁剪/裁剪的PDF,当我们在Acrobat中查看此PDF时,它看起来像是被重视。但是,当我们处理它时,新的PDF包含整个原始MediaBox和裁切线。

下面是我们使用的代码以及问题输出的外观。

File tempFile = new File(tempFilename); 
PdfReader reader = new PdfReader(originalPdfFile); 
Document doc = new Document(new RectangleReadOnly(842f, 595f), 0, 0, 0, 0); 
PdfWriter writer = PdfWriter.getInstance(doc, new FileOutputStream(tempFile)); 
doc.open(); 
for (int i = 1; i < reader.getNumberOfPages(); i = i + 2) { 
    doc.newPage(); 
    PdfContentByte cb = writer.getDirectContent(); 
    PdfImportedPage page = writer.getImportedPage(reader, i); // page #1 

    float documentWidth = doc.getPageSize().getWidth()/2; 
    float documentHeight = doc.getPageSize().getHeight() - 65f; 

    float pageWidth = page.getWidth(); 
    float pageHeight = page.getHeight(); 

    float widthScale = documentWidth/pageWidth; 
    float heightScale = documentHeight/pageHeight; 
    float scale = Math.min(widthScale, heightScale); 

    float offsetX = (documentWidth - (pageWidth * scale))/2; 
    float offsetY = 65f; //100f 

    cb.addTemplate(page, scale, 0, 0, scale, offsetX, offsetY); 

    PdfImportedPage page2 = writer.getImportedPage(reader, i+1); // page #2 

    pageWidth = page.getWidth(); 
    pageHeight = page.getHeight(); 

    widthScale = documentWidth/pageWidth; 
    heightScale = documentHeight/pageHeight; 
    scale = Math.min(widthScale, heightScale); 

    offsetX = ((documentWidth - (pageWidth * scale))/2) + documentWidth; 
    offsetY = 65f; //100f 

    cb.addTemplate(page2, scale, 0, 0, scale, offsetX, offsetY);//430f 
    } 

doc.close(); 

原来在Acrobat中:

enter image description here

修改杂技演员,显示不希望pretrim内容:

enter image description here

回答

1

经过很多挫折之后,我终于得到了这个工作,在做我的缩放和布局处理之前,通过“硬裁剪”PDF。

硬裁切需要Acrobat裁剪的PDF(裁剪=隐藏),并使用PdfStamper创建一个新的PDF,其中只包含裁剪框内的内容。

public String cropPdf(String pdfFilePath) throws DocumentException, IOException { 
    String filename = FilenameUtils.getBaseName(pdfFilePath) + "_cropped." + FilenameUtils.getExtension(pdfFilePath); 
    filename = FilenameUtils.concat(System.getProperty("java.io.tmpdir"), filename); 
    PdfReader reader = new PdfReader(pdfFilePath); 
    try { 
     PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(filename)); 
     try { 
      for (int i = 1; i <= reader.getNumberOfPages(); i++) { 
       PdfDictionary pdfDictionary = reader.getPageN(i); 
       PdfArray cropArray = new PdfArray(); 
       Rectangle cropbox = reader.getCropBox(i);     
       cropArray.add(new PdfNumber(cropbox.getLeft())); 
       cropArray.add(new PdfNumber(cropbox.getBottom())); 
       cropArray.add(new PdfNumber(cropbox.getLeft() + cropbox.getWidth())); 
       cropArray.add(new PdfNumber(cropbox.getBottom() + cropbox.getHeight())); 
       pdfDictionary.put(PdfName.CROPBOX, cropArray); 
       pdfDictionary.put(PdfName.MEDIABOX, cropArray); 
       pdfDictionary.put(PdfName.TRIMBOX, cropArray); 
       pdfDictionary.put(PdfName.BLEEDBOX, cropArray); 
      } 
      return filename; 
     } finally { 
      stamper.close(); 
     } 
    } finally { 
     reader.close(); 
    } 
} 
3

虽然很难没有看到PDF本身可以肯定,我怀疑你的问题是,这个PDF至少在一些指定CropBox的页面。如果是这样的话,那么我认为在获得页面引用之后你会想要做类似page.setBoundingBox(reader.getCropBox(i));的事情。

注意的默认值页面的CropBox是它的MediaBox,所以除上述线路的不应该是没有指定CropBox PDF页面的布局产生负面影响。

(我不是一个iText的用户,所以这是一个有点在我的部分猜测...)

祝你好运!

1

一个微小但重要的修复程序Kabals答案:盒预期宽度/高度,而不是坐标:

  ... 
      cropArray.add(new PdfNumber(cropbox.getLeft())); 
      cropArray.add(new PdfNumber(cropbox.getBottom())); 
      cropArray.add(new PdfNumber(cropbox.getWidth())); 
      cropArray.add(new PdfNumber(cropbox.getHeight())); 
      ...