Java 如何在不丢失页面大小和元信息的情况下将pdf复制到另一个pdf?
我的目标是取出pdf的第二页,并将另一个pdf的内容放入其中 我查看了其他答案,并编写了删除模板页面(第2页)的代码。然而,当我将其他页面复制到一本新书的第一集时,我得到了各种疯狂的裁剪。结果不对。我试图使用setpagesize选项,但它似乎仍然不起作用 我是不是走错方向了Java 如何在不丢失页面大小和元信息的情况下将pdf复制到另一个pdf?,java,itext,Java,Itext,我的目标是取出pdf的第二页,并将另一个pdf的内容放入其中 我查看了其他答案,并编写了删除模板页面(第2页)的代码。然而,当我将其他页面复制到一本新书的第一集时,我得到了各种疯狂的裁剪。结果不对。我试图使用setpagesize选项,但它似乎仍然不起作用 我是不是走错方向了 package com.protocase.itexthelper; import com.itextpdf.text.Document; import com.itextpdf.text.DocumentExcepti
package com.protocase.itexthelper;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfImportedPage;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author davidh
*/
public class ITextHelper {
public static void deletePage(String fileToPrune, int pageToDelete, String newFilePath) {
PdfReader pdfReader = null;
try {
pdfReader = new PdfReader(fileToPrune);
} catch (IOException ex) {
Logger.getLogger(ITextHelper.class.getName()).log(Level.SEVERE, null, ex);
}
if (pdfReader != null) {
List<Integer> pagesToKeep = new ArrayList<Integer>();
//pdfReader.getPages
for (int i = 1; i <= pdfReader.getNumberOfPages(); i++) {
if (i != pageToDelete) {
pagesToKeep.add(i);
}
}
pdfReader.selectPages(pagesToKeep);
}
PdfStamper pdfStamper = null;
try {
pdfStamper = new PdfStamper(pdfReader, new FileOutputStream(newFilePath));
} catch (FileNotFoundException ex) {
Logger.getLogger(ITextHelper.class.getName()).log(Level.SEVERE, null, ex);
} catch (DocumentException | IOException ex) {
Logger.getLogger(ITextHelper.class.getName()).log(Level.SEVERE, null, ex);
} finally {
if (pdfStamper != null) {
try {
pdfStamper.close();
} catch (DocumentException | IOException ex) {
Logger.getLogger(ITextHelper.class.getName()).log(Level.SEVERE, null, ex);
}
}
if (pdfReader != null) {
pdfReader.close();
}
}
}
// -- begin-
public static void main(String[] args) {
String fileToAddTo = "src/com/protocase/itexthelper/examplepdf/BUILD_SHEETS_O4_4USS Rev5.pdf";
String fileWithPageRemoved = "src/com/protocase/itexthelper/examplepdf/BUILD_SHEETS_O4_4USS Rev5-no page 2.pdf";
String fileToAppend = "src/com/protocase/itexthelper/examplepdf/example_component_list.pdf";
String testFile = "src/com/protocase/itexthelper/examplepdf/testfile.pdf";
deletePage(fileToAddTo, 2, testFile);
addPDFToPDF(fileWithPageRemoved, fileToAppend, testFile, 2);
}
/**
* @param originalFilePath Merge multiple pdf into one pdf
* @param fileToInsertPath
*
* @param list of pdf input stream
* @param location where you want to insert the page
* @param outputLocation output stream
* @throws DocumentException
* @throws IOException
*/
public static void addPDFToPDF(String originalFilePath, String fileToInsertPath, String outputLocation, int location) {
OutputStream out = null;
try {
out = new FileOutputStream(new File(outputLocation));
} catch (FileNotFoundException ex) {
System.out.println("ITextHelper.addPDFToPDF(): can't find output file location: "+ex);
}
Document document = new Document();
PdfWriter writer = null;
try {
writer = PdfWriter.getInstance(document, out);
} catch (DocumentException ex) {
System.out.println("ITextHelper.addPDFToPDF(): issue getting writer: "+ex);
}
document.open();
if (writer != null) {
PdfContentByte cb = writer.getDirectContent();
PdfReader originalFileReader = null;
try {
originalFileReader = new PdfReader(originalFilePath);
} catch (IOException ex) {
System.out.println("ITextHelper.addPDFToPDF(): can't read original file: " + ex);
}
PdfReader fileToAddReader = null;
try {
fileToAddReader = new PdfReader(fileToInsertPath);
} catch (IOException ex) {
System.out.println("ITextHelper.addPDFToPDF(): can't read fileToInsert: " + ex);
}
if (fileToAddReader != null && originalFileReader != null) {
for (int i = 1; i <= originalFileReader.getNumberOfPages(); i++) {
if (i == location) {
for (int j = 1; j <= fileToAddReader.getNumberOfPages(); j++) {
document.newPage();
document.setPageSize(fileToAddReader.getPageSize(j));
//import the page from source pdf
PdfImportedPage page = writer.getImportedPage(fileToAddReader, j);
//add the page to the destination pdf
cb.addTemplate(page, 0, 0);
}
}
document.newPage();
document.setPageSize(originalFileReader.getPageSize(i));
PdfImportedPage page = writer.getImportedPage(originalFileReader, i);
cb.addTemplate(page, 0, 0);
}
}
}
closeOutputStream(out, document);
}
// -- end
private static void closeOutputStream(OutputStream out, Document document) {
if (out != null) {
try {
out.flush();
} catch (IOException ex) {
System.out.println("ITextHelper.closeOutputStream(): can't flush outstream: " + ex);
}
document.close();
try {
out.close();
} catch (IOException ex) {
System.out.println("can't close outstream: " + ex);
}
}
}
}
package com.protocase.itexthelper;
导入com.itextpdf.text.Document;
导入com.itextpdf.text.DocumentException;
导入com.itextpdf.text.pdf.PdfContentByte;
导入com.itextpdf.text.pdf.pdf导入页面;
导入com.itextpdf.text.pdf.PdfReader;
导入com.itextpdf.text.pdf.PdfStamper;
导入com.itextpdf.text.pdf.PdfWriter;
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.FileNotFoundException;
导入java.io.FileOutputStream;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.OutputStream;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.logging.Level;
导入java.util.logging.Logger;
/**
*
*@author davidh
*/
公共类ITextHelper{
公共静态void deletePage(字符串fileToPrune、int pageToDelete、字符串newFilePath){
PdfReader PdfReader=null;
试一试{
pdfReader=新的pdfReader(fileToPrune);
}捕获(IOEX异常){
Logger.getLogger(ITextHelper.class.getName()).log(Level.SEVERE,null,ex);
}
如果(pdfReader!=null){
List pagestokep=new ArrayList();
//pdfReader.getPages
对于(inti=1;i所以,我看了Bruno Lowagie的书,得出了这段代码。实际上,这段代码非常完美
/**
* @param originalFilePath PDF to append to
* @param fileToInsertPath PDF to append
* @param outputFile Where to save to
* @param location where you want to insert the page
*/
public static void mergePDFs(String originalFilePath, String fileToInsertPath, String outputFile, int location) {
PdfReader originalFileReader = null;
try {
originalFileReader = new PdfReader(originalFilePath);
} catch (IOException ex) {
System.out.println("ITextHelper.addPDFToPDF(): can't read original file: " + ex);
}
PdfReader fileToAddReader = null;
try {
fileToAddReader = new PdfReader(fileToInsertPath);
} catch (IOException ex) {
System.out.println("ITextHelper.addPDFToPDF(): can't read fileToInsert: " + ex);
}
if (originalFileReader != null && fileToAddReader != null) {
// -- Copy
int numberOfOriginalPages = originalFileReader.getNumberOfPages();
Document document = new Document();
PdfCopy copy = null;
try {
copy = new PdfCopy(document, new FileOutputStream(outputFile));
document.open();
for (int i = 1; i <= numberOfOriginalPages; i++) {
if (i == location) {
for (int j = 1; j <= fileToAddReader.getNumberOfPages(); j++) {
copy.addPage(copy.getImportedPage(fileToAddReader, j));
}
}
copy.addPage(copy.getImportedPage(originalFileReader, i));
}
document.close();
} catch (DocumentException | FileNotFoundException ex) {
System.out.println("ITextHelper.addPDFToPDF(): can't read output location: " + ex);
} catch (IOException ex) {
Logger.getLogger(ITextHelper.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
/**
*@param originalFilePath要附加到的PDF
*@param fileToInsertPath要追加的PDF
*@param outputFile要保存到的位置
*@param要插入页面的位置
*/
公共静态void mergePDF(字符串原始文件路径、字符串文件到插入路径、字符串输出文件、int位置){
PdfReader originalFileReader=null;
试一试{
originalFileReader=新PDF阅读器(originalFilePath);
}捕获(IOEX异常){
System.out.println(“ITextHelper.addPDFToPDF():无法读取原始文件:”+ex);
}
PdfReader fileToAddReader=null;
试一试{
fileToAddReader=newpdfReader(fileToInsertPath);
}捕获(IOEX异常){
System.out.println(“ITextHelper.addPDFToPDF():无法读取fileToInsert:”+ex);
}
if(originalFileReader!=null&&fileToAddReader!=null){
//--抄袭
int numberoforiginalpage=originalFileReader.getNumberOfPages();
文档=新文档();
PdfCopy copy=null;
试一试{
复制=新的PdfCopy(文档,新文件输出流(输出文件));
document.open();
对于(int i=1;i)虽然您的“deletePage”看起来很合理,但您的“addPDFToPDF”使用了“PdfWriter”,这对于此类任务通常是一个不好的选择,因为它会丢失大量信息。可能是的副本。请阅读官方文档: