iText PDF方向

时间:2017-02-01 03:20:42

标签: 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 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();
  }
 }
}

2 个答案:

答案 0 :(得分:1)

您参考&#34; itextpdf版本5.0.1&#34; - 那个版本非常陈旧,我多年没有使用它了;我在下面针对当前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();
}

SubDocument.java测试方法testExtractSubDocument

将输入文档中的页面2,3和4写入结果文档。

附注:即使对于不那么简单的用例,例如从多个源PDF收集页面,使用您的方法是次优的;而不是PdfWriter应该使用Pdf*Copy*类系列中的一个类,该类也正确地复制页面旋转。

答案 1 :(得分:0)

以下代码解决了我的问题

with open('fahrenheit_monthly_readings.tsv','r') as f:
    in_memory_table = {'header':next(f).split()}
    in_memory_table['rows'] = list(map(str.split, f))