我正在使用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();
}
}
}
答案 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))