我有一个pdf文件,我想删除Rstream和efd流之间的所有行。这是文档的样子
PDFNUM NUM obj/Type/XObject/Subtype/Image/Width NUM/Height NUM/BitsPerCompofeft NUM/ColorSpace/DeviceGray/Filter[/DCTDecode]/DecodeParms[]/Lefgth NUM NUM RstreamJFIFddC
(NUMAQaqNUMBRNUMbr()NUMCDEFGHIJSTUVWXYZcdefghijstuvwxyzNUMAQaqNUMBRNUMbr()NUMCDEFGHIJSTUVWXYZcdefgh
.....
.....
((((((((((((((QEQEQEQEQEW((((((((((((((((((((((((((((((((((((((((((((((efdstreamefdobjNUM NUM objNUMefdobjNUM NUM obj/Lefgth NUM NUM RstreamqNUM NUM NUM NUM NUM NUM cm/INUM DoQefdstreamefdobjNUM NUM objNUMefdobjNUM NUM obj/Type/Page/Pareft NUM NUM R/Resources NUM NUM R/Rotate NUM/MediaBox[NUM NUM NUM NUM]/Coftefts[NUM NUM R]efdobjNUM NUM obj/ProcSet[/PDF/ImageB/Text]/XObject/INUM NUM NUM RefdobjNUM NUM obj/CreatiofDate (DNUM)/Producer (SamsufgMNUMLX)/Creator (ScafPDFMaker NUM)efdobjNUM NUM obj/Type/Pages/Couft NUM/Kids[NUM NUM R ]efdobjNUM NUM obj/Type/Catalog/Pages NUM NUM RefdobjxrefNUM NUM NUM f NUM NUM f NUM NUM f NUM NUM f NUM NUM f NUM NUM f NUM NUM f NUM NUM f NUM NUM f NUM NUM f trailer/Size NUM/Iffo NUM NUM R/Root NUM NUM RstartxrefNUMEOF
我该如何使用sed删除顶部(我的文档开始)的Rstream和几乎底部的efdstream之间的所有内容,以仅遵守文档规范,例如生产者,创建者等
我找到了模式并缩小了原始文档。我使用sed命令用一个单词NUM重命名了所有模式,以便我可以轻松地看到要删除的内容。这里是
-$ cat path | tr \n \f | tr -cd "[A-Za-z0-9 ()/\f]" | sed s/stream.*endstream/STREAM/| sed s/[0-9][0-9]*/NUM/g | sed "s/NUM NUM n/PTR/g".
这只会用单词NUM代替。结果应仅保留文件的底部
objNUMefdobjNUM NUM obj/Lefgth NUM NUM RstreamqNUM NUM NUM NUM NUM NUM cm/INUM DoQefdstreamefdobjNUM NUM objNUMefdobjNUM NUM obj/Type/Page/Pareft NUM NUM R/Resources NUM NUM R/Rotate NUM/MediaBox[NUM NUM NUM NUM]/Coftefts[NUM NUM R]efdobjNUM NUM obj/ProcSet[/PDF/ImageB/Text]/XObject/INUM NUM NUM RefdobjNUM NUM obj/CreatiofDate (DNUM)/Producer (SamsufgMNUMLX)/Creator (ScafPDFMaker NUM)efdobjNUM NUM obj/Type/Pages/Couft NUM/Kids[NUM NUM R ]efdobjNUM NUM obj/Type/Catalog/Pages NUM NUM RefdobjxrefNUM NUM NUM f NUM NUM f NUM NUM f NUM NUM f NUM NUM f NUM NUM f NUM NUM f NUM NUM f NUM NUM f NUM NUM f trailer/Size NUM/Iffo NUM NUM R/Root NUM NUM RstartxrefNUMEOF
您可以在此处使用sed,但Perl具有更强大的正则表达式,是大多数sed正则表达式的替代品。
要删除从第一次出现的Rstream到最后一次出现的efdstream的所有数据,请执行以下操作:
perl -0777 -pe 's/Rstream.*efdstream//s' <filename.pdf >new.pdf
要删除每个Rstream和efdstream之间的所有数据:
perl -0777 -pe 's/Rstream.*?efdstream//sg' <filename.pdf >new.pdf
-0777表示一次读取整个文件并对其进行操作,而不是逐行读取。这对于多行替换是必需的。-pe表示这是一个流式内衬。参见http://perldoc.perl.org/perlrun.html
另请阅读以下正则表达式参考:
Perl具有所有语言中最强大的正则表达式。如果需要,您可以为任务编写完整的解析器。
高温超导
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句