【问题标题】:crop Left side of pdf using Itextsharp使用 Itextsharp 裁剪 pdf 的左侧
【发布时间】:2015-01-27 13:02:54
【问题描述】:

我正在尝试将 pdf 的左侧裁剪为 10 毫米。我用下面的代码 公共无效TrimLeft(字符串源文件路径,字符串输出文件路径) {

        PdfReader pdfReader = new PdfReader(sourceFilePath);
        float  width =(float) GetPDFwidth(sourceFilePath);
        float height = (float)GetPDFHeight(sourceFilePath);
        float widthTo_Trim = iTextSharp.text.Utilities.MillimetersToPoints(10);
        // Set which part of the source document will be copied.

        // PdfRectangel(bottom-left-x, bottom-left-y, upper-right-x, upper-right-y)

        PdfRectangle rect = new PdfRectangle(0, 0, width - widthTo_Trim, height);
        PdfRectangle rectLeftside = new PdfRectangle(0,0,width - widthTo_Trim, height);
        using (var output = new FileStream(outputFilePath, FileMode.CreateNew, FileAccess.Write))
        {
            // Create a new document
            Document doc = new Document();

            // Make a copy of the document
            PdfSmartCopy smartCopy = new PdfSmartCopy(doc, output);

            // Open the newly created document
            doc.Open();

            // Loop through all pages of the source document
            for (int i = 1; i <= pdfReader.NumberOfPages; i++)
            {
                // Get a page
                var page = pdfReader.GetPageN(i);

                // Apply the rectangle filter we created
                page.Put(PdfName.CROPBOX, rectLeftside);
                page.Put(PdfName.MEDIABOX, rectLeftside);

                // Copy the content and insert into the new document
                var copiedPage = smartCopy.GetImportedPage(pdfReader, i);
                smartCopy.AddPage(copiedPage);
            }

            // Close the output document
            doc.Close();

        }
    }

它的 pdf 的裁剪 RHS。我试着改变坐标 PdfRectangle rectLeftside = new PdfRectangle(0,0,width - widthTo_Trim, height); 但无法得到想要的结果。 我如何裁剪 X mm 左侧

【问题讨论】:

  • A 这是PdfStamper 的任务,而不是PdfCopy 类。 B你试过PdfRectangle rectLeftside = new PdfRectangle(widthTo_Trim,0,width - widthTo_Trim, height);吗?
  • 通过使用 PdfRectangle rectLeftside = new PdfRectangle(widthTo_Trim, 0, width, height);得到解决方案
  • 您可能希望自己回答这个问题。
  • 好的,所以我从我们的 cmets 那里得到了答案。

标签: pdf itextsharp


【解决方案1】:

将 cmets 中的提示作为实际答案...

您可以像这样创建新的裁剪框矩形:

PdfRectangle rectLeftside = new PdfRectangle(0,0,width - widthTo_Trim, height);

有问题的构造函数是:

/**
 * Constructs a <CODE>PdfRectangle</CODE>-object.
 *
 * @param       llx         lower left x
 * @param       lly         lower left y
 * @param       urx         upper right x
 * @param       ury         upper right y
 */
...
public PdfRectangle(float llx, float lly, float urx, float ury)

因此,假设您的原始 PDF 有一个左下角坐标为 (0,0) 的裁剪框,您的代码将操纵右上角的 x,即框的右侧。另一方面,您实际上想要操纵左侧。因此,你应该使用类似的东西:

PdfRectangle rectLeftside = new PdfRectangle(widthTo_Trim, 0, width, height);

在 cmets 中提示之后,这也是 OP 的解决方案。

其他改进

使用 PdfStamper

OP 使用 PdfSmartCopy 实例及其方法 GetImportedPage裁剪 pdf 的左侧。 虽然这已经比使用普通的 PdfWriter 更好地完成此任务,但处理单个 PDF 的最佳选择通常是 PdfStamper:您不必再复制任何内容,只需应用更改即可。此外,内部的结果更像是原始的。

逐页确定框

他的代码中的 OP 假设

  1. PDF 中所有页面的恒定大小(他在他的方法 GetPDFwidthGetPDFHeight 中确定)和
  2. 所有页面上当前裁剪框的左下角坐标不变 (0,0)。

这些假设都不适用于所有 PDF。因此,应该分别检索和操作每一页的裁剪框。

代码

public void TrimLeftImproved(string sourceFilePath, string outputFilePath)
{
    PdfReader pdfReader = new PdfReader(sourceFilePath);
    float widthTo_Trim = iTextSharp.text.Utilities.MillimetersToPoints(10);

    using (FileStream output = new FileStream(outputFilePath, FileMode.Create, FileAccess.Write))
    using (PdfStamper pdfStamper = new PdfStamper(pdfReader, output))
    {
        for (int page = 1; page <= pdfReader.NumberOfPages; page++)
        {
            Rectangle cropBox = pdfReader.GetCropBox(page);
            cropBox.Left += widthTo_Trim;
            pdfReader.GetPageN(page).Put(PdfName.CROPBOX, new PdfRectangle(cropBox));
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-29
    • 2013-08-28
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 2011-08-13
    • 2016-10-18
    • 1970-01-01
    相关资源
    最近更新 更多