[{"data":1,"prerenderedAt":544},["ShallowReactive",2],{"project-33646951":3},{"id":4,"name":5,"line":6,"line_source":7,"title":8,"url":9,"domain":10,"maker":11,"posted_at":12,"year":13,"points":14,"comments":15,"rank_in_year":16,"shown_in_year":17,"top":18,"tier":19,"category":20,"subcategory":21,"format":22,"keywords":23,"reception":28,"sentiment":29,"stance_mix":30,"scored_comments":34,"aspects":35,"strip":40,"post_text":43,"what":44,"said":64,"maker_in_thread":140,"shape":142,"grid":147,"attempts":501,"same_week":506,"maker_shows":33,"maker_hidden":536,"reader_version":537,"card":538},"33646951","pdfsyntax","A new Python library to read\u002Fwrite PDF files","title","Show HN: I am building a new Python library to read\u002Fwrite PDF files","https:\u002F\u002Fgithub.com\u002Fdesgeeko\u002Fpdfsyntax","github.com","desgeeko",1668724707,2022,279,121,156,2570,7,"legend","languages","pdf library","library",[24,25,26,27],"python pdf library","pdf parser","pdf incremental update","read write pdf","curious",0.222,{"positive":18,"neutral":31,"mixed":32,"critical":33},15,0,2,24,{"execution":36,"idea":38,"docs":39},{"positive":32,"critical":37},1,{"positive":33,"critical":37},{"positive":32,"critical":32},[41,41,41,41,41,41,41,42,32,32,32,42,32,32,32,32,37,41,32,41,32,32,32,42,32,32,41,41,41,42,32,32,32,32,32,32,32,32,32,42],3,5,"Hi HN!\nThis is my pet project, written from scratch because there is so much to discover and learn in the process. The focus is on simplicity and incremental updates.\nProgress is slow because I do not have much spare time to work on this, but I would love to hear some feedback.\nRegards",{"problem":45,"audience":51,"pricing":51,"motivation":52,"time_to_build":51,"stack":56,"openness":61,"stage":62,"team_size":63},{"value":46,"source":47,"evidence":48},"Reading and writing PDF files from Python, with access to internal structure","maker",[49],{"id":50},"post",null,{"value":53,"source":47,"evidence":54},"Pet project written from scratch to learn the format",[55],{"id":50},[57],{"value":58,"source":47,"evidence":59},"Python",[60],{"id":50},"open_source","prototype","solo",{"praise":65,"objections":74,"requests":90,"questions":105,"alternatives":113},[66],{"value":67,"source":68,"evidence":69},"Good to see focus on internal structure and browsing of PDF syntax","commenter",[70],{"id":71,"by":72,"text":73},"33649751","svat","This is really wonderful, thank you! It's great to see someone focusing on the internal structure of PDF files (the \"Syntax\" chapter of the spec), and doing things with a focus…",[75],{"value":76,"source":68,"evidence":77},"PDF is very ambiguous and malformed files are common; parsers disagree",[78,82,86],{"id":79,"by":80,"text":81},"33654197","ESultanik","Be careful with PDF! There are many ambiguities in the specification that are implemented differently between parsers, as well as implicitly accepted malformations that almost…",{"id":83,"by":84,"text":85},"33661682","gettalong","As others have already written, there are many slightly invalid PDF files out there in the wild that many readers can display mostly fine and which your library should also be…",{"id":87,"by":88,"text":89},"33649120","layer8","1. PDF is mostly designed as a write-only (or render-only) format. PDF’s original purpose was as a device-independent page output language for printers, because PostScript…",[91,98],{"value":92,"source":68,"evidence":93},"Better README explaining the project's value",[94],{"id":95,"by":96,"text":97},"33652228","Silencerxyz","Hey, I took a look at your GitHub Page and I'm wondering can you provide more information in the readme so I can understand the value of the product better.",{"value":99,"source":68,"evidence":100},"Ability to fill form fields in existing PDFs",[101],{"id":102,"by":103,"text":104},"33648064","neilv","Neat. Another use case for which you might want to think about a sample is extracting data from filled PDF forms. (That use case is why I once had to write a PDF parser.) Since…",[106],{"value":107,"source":68,"evidence":108},"Can the text be edited directly?",[109],{"id":110,"by":111,"text":112},"33652870","yupis","Is it possible to directly edit the text?",[114,121,128,136],{"value":115,"source":68,"evidence":116},"PyPDF2 and reportlab",[117],{"id":118,"by":119,"text":120},"33648791","programmarchy","I’ve done a bit of PDF wrangling in Python, so figured I’d describe the lay of the land. PyPDF [1] is great for reading and writing PDF files, especially dealing with pages, but…",{"value":122,"source":68,"evidence":123},"MuPDF (fitz)",[124],{"id":125,"by":126,"text":127},"33649778","cochne","You’re in for it! I highly recommend checking out mupdf, it was one of the more pleasant Python libraries I dealt with for this purpose.",{"value":129,"source":68,"evidence":130},"pdfplumber and Camelot for tables",[131,132],{"id":118,"by":119,"text":120},{"id":133,"by":134,"text":135},"33656956","cafard","I had some luck with Camelot (https:\u002F\u002Fcamelot-py.readthedocs.io\u002Fen\u002Fmaster\u002F). However, as many of the comments here say, PDF is a beast.",{"value":137,"source":68,"evidence":138},"PolyFile",[139],{"id":79,"by":80,"text":81},{"comments":32,"answered":32,"key":141},[],{"commenters":143,"max_depth":144,"maker_replies":32,"first_comment_mins":145,"lifespan_hours":146},88,6,107,45,[148,150,154,157,160,164,166,170,173,177,180,182,185,187,188,191,195,198,201,204,208,211,214,218,220,222,225,228,231,234,237,240,243,246,250,254,258,260,263,267,269,271,273,276,279,281,283,285,288,291,296,300,304,307,310,313,316,318,321,324,327,330,333,336,339,343,346,349,352,354,357,361,364,367,369,372,375,377,379,382,385,387,391,395,397,399,402,406,409,411,414,418,422,424,426,430,433,436,439,442,445,447,449,452,454,456,458,460,463,465,467,470,473,475,478,481,483,486,487,490,492,496],[79,32,41,149,80,32],"maker\u002Fneutral\u002Fnone",[151,32,32,152,153,32],"33654288","other\u002Fneutral\u002Fnone","sdgluck",[155,32,32,152,156,32],"33654583","quirino",[158,32,32,152,159,32],"33657208","julian_t",[161,37,41,162,163,32],"33648113","project\u002Fneutral\u002Fexecution","mdaniel",[165,37,32,152,163,32],"33648173",[167,37,32,168,169,32],"33651162","commenter\u002Fneutral\u002Fnone","BiteCode_dev",[171,37,32,168,172,32],"33652836","lordgrenville",[174,37,41,175,176,32],"33652551","maker\u002Fneutral\u002Fexecution","fgeiger",[178,37,32,168,179,32],"33653833","jonnycomputer",[71,33,42,181,72,32],"project\u002Fpositive\u002Fidea",[183,33,37,184,163,32],"33658397","project\u002Fcritical\u002Fexecution",[186,33,41,149,72,32],"33659355",[118,41,32,152,119,32],[189,41,32,152,190,32],"33649755","missblit",[192,41,32,193,194,32],"33655842","other\u002Fneutral\u002Fperformance","pronik",[196,41,32,168,197,32],"33650475","lhuser123",[83,199,41,200,84,32],4,"maker\u002Fneutral\u002Fdocs",[202,199,32,203,163,32],"33663345","other\u002Fneutral\u002Fdocs",[205,42,41,206,207,32],"33653505","project\u002Fneutral\u002Fnone","Eatcats",[209,42,32,152,210,32],"33653586","mkl",[212,42,32,152,213,32],"33655289","Terretta",[215,144,42,216,217,32],"33649333","maker\u002Fpositive\u002Fnone","UglyToad",[219,144,32,152,163,32],"33649708",[221,144,32,168,217,32],"33656559",[223,18,32,152,224,32],"33649845","99112000",[226,18,32,152,227,32],"33650047","daemoens",[229,18,32,152,230,32],"33650278","chrisdbanks",[232,18,32,152,233,32],"33650503","coupdejarnac",[235,18,32,152,236,32],"33651284","thejosh",[238,18,32,152,239,32],"33652324","andylynch",[241,18,32,152,242,32],"33652528","forinti",[244,18,32,152,245,32],"33673385","pbhjpbhj",[247,248,42,181,249,32],"33651554",8,"jl6",[251,248,41,252,253,32],"33654190","project\u002Fneutral\u002Fidea","dagw",[255,256,32,152,257,32],"33648045",9,"password4321",[259,256,32,152,163,32],"33648242",[261,256,32,152,262,32],"33648732","macintux",[264,256,32,265,266,32],"33648281","other\u002Fneutral\u002Fpricing","criddell",[268,256,32,152,194,32],"33655788",[270,256,32,152,266,32],"33656356",[272,256,32,152,194,32],"33673886",[274,256,32,152,275,32],"33651650","e12e",[277,256,32,152,278,32],"33653193","2rsf",[280,256,32,152,257,32],"33663872",[282,256,32,152,275,32],"33664881",[284,256,32,152,163,32],"33672435",[286,256,32,152,287,32],"33652568","stuaxo",[289,256,32,152,290,32],"33666498","g8oz",[292,293,37,294,295,32],"33651868",10,"project\u002Fcritical\u002Fidea","truemotive",[297,298,41,149,299,32],"33650578",11,"strangus",[301,302,41,252,303,32],"33648952",12,"scoofy",[305,302,32,306,88,32],"33649021","commenter\u002Fneutral\u002Fdocs",[308,302,32,306,309,32],"33649041","jchw",[311,302,32,152,312,32],"33649484","viraptor",[314,302,32,168,315,32],"33650703","manv1",[317,302,32,168,309,32],"33650913",[319,302,32,168,320,32],"33650930","naniwaduni",[322,302,32,152,323,32],"33651144","phonon",[325,302,32,152,326,32],"33652680","bobince",[102,328,41,329,103,32],13,"maker\u002Fneutral\u002Fidea",[331,328,32,152,332,32],"33648211","Helmut10001",[334,328,32,152,335,32],"33662692","poxrud",[337,328,32,338,163,32],"33663527","other\u002Fneutral\u002Fidea",[340,341,32,152,342,32],"33653019",14,"RantyDave",[344,341,32,152,345,32],"33658853","ehutch79",[347,31,32,152,348,32],"33652174","larsonnn",[350,31,32,152,351,32],"33652584","nomel",[353,31,32,152,210,32],"33653619",[355,31,32,152,356,32],"33653900","IshKebab",[358,359,42,216,360,32],"33648102",16,"Spivak",[362,359,32,152,363,32],"33648199","notacop31337",[365,359,32,152,366,32],"33648249","jeremynixon",[368,359,32,152,363,32],"33648471",[370,359,32,152,371,32],"33648558","999900000999",[373,359,32,152,374,32],"33648814","mythrwy",[376,359,32,152,371,32],"33662493",[378,359,32,152,315,32],"33650779",[380,359,32,168,381,32],"33652769","hanche",[383,359,32,152,384,32],"33653561","jjgreen",[133,386,32,152,134,32],17,[388,389,41,149,390,32],"33652860",18,"elmcrest",[392,393,32,152,394,32],"33648195",19,"tmaly",[95,396,41,200,96,32],20,[125,398,32,152,126,32],21,[400,398,32,152,401,32],"33658566","cgdae",[403,404,41,149,405,32],"33650133",22,"pyuser583",[407,404,32,168,408,32],"33651046","meitham",[110,410,41,206,111,32],23,[412,34,42,216,413,32],"33649525","voz_",[415,416,42,216,417,32],"33648059",25,"jonathansa",[419,420,32,152,421,32],"33648511",26,"chazeon",[423,420,32,152,374,32],"33648844",[425,420,32,168,163,32],"33649722",[427,420,32,428,429,32],"33653840","other\u002Fpositive\u002Fnone","contentboot",[431,432,32,152,366,32],"33648231",27,[434,432,32,152,435,32],"33648387","newsclues",[437,432,32,152,438,32],"33648730","jahewson",[440,432,32,152,441,32],"33649107","copperbrick25",[443,432,32,152,444,32],"33649358","userbinator",[446,432,32,168,163,32],"33658754",[448,432,32,152,262,32],"33648744",[450,432,32,152,451,32],"33648765","steampilot",[453,432,32,168,163,32],"33648828",[455,432,32,152,315,32],"33650791",[457,432,32,152,438,32],"33648571",[459,432,32,168,444,32],"33649303",[461,432,32,152,462,32],"33649411","joe_guy",[464,432,32,152,438,32],"33649606",[466,432,32,168,438,32],"33649602",[468,432,32,168,469,32],"33654449","jwilk",[471,432,32,152,472,32],"33654946","pwg",[474,432,32,168,469,32],"33655172",[476,432,32,152,477,32],"33648625","autotune",[479,432,32,152,480,32],"33649317","bmitc",[482,432,32,152,477,32],"33649374",[484,432,32,152,485,32],"33648771","dbrueck",[87,432,32,152,88,32],[488,432,32,152,489,32],"33649263","brailsafe",[491,432,32,152,444,32],"33649345",[493,494,41,149,495,32],"33650881",28,"sarahhenry",[497,498,42,499,500,32],"33650428",29,"project\u002Fpositive\u002Fnone","donqu1xote1",[502,505],{"id":503,"t":504,"points":386,"comments":33},"27869212",1626559700,{"id":4,"t":12,"points":14,"comments":15},[507,512,517,521,526,531],{"id":508,"name":509,"points":510,"category":511},"33693411","web-color-wheel",731,"creative",{"id":513,"name":514,"points":515,"category":516},"33718124","Rotaboxes",633,"games",{"id":518,"name":519,"points":520,"category":511},"33682813","Haxophone",526,{"id":522,"name":523,"points":524,"category":525},"33663486","freesubtitles.ai",224,"ai",{"id":527,"name":528,"points":529,"category":530},"33641036","Tweek Calendar",222,"productivity",{"id":532,"name":533,"points":534,"category":535},"33722494","HandleFinder",219,"security_privacy",false,"v2",{"id":539,"name":5,"line":6,"ai":536,"cat":20,"year":13,"points":14,"comments":15,"rec":28,"s":540,"top":18,"kw":541,"maker":11,"domain":10,"tier":19,"attempts":33,"strip":542,"url":9,"mix":543,"praise":67,"objection":76,"sub":21},33646951,0.22,[24,25,26,27],"3333333500050000130300050033350000000005",[18,31,32,33],1794036627451]