iTextSharp 调整每个页面的大小以适应页面大小
iTextSharp Resize each page to fit the pagesize
我有一个 .pdf 文档,例如有 7 页。我把这个文件分成了7个.pdf文件,也就是说每个文件只有一页。但主要是我需要调整页面的内容。所以删除空格、边距、调整大小。你有一些简单的建议吗?我添加了图像链接以及拆分 pdf 文档的代码。感谢您的回复。
输入:
http://i.imgur.com/tgQK3hI.png
期望的输出:
http://i.imgur.com/v6cZDwg.png
代码:
public void PdfSplitDocument(string filename)
{
String path = "C:/Doc/" + filename;
String result = "d:/output/result";
PdfCopy copy;
PdfReader reader = new PdfReader(path);
for (int i = 1; i <= reader.NumberOfPages; i++)
{
Document document = new Document(PageSize.A4, 0, 0, 0, 0);
copy = new PdfCopy(document, new FileStream(result + i + ".pdf", FileMode.Create));
document.Open();
copy.AddPage(copy.GetImportedPage(reader, i));
document.Close();
}
}
查看 ShowTextMargins example. It uses the TextMarginFinder class 以查找找到文本的边距。在这个例子中,摘自我的书 "iText in Action - Second Edition",我使用这个 class 来绘制一个矩形:
public void addMarginRectangle(String src, String dest)
throws IOException, DocumentException {
PdfReader reader = new PdfReader(src);
PdfReaderContentParser parser = new PdfReaderContentParser(reader);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(RESULT));
TextMarginFinder finder;
for (int i = 1; i <= reader.getNumberOfPages(); i++) {
finder = parser.processContent(i, new TextMarginFinder());
PdfContentByte cb = stamper.getOverContent(i);
cb.rectangle(finder.getLlx(), finder.getLly(),
finder.getWidth(), finder.getHeight());
cb.stroke();
}
stamper.close();
reader.close();
}
在您的情况下,您想根据矩形裁剪页面。您有一个 finder
对象,它允许您获取左下角的坐标(llx 和 lly)和右上角的坐标(urx 和 ury)。您可以使用这些坐标来裁剪页面,就像在 CropPages 示例中所做的那样:
public void manipulatePdf(String src, String dest)
throws IOException, DocumentException {
PdfReader reader = new PdfReader(src);
int n = reader.getNumberOfPages();
PdfDictionary pageDict;
PdfRectangle rect = new PdfRectangle(llx, lly, urx, ury);
for (int i = 1; i <= n; i++) {
pageDict = reader.getPageN(i);
pageDict.put(PdfName.CROPBOX, rect);
}
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
stamper.close();
reader.close();
}
另一种选择是更改媒体框而不是裁剪框:
pageDict.put(PdfName.MEDIABOX, rect);
可以在此处找到这些示例的 C# 版本:
我有一个 .pdf 文档,例如有 7 页。我把这个文件分成了7个.pdf文件,也就是说每个文件只有一页。但主要是我需要调整页面的内容。所以删除空格、边距、调整大小。你有一些简单的建议吗?我添加了图像链接以及拆分 pdf 文档的代码。感谢您的回复。
输入:
http://i.imgur.com/tgQK3hI.png
期望的输出:
http://i.imgur.com/v6cZDwg.png
代码:
public void PdfSplitDocument(string filename)
{
String path = "C:/Doc/" + filename;
String result = "d:/output/result";
PdfCopy copy;
PdfReader reader = new PdfReader(path);
for (int i = 1; i <= reader.NumberOfPages; i++)
{
Document document = new Document(PageSize.A4, 0, 0, 0, 0);
copy = new PdfCopy(document, new FileStream(result + i + ".pdf", FileMode.Create));
document.Open();
copy.AddPage(copy.GetImportedPage(reader, i));
document.Close();
}
}
查看 ShowTextMargins example. It uses the TextMarginFinder class 以查找找到文本的边距。在这个例子中,摘自我的书 "iText in Action - Second Edition",我使用这个 class 来绘制一个矩形:
public void addMarginRectangle(String src, String dest)
throws IOException, DocumentException {
PdfReader reader = new PdfReader(src);
PdfReaderContentParser parser = new PdfReaderContentParser(reader);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(RESULT));
TextMarginFinder finder;
for (int i = 1; i <= reader.getNumberOfPages(); i++) {
finder = parser.processContent(i, new TextMarginFinder());
PdfContentByte cb = stamper.getOverContent(i);
cb.rectangle(finder.getLlx(), finder.getLly(),
finder.getWidth(), finder.getHeight());
cb.stroke();
}
stamper.close();
reader.close();
}
在您的情况下,您想根据矩形裁剪页面。您有一个 finder
对象,它允许您获取左下角的坐标(llx 和 lly)和右上角的坐标(urx 和 ury)。您可以使用这些坐标来裁剪页面,就像在 CropPages 示例中所做的那样:
public void manipulatePdf(String src, String dest)
throws IOException, DocumentException {
PdfReader reader = new PdfReader(src);
int n = reader.getNumberOfPages();
PdfDictionary pageDict;
PdfRectangle rect = new PdfRectangle(llx, lly, urx, ury);
for (int i = 1; i <= n; i++) {
pageDict = reader.getPageN(i);
pageDict.put(PdfName.CROPBOX, rect);
}
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
stamper.close();
reader.close();
}
另一种选择是更改媒体框而不是裁剪框:
pageDict.put(PdfName.MEDIABOX, rect);
可以在此处找到这些示例的 C# 版本: