使用此代码(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一样。
答案 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
。