gpt4 book ai didi

java - 如何同时进行pdf书写和复印?

转载 作者:行者123 更新时间:2023-12-01 13:27:08 25 4
gpt4 key购买 nike

我有以下要求:

首先我想动态创建一个 PDF。然后我想要上传 PDF 文件的选项。最后,单击打印按钮后,必须合并动态创建的文件和上传的文件。

单击打印按钮时,应使用单个方法创建 PDF 并将其与上传的 PDF 合并。

这是我到目前为止的代码。

package com.sumit.program;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Image;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.ColumnText;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfCopy;
import com.itextpdf.text.pdf.PdfCopy.PageStamp;
import com.itextpdf.text.pdf.PdfImportedPage;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfSmartCopy;

public class CopyOfMergePdf {

public static void main(String[] args) {
try {
List<InputStream> pdfs = new ArrayList<InputStream>();
pdfs.add(new FileInputStream("C:\\Documents and Settings\\Sumit\\Desktop\\NewEcnProject\\Landscape.pdf"));
pdfs.add(new FileInputStream("C:\\Documents and Settings\\Sumit\\Desktop\\client\\CoverSheet.pdf"));
pdfs.add(new FileInputStream("C:\\Documents and Settings\\Sumit\\Desktop\\client\\ECNPRINTTEST_BP.pdf"));
pdfs.add(new FileInputStream("C:\\Documents and Settings\\Sumit\\Desktop\\NewEcnProject\\Landscape.pdf"));
pdfs.add(new FileInputStream("C:\\Documents and Settings\\Sumit\\Desktop\\NewEcnProject\\Document1.pdf"));
pdfs.add(new FileInputStream("C:\\Documents and Settings\\Sumit\\Desktop\\NewEcnProject\\Landscape.pdf"));
pdfs.add(new FileInputStream("C:\\Documents and Settings\\Sumit\\Desktop\\NewEcnProject\\Portrait.pdf"));
OutputStream output = new FileOutputStream("C:\\Documents and Settings\\Sumit\\Desktop\\NewEcnProject\\merge1.pdf");
CopyOfMergePdf.concatPDFs(pdfs, output, true);
} catch (Exception e) {
e.printStackTrace();
}
}

public static void concatPDFs(List<InputStream> streamOfPDFFiles,
OutputStream outputStream, boolean paginate) {

Document document = new Document();
try {
List<InputStream> pdfs = streamOfPDFFiles;
List<PdfReader> readers = new ArrayList<PdfReader>();
int totalPages = 0;
Iterator<InputStream> iteratorPDFs = pdfs.iterator();
// Create Readers for the pdfs.
int i=1;
while (iteratorPDFs.hasNext()) {
InputStream pdf = iteratorPDFs.next();
PdfReader pdfReader = new PdfReader(pdf);
System.out.println("Page size is "+pdfReader.getPageSize(1));
readers.add(pdfReader);
totalPages += pdfReader.getNumberOfPages();
i++;
}

int j=0;
System.out.println("Total pages are "+totalPages);
// Create a writer for the outputstream
PdfCopy copy = new PdfSmartCopy(document, outputStream);
document.open();

PdfImportedPage page;
PageStamp stamp;
Chunk chunk;
BaseFont baseFont = BaseFont.createFont("arial.ttf", BaseFont.CP1252,BaseFont.EMBEDDED);
Iterator<PdfReader> iteratorPDFReader = readers.iterator();
// Loop through the PDF files and add to the output.
i=0;
PdfContentByte under;
while (iteratorPDFReader.hasNext()) {
PdfReader pdfReader = iteratorPDFReader.next();
// loop over the pages in that document
page=copy.getImportedPage(pdfReader,pdfReader.getNumberOfPages());
i=i+1;
stamp = copy.createPageStamp(page);
chunk = new Chunk(String.format("Page %d",i));
chunk.setFont(new Font(baseFont));
ColumnText.showTextAligned(stamp.getUnderContent(),
Element.ALIGN_CENTER, new Phrase(chunk),
document.getPageSize().getWidth()/2, 15, 0);

if(i==2){


}
Image watermark_image = Image.getInstance("C:\\Documents and Settings\\Sumit\\Desktop\\ecn_in_pro.png");
watermark_image.setAbsolutePosition(0,0);
under = stamp.getUnderContent();
under.addImage(watermark_image);
stamp.alterContents();
copy.addPage(page);
copy.freeReader(pdfReader);
pdfReader.close();
}

outputStream.flush();
document.close();
outputStream.close();
System.out.println("Merging of Pdfs is done.......");
} catch (Exception e) {
e.printStackTrace();
} finally {
if (document.isOpen())
document.close();
try {
if (outputStream != null)
outputStream.close();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
}

它仅将所有现有 PDF 文件复制到一个新文件中。如何将动态创建的文档添加到 PdfCopy 进程中?

最佳答案

如果您想在 PdfCopy 过程中插入空白页,您应该使用addPage()方法,采用 Rectangle 和旋转 (int) 作为参数。

如果您想插入一个包含 PdfCopy 过程中内容的“即时”页面,您需要在内存中创建一个文档,向该页面添加内容并处理该页面与处理从磁盘读取的文档的方式相同。

类似这样的事情:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
Document document = new Document();
PdfWriter.getInstance(document, baos);
document.open();
document.add(new Paragraph("This page is empty on purpose"));
document.close();
PdfReader reader = new PdfReader(boas.toByteArray());

例如,如果您想添加封面,您还需要首先在内存中创建一个文档,例如列出所有正在合并的文档。

关于java - 如何同时进行pdf书写和复印?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21757640/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com