Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将两个pdf页面合并并旋转为一个页面itext_Java_Pdf_Itext - Fatal编程技术网

Java 如何将两个pdf页面合并并旋转为一个页面itext

Java 如何将两个pdf页面合并并旋转为一个页面itext,java,pdf,itext,Java,Pdf,Itext,我正在尝试创建合并三个pdf的java应用程序。前两个pdf我合并了法线,没有调整大小和旋转。最后一个pdf我想旋转并将两个pdf页面放入一个pdf页面 我使用了iText 5.5.13。我尝试合并两个pdf文件,它的作品 public void mergePdf(List<File> pdfFiles, File outputFile) { try { Document document = new Document(); FileOutpu

我正在尝试创建合并三个pdf的java应用程序。前两个pdf我合并了法线,没有调整大小和旋转。最后一个pdf我想旋转并将两个pdf页面放入一个pdf页面

我使用了iText 5.5.13。我尝试合并两个pdf文件,它的作品

public void mergePdf(List<File> pdfFiles, File outputFile) {
    try {
        Document document = new Document();
        FileOutputStream outputStream = new FileOutputStream(outputFile);
        PdfCopy copy = new PdfSmartCopy(document, outputStream);
        document.open();
        for (File inFile : pdfFiles) {
            PdfReader reader = new PdfReader(inFile.getAbsolutePath());
            copy.addDocument(reader);
            reader.close();
        }
        document.close();
    } catch (DocumentException | IOException ex) {
        ex.printStackTrace();
    }
}
public void合并PDF(列出PDF文件,文件输出文件){
试一试{
文档=新文档();
FileOutputStream outputStream=新的FileOutputStream(outputFile);
PdfCopy copy=新的PdfSmartCopy(文档、输出流);
document.open();
用于(文件填充:pdfFiles){
PdfReader reader=新的PdfReader(infle.getAbsolutePath());
副本。添加文件(读卡器);
reader.close();
}
document.close();
}捕获(DocumentException | IOException ex){
例如printStackTrace();
}
}
我不知道如何使用“旋转”将两页合并为一个pdf页并调整其大小。

合并:

public void mergeTwoPagesIntoOne(String originalPdfFile, String outputPdfFile) throws IOException, DocumentException {
    PdfReader reader = new PdfReader(originalPdfFile);
    Document doc = new Document(new RectangleReadOnly(842f, 595f), 0, 0, 0, 0);
    PdfWriter writer = PdfWriter.getInstance(doc, new FileOutputStream(outputPdfFile));
    doc.open();
    int totalPages = reader.getNumberOfPages();
    for (int i = 1; i <= totalPages; 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();
        if (i > 1)
            documentHeight = documentHeight - 50f;

        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 = 0f;

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

        if (i+1 <= totalPages) {
            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;
            cb.addTemplate(page2, scale, 0, 0, scale, offsetX, offsetY);
        }
    }
    doc.close();
}
public void mergeTwoPagesIntoOne(字符串originalPDFile,字符串outputPdfFile)引发IOException,DocumentException{
PdfReader reader=新PdfReader(原始PdfReader文件);
文档文档=新文档(新矩形只读(842f,595f),0,0,0,0);
PdfWriter writer=PdfWriter.getInstance(doc,新文件outputstream(outputpdfile));
doc.open();
int totalPages=reader.getNumberOfPages();
对于(int i=1;i 1)
文档高度=文档高度-50f;
float pageWidth=page.getWidth();
float pageHeight=page.getHeight();
浮动宽度比例=文档宽度/页面宽度;
浮动高度刻度=文档高度/页面高度;
浮动比例=数学最小值(宽度比例、高度比例);
float offsetX=(documentWidth-(pageWidth*scale))/2;
浮动偏移量=0f;
cb.addTemplate(页面,比例,0,0,比例,偏移量x,偏移量);

如果(i+1通常,您希望将每一页转换为一个XObject(在@mflorczak的答案中的PdfImportedPage),并将其中两页绘制到一个页面中

如果您事先知道所有页面的大小和形状都相同,那么您可以事先决定并对它们的显示方式进行硬编码。如果不知道,您需要能够以通用方式处理大量可能的组合

这被称为“打印”,如果你想了解更多,互联网上有很多关于它的文章。你的特别例子是“2-up”打印

  • 获取要合并的页面的大小
  • 在输出文档中创建一个新页面,其大小足以容纳这两个页面
  • 创建要导入的页面的
    pdfiimportedpage
    s
  • 在输出页面的
    PdfContentByte
    上绘制所需对齐和旋转的导入页面
  • 转到1
  • 遥不可及
  • 利润
  • 您可能想尝试一下比例尺和偏移量(以及可能的旋转)与@mflorczak的答案中所提供的相比,上面的一般理论应该有助于指导您。
    PdfImportedPage
    应该将您与源页面的旋转隔离开来,这样您只需要考虑它们的效果边界

        public void rotatePdf(String originalPdfFile, String outputPdfFile, int degrees) throws IOException, DocumentException {
        PdfReader reader = new PdfReader(originalPdfFile);
        for (int i = 1; i <= reader.getNumberOfPages(); i++) {
            PdfDictionary dictionary = reader.getPageN(i);
            dictionary.put(PdfName.ROTATE, new PdfNumber(degrees));
        }
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(outputPdfFile));
        stamper.close();
        reader.close();
    }