Servlets iText 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;

我正在使用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 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
的实现。我无法理解您想要说的内容。您能更详细地解释一下吗?