为什么数据会添加到PDF内容流中?

时间:2016-09-06 14:07:42

标签: pdf itext

使用此代码(Removing Watermark from PDF iTextSharp)简单地读取和重写相同PDF的内容流时,我会为此file的内容流添加其他操作。

在内容流之前

q
 q
/I0 Do
Q

Q
 q
10 0 0 10 0 0 cm
0.1 0 0 0.1 0 0 cm
/QuickPDFXO6d1c5c37 Do
Q

内容流

之后
q
0 -1 1 0 0 1224 cm
q
q
/I0 Do
Q
Q
q
10 0 0 10 0 0 cm
0.1 0 0 0.1 0 0 cm
/QuickPDFXO6d1c5c37 Do
Q
Q

知道为什么这会附加到我的内容流中吗?

q
0 -1 1 0 0 1224 cm
....
Q

我的代码与链接的文章类似,只是我试图从内容流中删除某些项目。

XObjectRemover editor = new XObjectRemover();
List<List<PdfContentData>> output = editor.EditPageContent(stamper, pgNumber);
PdfContentByte content = stamper.GetUnderContent(pgNumber);

foreach (List<PdfContentData> bracketList in output)
{
    foreach (PdfContentData operandList in bracketList)
    {
        if (operandList.operandToDelete == false)
        {
            int index = 0;
            foreach (PdfObject op in operandList.pdfOperands)
            {
                op.ToPdf(content.PdfWriter, content.InternalBuffer);
                content.InternalBuffer.Append(operandList.pdfOperands.Count > ++index ? (byte)' ' : (byte)'\n');
            }
        }
    }
}

PdfContentData类只是所有内容操作的集合,其中一些标记为delete。

public class PdfContentData
{
    public int opNumber { get; set; }
    public PdfLiteral pdfOperator { get; set; }
    public List<PdfObject> pdfOperands { get; set; }
    public bool operandToDelete { get; set; }

    public PdfContentData(int opNum, PdfLiteral op, List<PdfObject> ops)
    {
        this.opNumber = opNum;
        this.pdfOperator = op;
        this.pdfOperands = ops;
    }

    public override string ToString()
    {
        return $"Ops: [{string.Join(",", pdfOperands.Select(p => p.ToString()).ToArray())}]   Del: [{operandToDelete}]";
    }
}

和XObjectRemover只是一个派生自PdfContentStreamEditor的类,就像@ mkl的例子中的TransparentGraphicsRemover一样。

1 个答案:

答案 0 :(得分:3)

此添加

q
0 -1 1 0 0 1224 cm
....
Q

旋转两者之间的所有内容。添加这是一项服务&#39;通过iText(夏普),您可以忽略旋转并使用更自然的坐标绘制内容。

不幸的是,这项服务对于手头的任务没有意义。因此,你应该切换它。

PdfStamper有一个标志,可以让你这样做:

/** Checks if the content is automatically adjusted to compensate
 * the original page rotation.
 * @return the auto-rotation status
 */    
/** Flags the content to be automatically adjusted to compensate
 * the original page rotation. The default is <CODE>true</CODE>.
 * @param rotateContents <CODE>true</CODE> to set auto-rotation, <CODE>false</CODE>
 * otherwise
 */    
virtual public bool RotateContents {
    set {
        stamper.RotateContents = value;
    }
    get {
        return stamper.RotateContents;
    }
} 

(评论是Javadoc评论最初与此属性的单独getter和setter关联。因此,这个双重评论。)

因此,我建议将RotateContent设置为false