iText合并、缩放和旋转现有pdf中的页面

iText合并、缩放和旋转现有pdf中的页面,pdf,itext,Pdf,Itext,我想浓缩现有的pdf文件,并将其缩放和旋转到A4肖像页。今天,我用pdfWriter完成了这项工作: for (int pageNum = 1; pageNum <= numberOfPages; pageNum++) { PdfImportedPage importedPage = writer.getImportedPage( reader, pageNum ); AffineTransform transform = getAffineTransform(reader

我想浓缩现有的pdf文件,并将其缩放和旋转到A4肖像页。今天,我用pdfWriter完成了这项工作:

for (int pageNum = 1; pageNum <= numberOfPages; pageNum++) {
    PdfImportedPage importedPage = writer.getImportedPage( reader, pageNum );
    AffineTransform transform = getAffineTransform(reader, writer, pageNum);
    pdfContentByte.addTemplate(importedPage, transform);
    document.newPage();
}


private AffineTransform getAffineTransform(PdfReader reader, PdfWriter writer, int pageNum) {
    Rectangle readerPageSize = reader.getPageSize( pageNum );
    Rectangle writerPageSize = writer.getPageSize();

    float rPageHeight = readerPageSize.getHeight();
    float rPageWidth = readerPageSize.getWidth();

    float wPageHeight = writerPageSize.getHeight();
    float wPageWidth = writerPageSize.getWidth();

    int pageRotation = reader.getPageRotation( pageNum );

    boolean rotate = (rPageWidth > rPageHeight) && (pageRotation == 0 || pageRotation == 180);
    if(!rotate)
        rotate = ((rPageHeight > rPageWidth) && (pageRotation == 90 || pageRotation ==270));
    //if changing rotation gives us better space rotate an extra 90 degrees.
    if(rotate) pageRotation += 90;
    double randrotate = (double)pageRotation * Math.PI/(double)180;

    AffineTransform transform = new AffineTransform();
    float margin = 0;
    float scale = 1.0f;
    if(pageRotation == 90 || pageRotation == 270 ){
        scale = Math.min((wPageHeight - 2 * margin) / rPageWidth, (wPageWidth- 2 * margin) / rPageHeight);
    } else {
        scale = Math.min(wPageHeight / rPageHeight, wPageWidth / rPageWidth);
    }

    transform.translate((wPageWidth/2) + margin, wPageHeight/2 + margin);
    transform.rotate(-randrotate);
    transform.scale(scale,scale);
    transform.translate(-rPageWidth/2,-rPageHeight/2);
    return transform;
}
for(int pageNum=1;pageNum rPageHeight)和&(pageRotation==0 | | pageRotation==180);
如果(!旋转)
旋转=((rPageHeight>rPageWidth)和&(pageRotation==90 | | pageRotation==270));
//如果改变旋转给了我们更好的空间,再旋转90度。
如果(旋转)页面旋转+=90;
双随机旋转=(双)页面旋转*数学PI/(双)180;
仿射变换=新仿射变换();
浮动幅度=0;
浮动刻度=1.0f;
如果(页面旋转==90 | |页面旋转==270){
比例=数学最小值((wPageHeight-2*边距)/rPageWidth,(wPageWidth-2*边距)/rPageHeight);
}否则{
比例=数学最小值(wPageHeight/rPageHeight,wPageWidth/rPageWidth);
}
transform.translate((wPageWidth/2)+边距,wPageHeight/2+边距);
transform.rotate(-randrotate);
变换。缩放(缩放,缩放);
transform.translate(-rPageWidth/2,-rPageHeight/2);
回归变换;
}
这很好,但会删除图层(OCG)和注释。
是否可以使其与层(OCG)和注释一起工作?这是用于打印的,所以我只需要pdf来显示相同的内容,实际上我不需要图层或注释。

我需要检查,但如果您只关心外观,可以先使用PdfStamper展平pdf。PdfStamper#设置xxxflattening(真)。或者,在iText7中,这些类型的操作应该更容易:setxxflatting(true)似乎可以工作。目前有太多的代码需要升级到itext7,而且每次我在pdf代码中更改某些内容时,总会有一些内容出现问题。好吧,看看你的代码,你似乎使用了很多低级方法(直接使用PdfWriter和PdfContentByte是一种赠品),这些通常会导致非常脆弱的代码库,除非您完全确定自己在做什么。我建议您使用存在于更高抽象级别(如PdfCopy)的对象,但我需要检查您是否可以将其与旋转需求结合起来。