Servlets iText PDF定向
我正在使用itextpdf版本5.0.1将页面剪切为指定的页码。当我尝试剪切面向横向的PDF时,遇到了一个问题。当我使用下面的代码时,面向横向的pdf像面向potrait的pdf一样被剪切,其余的都丢失了。我使用的代码是:Servlets iText PDF定向,servlets,itext,Servlets,Itext,我正在使用itextpdf版本5.0.1将页面剪切为指定的页码。当我尝试剪切面向横向的PDF时,遇到了一个问题。当我使用下面的代码时,面向横向的pdf像面向potrait的pdf一样被剪切,其余的都丢失了。我使用的代码是: import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import com.itextpdf.text.Document;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfImportedPage;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfWriter;
public class PDFSplitExample {
static void splitPdfFile(InputStream inputPdf,
OutputStream outputStream, int startPage,
int endPage) throws Exception{
//Create document and pdfReader objects.
Document document = new Document();
PdfReader pdfReader = new PdfReader(inputPdf);
//Get total no. of pages in the pdf file.
int totalPages = pdfReader.getNumberOfPages();
//Check the startPage should not be greater than the endPage
//and endPage should not be greater than total no. of pages.
if(startPage > endPage || endPage > totalPages) {
System.out.println("Kindly pass the valid values " +
"for startPage and endPage.");
}else{
// Create writer for the outputStream
PdfWriter writer =
PdfWriter.getInstance(document, outputStream);
//Open document
document.open();
//Contain the pdf data.
PdfContentByte pdfContentByte =
writer.getDirectContent();
PdfImportedPage page;
while(startPage <= endPage) {
document.newPage();
page=writer.getImportedPage(pdfReader, startPage);
pdfContentByte.addTemplate(page, 0, 0);
startPage++;
}
//Close document and outputStream.
outputStream.flush();
document.close();
outputStream.close();
}
}
public static void main(String args[]){
try {
//Prepare output stream for
//new pdf file after split process.
OutputStream outputStream1 =
new FileOutputStream("SplitFile1.pdf");
OutputStream outputStream2 =
new FileOutputStream("SplitFile2.pdf");
//call method to split pdf file.
splitPdfFile(new FileInputStream("TestFile.pdf"),
outputStream1, 1, 10);
splitPdfFile(new FileInputStream("TestFile.pdf"),
outputStream2, 11, 20);
System.out.println("Pdf file splitted successfully.");
} catch (Exception e) {
e.printStackTrace();
}
}
}
import java.io.FileInputStream;
导入java.io.FileOutputStream;
导入java.io.InputStream;
导入java.io.OutputStream;
导入com.itextpdf.text.Document;
导入com.itextpdf.text.pdf.PdfContentByte;
导入com.itextpdf.text.pdf.pdf导入页面;
导入com.itextpdf.text.pdf.PdfReader;
导入com.itextpdf.text.pdf.PdfWriter;
公共类PDFSpliteSample{
静态无效拆分PDF文件(InputStream inputPdf,
OutputStream OutputStream,int起始页,
int endPage)引发异常{
//创建文档和pdfReader对象。
文档=新文档();
PdfReader PdfReader=新PdfReader(输入PDF);
//获取pdf文件中的总页数。
int totalPages=pdfReader.getNumberOfPages();
//检查起始页不应大于结束页
//和endPage不应大于总页数。
如果(起始页>结束页| |结束页>总页){
System.out.println(“请传递有效值”+
“用于起始页和结束页。”);
}否则{
//为outputStream创建编写器
PdfWriter writer=
getInstance(文档,outputStream);
//打开文件
document.open();
//包含pdf数据。
PdfContentByte PdfContentByte=
writer.getDirectContent();
PDF导入页面;
虽然(startPage您引用了“itextpdf版本5.0.1”-该版本非常旧,我已经很久没有使用它了;我针对当前的5.x版本iText(5.5.11开发分支)编写了下面的代码。对于旧版本,它可能也不需要或只需要很少的更改
实际上,您的splitPdfFile
方法提取给定文档的一部分。而不是您的方法(将页面内容逐页复制到新的PDF),只将现有文档限制为其自身的子集要容易得多。此外,这种方法的优点是,它不必单独处理与页面内容无关的属性,例如页面旋转
例如,这段代码
try ( InputStream resource = [...];
OutputStream result = [...])
{
PdfReader pdfReader = new PdfReader(resource);
pdfReader.selectPages("2-4");
new PdfStamper(pdfReader, result).close();
}
(测试方法testExtractSubDocument
)
将输入文档中的第2、3和4页写入结果文档
旁注:即使对于不太简单的用例,例如从多个源Pdf收集页面,使用您的方法也是次优的;与其使用PdfWriter
,不如使用Pdf*Copy*
类家族中的类,这些类也可以正确复制页面旋转。以下代码解决了我的问题
private static void manipulateWithCopy(PdfReader reader,String result)
throws IOException, DocumentException {
int n = reader.getNumberOfPages();
Document document = new Document();
PdfCopy copy = new PdfCopy(document, new FileOutputStream(result));
document.open();
for (int i = 0; i < n;) {
copy.addPage(copy.getImportedPage(reader, ++i));
}
document.close();
}
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try{
String path= "path/of/the/file/in/the/smb/storage";
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(null, "username", "password");//storing authentication details
SmbFile sFile = new SmbFile(path, auth);
FileOutputStream fileOutputStream;
InputStream fileInputStream;
String destFilename = "path/to/the/file";
fileOutputStream = new FileOutputStream(destFilename);
fileInputStream = sFile.getInputStream();
byte[] buf;
int len;
buf = new byte[16 * 1024 * 1024];
while ((len = fileInputStream.read(buf)) > 0) {
fileOutputStream.write(buf, 0, len);
}
InputStream inputPdf = new FileInputStream(destFilename);
PdfReader reader= new PdfReader(inputPdf);
reader.selectPages(stpg+"-"+endpg);
manipulateWithCopy(reader,destFilename);
reader.close();
}
catch(Exception e){
System.out.println(e);
}
}
private static void manufactureWithCopy(PDF阅读器,字符串结果)
抛出IOException,DocumentException{
int n=reader.getNumberOfPages();
文档=新文档();
PdfCopy copy=新PdfCopy(文档、新文件输出流(结果));
document.open();
对于(int i=0;i0){
写入(buf,0,len);
}
InputStream inputPdf=新文件InputStream(destFilename);
PdfReader reader=新PdfReader(inputPdf);
阅读器。选择页面(stpg+“-”+endpg);
操纵WithCopy(读卡器,文件名);
reader.close();
}
捕获(例外e){
系统输出打印ln(e);
}
}
对于您的任务,您应该真正使用基于PdfCopy
的实现(其中一个优点是不需要您控制页面旋转),而不是基于PdfWriter
的实现。我无法理解您想要说的内容。您能更详细地解释一下吗?